1. Си / Говнокод #4029

    +144

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 19 Августа 2010

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

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

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

                  А вообще, не сюда наверно тебе пока.
                  Ответить
            • http://c2p.ru/cpp/s-makkonnell-sovershennyj-kod.html

              Мне очень понравилось в свое время.
              Ответить
          • >переменные должны быть инициализированы при объявлении
            Лучше определять их ближе к месту использования.
            И тут же инициализировать.
            А лишнее присваивание - не лучший вариант.
            Скажем в Си я напишу:
            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);
        Ответить
        • Ошибаетесь.
          Ответить
        • Ошибаетесь(c)absolut
          С чего так подумал?
          Ответить
          • Почитай про си-строки и форматы вывода для printf.
            Ответить
            • Дак я-то не спорю, я принтф юзаю активненько и обожаю, я Вас процитировал и дополнил, спрашивал у kubynek.
              Ответить
        • Ога. А спецификатор %s по приколу стоит
          Ответить
          • показать все, что скрытоах блять...строка этоже массив символов...стоит %s значит ебашим весь массив, это же сраный Си
            Ответить
            • http://www.1c-bitrix.ru/upload/main/a3c/Untitled-1.jpg

              Женя Кубышин на пикрелейтед обдумывает "Концепцию интерфейса редактирования профайла для сайта brainity.ru" (с) http://kubyshin.ru/
              Ответить
              • показать все, что скрытоэто ты что ли большеноса делал?
                Ответить
              • показать все, что скрыточувак ты герой http://www.linux.org.ru/forum/development/4387601
                выдержка из его комента:
                Вы говорите что HTML невозможно программировать. По-моему вы просто жутко наелись конфет...

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

                  на чистом хтмл (путь даже +цсс) максимум что ты напишешь - набор страничек с картинками, текстом и выпадающими списки ссылкок...
                  при этом Каждая такая страничка и все её элементы -- Статичны: доступны Только для чтения (чтобы изменить что-либо, необходимо править "исходники" -- т.е. языком программирования ХТМЛ невозможно назвать)

                  или ВБСкрипт, ЖСкрипт, ЖаваСкрипт и сторонние объекты/аплеты к Возможностям хтмл?..
                  Ответить
                • мой язык тоже заводится из тесктового редактора
                  Ответить
    • показать все, что скрыточе за тупость....эта программа нихуя не будет работать
      Ответить
    • показать все, что скрытоВы что тут совсем ебанулись нах!
      Такую поебень писать..
      Ну ка нах съебались учиться студентики..
      Кто тут напишет тот пидорас!
      Кто поставит мне минус, тот яйцетряс!
      Ответить

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