LINUX.ORG.RU

Программа: удаление всех повторяющийхся цифр (и букв в слове). С [в доработке]

 ,


1

3

Упражнялся вчера с С и решил что-нибудь более или менее полезное написать для работы со строками символами, с исп. stdio. И вот такое получилось. Принимает один аргумент: Зачем может быть нужна?! Когда тебе твоя девушка пишет все время вот так: «даааааа, вооооот» = ) (но пока удаляет только ASCII - цифры и лат. алфавит. Только из слов без кавычек) и вообще делает символы в слове уникальными, типа на входе «good», на выходе «god» или на входе «pool», на выходе «pol»

Тема отредактирована. См. комментарии ниже. Решение внизу

//This small prorgam removes all duplicated characters out of a word
//Программа удаляет все повторяющиеся символы из слова
//Author dcc0@yandex.ru 2018.

#include <stdio.h>
int main(int argc, char* argv[]) {
  //here we check arguments//проверяем аргументы
  if (argc < 2) {
    printf("Argument must be a word:\n");
    return 0;
  }

  int x, i, j;
  //it calculates an array's length
  //вычисляем длину слова и печатаем
  for (x = 0; argv[1][x] != '\0'; x++);
  printf ("Original length: %d\n", x);
  x=x+1;
  //here we search twins
  //ищем одинаковых
  for (i = 0; i != x; i++) {
    j = i + 1;
    while (j != x) {
      if (argv[1][i] == argv[1][j]) {
        argv[1][i] = '0';
      }
      j++;
    }
  }
j=0;
  //Output
  //Вывод
  for (i = 0; i != x; i++) {
    if (argv[1][i] != '0') {
      printf ("%c", argv[1][i]);
      j++;
    }
  }
  printf ("\nNumber of uniqe symbols: %d\n", j-1);
}

P.S. Форматирование поправил. Лишний блок из кода убрал. Комментарии на русском есть. P.P.S Ну вот еще подсократилось. «Динамическое вычисление длины массива убрали. В принципе можно и вычисление x убрать.

P.P.P.S Теперь и такую строку вроде правильно обрабатывает: „teeest teeestt tteeessstt“ Original length: 25 est Number of uniqe symbols: 4 Осталось сделать транслит функцию.



Последнее исправление: AnonymUser (всего исправлений: 27)
Ответ на: комментарий от vodz

Ну я думаю, что прежде чем рассуждать об оптимизациях и реальности - надо синхронизировать свои представления с реальностью. Ваши представления никакого отношения к реально не имеют.

Если у вас такие очевидные вещи вызывают удивления, то рассинхронизация очень велика.

LjubaSherif
()
Ответ на: комментарий от LjubaSherif

О, узнаю лор. Напишут чушь, получат в общем то вполне доброжелательную поправку, но как же, уязвленное раздутое самолюбие согласиться никак не может и давай по методу Геббельса генерировать полный бред без единого технического обоснования в надежде, что и так прокатит как обычно тут бывает.

Мой код абсолютно идентичен вашему, только не делает присваивания.

Впрочем, уже всё равно, делать мне чтоли нечего, как спорить с пустопорожним бредом...

vodz ★★★★★
()

Правда, не знаю пока, что делать с ситуацией, когда строчка будет такой: «когда я был в Африке, то видео каал».

AnonymUser
() автор топика
Ответ на: комментарий от LjubaSherif

«Это не си. Целиком и полностью.» Вот эту строчку можно объяснить?

AnonymUser
() автор топика
Ответ на: комментарий от anonymous

Блевать ты, видимо, начал до того, как дочитал до

на локалхосте

? Зачем? Чтобы в перспективе стать веб-макакой.

А какой, кстати, смысл в программе ТС? Познать всю боль сишных «строк»?

Virtuos86 ★★★★★
()
Ответ на: комментарий от vodz

Пометь себе где-нибудь, что это очередная инкарнация царя сишки на ЛОР'е и не задавайся больше вопросами об адекватности.

Virtuos86 ★★★★★
()

Юниксвейный вариант:

#include <stdio.h>

int main() {
	char currentChar, previousChar = 0;
	while((currentChar = getchar()) != EOF)
		if(currentChar != previousChar)
			putchar(previousChar = currentChar);
	return 0;
}

Ты бы и сам мог прийти к такому решению, если бы пересмотрел формулировку задачи. У тебя в коде нет _слов_ - ты работаешь с потоком символов, соответственно необходимости в буферизации нет.

driver
()
Ответ на: комментарий от driver

previousChar = 0

Поменяйте на EOF. 0 - валидный в общем виде символ.

ты работаешь с потоком символов, соответственно необходимости в буферизации нет.

Ну stdio по умолчанию — буферизует. А делать ли свои буферы для слов может действительно понадобится, чтобы отличать прилагательные с двумя 'н' от причастий :)

vodz ★★★★★
()
Ответ на: комментарий от vodz

Поменяйте на EOF. 0 - валидный в общем виде символ.

Да, вы правы, в данном случае только EOF считается контрольным.

Ну stdio по умолчанию — буферизует. А делать ли свои буферы для слов может действительно понадобится, чтобы отличать прилагательные с двумя 'н' от причастий :)

ТС на самом деле замахнулся на довольно нетривиальную задачу: токенизация, приведение к инфинитиву, поиск по словарю, перевод с транслита и т.д.

driver
()
Ответ на: комментарий от Virtuos86

Какой то вялый царь. А где простыни шизофазии на 10 страниц? Замордовали совсем царя эти ваши санитарымодераторы.

bread
()
Ответ на: комментарий от driver

Тут как бы точно сказать - это, сие, может быть для разных целей использовано.

Да, поскольку все (связанное с программированием) быстро вылетает из головы (по крайней мере моей). Да, я написал не на С. LjubaSherif, точно там же был malloc Я вообще забыл сочетание «динамическое выделение памяти», но я знал про это когда-то : ) честно А ведь там же еще и освобождать надо память. И да. Эх. Ведь факт, о котором я не подумал. Фактически я и не могу писать на с89 даже если бы его знал в достаточной мере.

Вообще в русском самое длинное слово букв так 30 Поэтому можно и жестко задать размер строки, чтобы было похоже на настоящий С.

AnonymUser
() автор топика
Ответ на: комментарий от AnonymUser

Фактически я и не могу писать на с89 даже если бы его знал в достаточной мере.

Ты можешь использовать не динамическое значение длинны массива. char[30], либо сколько угодно. Это будет с89.

А вообще, зачем своё мышление ограничивать протухшым непотребством? Ладно бы ты по какой-то объективной причине страдал, а так.

LjubaSherif
()
Ответ на: комментарий от LjubaSherif

Да я и это убрал. Вроде все чистенько теперь. Мой перфекционизм удовлетворен. Мое самолюбие сильно не пострадало. Лор стал гуманным = )

Пойду писать сопрограмму.

AnonymUser
() автор топика
Ответ на: комментарий от AnonymUser

Дальше набранное и конвертированное слово отправляем прямо по IP на опр. порт На обратной стороне просто сохраняем файл и читаем. Набираем такое же по одному символу и также отправляем. Вот так.

AnonymUser
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.