Няшная / Говнокод #4029 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
#include <stdio.h>

main()
{
    char old[1000];
    char new[1000];
    int i;                      /*счетчик цикла длинны массива */
    int z;                      /*счетчик нового массива */
    int l;                      /*длинна массива */
    int c;                      /*член массива */
    l = 0;
    z = 0;

    printf
        ("программа удаления повторяющихся символов\n");
    printf
        ("введите последовательности символов, из которых нужно удалить повторяющиеся, по окончании вводна нажмите Ctrl+D \n");


    while ((c = getchar()) != EOF) {
        old[l] = c;
        l++;
    }
    old[l] = 0;

    printf
        ("Введите символ, который нужно удадить как повторяющийся\n");
    c = getchar();


    for (i = 0; i < l; i++) {

        if (old[i] != c) {
            new[z] = old[i];
            z++;
        } else if (old[i] == c && old[i + 1] != c) {    /*один символ из повторяющихся */
            new[z] = old[i];
            z++;
        }

    }
    new[z] = 0;
    printf("%s\n", new);
    printf("*end");
}

Сорри за флуд, но тут форматирование полутше.

Запостил: killer1804 killer1804, (Updated )

Комментарии (58) RSS

  • Парень, если ты не будешь инициализировать переменные при объявлении, не дай бг тебе со мной встретиться. То есть int i; писать нельзя. Даже если начального значения нет пиши int i = 0;.
    new -- это ключевое слово в ++, не используй в названиях.

    И задание какое-то странное...
    Ответить
      • Я тебе говорю, что похуй где оно присваивается потом, переменные должны быть инициализированы при объявлении. Культура кода + защита от граблей.
        Как видишь, оно всё равно подсветилось. И код на C должен компилироваться в C++.
        Ответить
        • До культуры кода мне пока далеко 🙂
          Но если даш ссылку на ресурс где эта "культура кода" описывается - я буду благодарен конечно.
          Конкретно в привиденных (по ссылке что я дал) примерах нет "инициализации при объявлении", может позже будет - я пока что простые примеры разбираю.
          Ответить
            • Ничему разумеется, пока "кто-то" не присвоет этой переменной значение.
              Это было бы страшно, еслии бы I было бы счетчиком и увеличивалось посредстом i++ - если где-то раньше не написать i=0; то увеличения счетчика не произойдет.
              Тут же - имеет место быть цикл for.
              Это что касается присвоения.
              А что касается инициализации - мне пока не ясно, если честно 🙂 - я ж тока начал СИ изучать 🙂
              ЗЫ: за ссылку спасибо - потом гляну на досуге.
              Ответить
              • Присвоение и есть инициализация.
                >> если где-то раньше не написать i=0; то увеличения счетчика не произойдет
                Произойдет ошибка (если компилятор не отругает). Переменная всегда равна чему-то, а если не присвоишь не сможешь даже догадаться, чему.

                А вообще, не сюда наверно тебе пока.
                Ответить
        • >переменные должны быть инициализированы при объявлении
          Лучше определять их ближе к месту использования.
          И тут же инициализировать.
          А лишнее присваивание - не лучший вариант.
          Скажем в Си я напишу:
          int i;
          for( i=0;i<N;++i)
          , но никогда
          int i=0;
          for( i=0;i<N;++i)

          >И код на C должен компилироваться в C++.
          В общем случае - не должен.
          Ответить
          • При объявлении в стеке ничего не присваивается? То есть я могу сделать int[100500] и почитать что тут раньше было?
            Или в плюсах только такое появилось? Насколько я знаю, присваивание при объявлении всего лишь указывает, чем заполнять (на подобие аргумента конструктора). Не?
            > Лучше определять их ближе к месту использования.
            Спорный вопрос. Имхо лучше пусть код читабельный будет (типа иногда в порядки проще смотрится, когда переменные в начале, например, функции объявлены (ну в той же области видимости понятно)).

            > но никогда
            > int i=0;
            > for( i=0
            Я ебанутый чтоли?)) Конечно не надо так делать, бред же. Я про то, что я бы написал
            for (int i=0;i<N;++i)
            либо
            int i = 0;
            for(;i<N;++i)
            но болтаться int i; непонятно с чем я бы не стал.

            > В общем случае - не должен.
            Подумал и согласился.
            Ответить
            • > То есть я могу сделать int[100500] и почитать что тут раньше было?
              Конечно
              > for (int i=0;i<N;++i)
              В классических сях так нельзя
              >int i = 0;
              >for(;i<N;++i)
              Теряется связь с инициализатром цикла
              Ответить
              • Вот разницу в стандартах сей я знать даже не хочу)
                А вот это
                >> Теряется связь с инициализатром цикла
                я не понял. Логически чтоли или так тоже нельзя?
                Ответить
                • > Логически чтоли или так тоже нельзя?
                  Логически. Писать можно как угодно, хоть for(;;)
                  Ответить
                • можно написать:
                  int i =0;
                  for (; i < n ;) {
                     /*code*/
                     i++;
                  }

                  но тогда зачем использовать цикл for
                  если он используется как цикл while:
                  int i =0;
                  while (i < n) {
                     /*code*/
                     i++;
                  }
                  Ответить
  • на самом деле тут не нужно два буфера
    если учишься СИ, попробуй оптимальней переписать эту программу:
    вместо второго буффера заведи переменную сдвига (int shift = 0;)
    сивмол копируется на итое минус сдвиг место, при встрече символа повтора сдвиг инкрементируется
    Ответить
    • это прекрасно, но процесс обучения должен проходить постепенно:
      - сначала решается задача "влоб" (без какой либо оптимизации или мысли о том как оно там будет выполнятся)
      - потом уже объясняется как оно выполняется, что такое память, и способы оптимизации -- задача решается чуть более оптимальным путём...

      еси с самого первого урока учить всем тонкостям - у человечка забьётся стек мыслями: почему так? что это такое? как оно так?..
      и сработает механизм защиты от переполнения: который будет блокировать всю поступающую информацию...
      и у человека сложится впечатление: "этот язык - это просто писдец какой-то... нуивонах, лучше буду ПХП учить..."
      Ответить
      • Так должен происходить процесс не только обучения, но и написания в принципе (ну, до каких-то пределов, ясное дело)) ).
        Ответить
  • че минусуете? годный ГК!

    есть ошибка связанная с переполнением:
    const int ARRAY_SIZE = 10000;
    
    while (l < ARRAY_SIZE && (c = getchar()) != EOF)  {
            old[l] = c;
            l++;
    }


    когда i == ARRAY_SIZE - 1 и old[i] == c, будет обращение за пределы массива
    for (i = 0; i < l; i++) {
            if (old[i] != c) {
                new[z] = old[i];
                z++;
            } 
    /* в в ветке else if уже old[i] == c */
           else if (/* old[i] == c */ i < ARRAY_SIZE - 1 && old[i + 1] != c) {   
                new[z] = old[i];
                z++;
            }
        }
    Ответить
    • Чето я седня вялый и добрый. Надо входить в рабочее настроение. Приступаю.
      Пашолты!!11
      Ответить
    • я ошибаюсь или нет...здесь вроде выведется только первый элемент из массива printf("%s\n", new);
      Ответить
        • дак, мы же обращаемся к адресу его первой ячейки массив и в данном случае выведется только первый элемент массива. В цикле надо массивы выводить
          Ответить
          • Дак я-то не спорю, я принтф юзаю активненько и обожаю, я Вас процитировал и дополнил, спрашивал у kubynek.
            Ответить
        • ах блять...строка этоже массив символов...стоит %s значит ебашим весь массив, это же сраный Си
          Ответить
            • чувак ты герой http://www.linux.org.ru/forum/development/4387601
              выдержка из его комента:
              Вы говорите что HTML невозможно программировать. По-моему вы просто жутко наелись конфет...

              Этот язык заводится из простого текстового редактора и для его исполнения нужен только веб-браузер, к вашему сведению сидя на Windows я писал в блокноте копию рабочего стола (писал например в функцию кнопки пуск т.е. ее смена на более светлую картинку и обратно, так же меню картиночное высвечивалось и прочее) Язык вполне удобный, но его не совершенство это мину
              Ответить
  • че за тупость....эта программа нихуя не будет работать
    Ответить
  • Вы что тут совсем ебанулись нах!
    Такую поебень писать..
    Ну ка нах съебались учиться студентики..
    Кто тут напишет тот пидорас!
    Кто поставит мне минус, тот яйцетряс!
    Ответить

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8