Автор Тема: Язык программирования С  (Прочитано 4881 раз)

Оффлайн LanuHum

  • Житель
Язык программирования С
« : 05 Декабрь 2015, 14:05:37 »
Как мне свойственно, начну с негатива.
Советуют: "Учи С!"
А, как его учить?
Вот, будучи знакомым уже с Python, взялся разобраться с этим чудом С.
http://cpp.com.ru/kr_cbook/ch1kr.html#p16
Примеры не работают. Кто их пишет и нах, если они не работают?
Код
#include <stdio.h>

/* подсчет вводимых символов; 1-я версия */
main()
{
    long nc;
    nc = 0;

    while (getchar() != EOF)
        ++nc;
    printf(“%ld\n”, nc);
}
Не работает.
Код
#include <stdio.h>

/* подсчет цифр, символов-разделителей и прочих символов */
main()
{
    int с, i, nwhite, nother;
    int ndigit[10];

    nwhite = nother = 0;
    for (i = 0; i < 10, ++i)
        ndigit[i]= 0;

    while ((c = getchar()) != EOF)
        if (c >='0' && с <= '9')
            ++ndigit[c – '0'];
        else if (c == ' ' || c == '\n' || c == '\t')
            ++nwhite;
        else
            ++nother;

    printf("цифры =");
    for (i = 0; i < 10; ++i)
        printf("%d", ndigit[i]);
    printf(", символы-разделители =%d, прочие =%d\n", nwhite, nother);
}
Не работает. 25 строчек кода - 3 ошибки
Код
lesson_1.c:15:13: ошибка: в программе обнаружен некорректный символ «\200»
lesson_1.c:15:13: ошибка: в программе обнаружен некорректный символ «\223»
lesson_1.c:15:28: ошибка: expected «]» before '0'
             ++ndigit[c – '0'];
Подскажите мне, пожалуйста,где найти курс, в котором все примеры работают.

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Re: Язык программирования С
« Ответ #1 : 05 Декабрь 2015, 14:31:29 »
Цитировать
Вот, будучи знакомым уже с Python, взялся разобраться с этим чудом С.
Ох, вряд-ли это приведёт к чему-то хорошему...

Когда я 12 лет назад познакомился с Питоном, я забросил С++ как страшный сон, и с тех пор он мне не был нужен. С не такой кривой, как С++, но сложностей в нём тоже хватает.
С тех пор я так или иначе изучал Java, Sheme, D (D - классный язык, леплю на нём иногда по-мелочи), но вот к С возвращаться не хочется.

Цитировать
/* подсчет вводимых символов; 1-я версия */
Скачал компилятор, скомпилил, вот вывод программы:
Код
D:\moe\prg\98-dmc>proba02
сысыфс
7
^C
D:\moe\prg\98-dmc>proba02 < aaa.txt
13
т.е. у меня программа работает.
« Последнее редактирование: 05 Декабрь 2015, 14:36:32 от Striver »

Оффлайн LanuHum

  • Житель
Re: Язык программирования С
« Ответ #2 : 05 Декабрь 2015, 14:36:06 »
Цитировать
Вот, будучи знакомым уже с Python, взялся разобраться с этим чудом С.
Ох, вряд-ли это приведёт к чему-то хорошему...

Когда я 12 лет назад познакомился с Питоном, я забросил С++ как страшный сон, и с тех пор он мне не был нужен. С не такой кривой, как С++, но сложностей в нём тоже хватает.

Цитировать
/* подсчет вводимых символов; 1-я версия */
Скачал компилятор, скомпилил, вот вывод программы:
Код
D:\moe\prg\98-dmc>proba02
сысыфс
7
^C
D:\moe\prg\98-dmc>proba02 < aaa.txt
13
т.е. у меня программа работает.
Дело ни в том, какой язык хорош для использования. Дело в том, что нужно научиться читать уже написанное разработчиками Блендера.
Так, у тебя работает, почему не работает тогда у меня? Потому что линукс? Где искать различия написания кода на С для разных осей?

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Re: Язык программирования С
« Ответ #3 : 05 Декабрь 2015, 14:40:09 »
Цитировать
Так, у тебя работает, почему не работает тогда у меня?
Вывод программы сюда скопируй.

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

Оффлайн LanuHum

  • Житель
Re: Язык программирования С
« Ответ #4 : 05 Декабрь 2015, 14:42:09 »
Кстати, нашёл в интернете свой вопрос. У чела не получалось исполнить пример. Ему написали следующее:
Код
#include <stdio.h>
 
main()
{
int nc;
nc = 0;

while (getchar() != EOF)
{
++nc;
printf("%ld\n", nc);
}//без этой скобки в цикл входит только увеличение переменной nc, а функция printf
//выполнится только когда getchar() даст == -1;
}
Значит, проблема всё таки есть. Но, даже этот исправленный вариант даёт смутное представление.
Собираю этот код, запускаю, набираю текст, жму Enter
Код
фывук
1
2
3
4
5
6
7
8
9
10
11

Это что?

Оффлайн LanuHum

  • Житель
Re: Язык программирования С
« Ответ #5 : 05 Декабрь 2015, 14:51:15 »
Вот первый пример:
Код
#include <stdio.h>

/* подсчет вводимых символов; 1-я версия */
main()
{
    long nc;
    nc = 0;

    while (getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);
}
gcc -o "hellow" "hellow.c" (в каталоге: /home/leonid/C)
Сборка прошла успешно.

./hellow
Пишу в консоли:
sdfsfgdghfg
Жму Enter - ничего

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Re: Язык программирования С
« Ответ #6 : 05 Декабрь 2015, 14:54:15 »
Цитировать
Это что?
Вывод программы в каждой итерации цикла. Верни первый вариант программы.

По-моему, ты не понял другой момент:
Код
getchar() != EOF
этот самый EOF при вводе с клавиатуры случится только, если остановить программу. В винде через Ctrl-Pause, в линухе Ctrl-C.

Именно поэтому я направлял в программу текстовый файл:
Код
D:\moe\prg\98-dmc>proba02 < aaa.txt
В линуксе синтаксис направления ввода такой же, попробуй. В случае с файлом, EOF случится, когда файл закончится.

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Re: Язык программирования С
« Ответ #7 : 05 Декабрь 2015, 14:57:20 »
Цитировать
Жму Enter - ничего
Если нужно завершение цикла по Enter, замени строку
Код
getchar() != EOF
на
Код
getchar() != '\n'

Оффлайн LanuHum

  • Житель
Re: Язык программирования С
« Ответ #8 : 05 Декабрь 2015, 14:59:09 »
Цитировать
Это что?
Вывод программы в каждой итерации цикла. Верни первый вариант программы.

По-моему, ты не понял другой момент:
Код
getchar() != EOF
этот самый EOF при вводе с клавиатуры случится только, если остановить программу. В винде через Ctrl-Pause, в линухе Ctrl-C.

Именно поэтому я направлял в программу текстовый файл:
Код
D:\moe\prg\98-dmc>proba02 < aaa.txt
В линуксе синтаксис направления ввода такой же, попробуй. В случае с файлом, EOF случится, когда файл закончится.
Если я пишу asdafsdf, а затем жму Ctrl-C, то программа завершается. Где же результат подсчёта?

Оффлайн LanuHum

  • Житель
Re: Язык программирования С
« Ответ #9 : 05 Декабрь 2015, 15:06:51 »
Цитировать
Именно поэтому я направлял в программу текстовый файл:
Striver, спасибо, сообразил я.
[leonid@localhost C]$ ./hellow < test.txt
5

А, что со вторым примером?
« Последнее редактирование: 05 Декабрь 2015, 15:10:15 от LanuHum »

Оффлайн LanuHum

  • Житель
Re: Язык программирования С
« Ответ #10 : 05 Декабрь 2015, 15:14:19 »
Код
#include <stdio.h>

/* подсчет цифр, символов-разделителей и прочих символов */
main()
{
    int с, i, nwhite, nother;
    int ndigit[10];

    nwhite = nother = 0;
    for (i = 0; i < 10, ++i)
        ndigit[i]= 0;

    while ((c = getchar()) != EOF)
        if (c >='0' && с <= '9')
            ++ndigit[c – '0'];
        else if (c == ' ' || c == '\n' || c == '\t')
            ++nwhite;
        else
            ++nother;

    printf("цифры =");
    for (i = 0; i < 10; ++i)
        printf("%d", ndigit[i]);
    printf(", символы-разделители =%d, прочие =%d\n", nwhite, nother);
}


Консоль:
Код
[leonid@localhost C]$ gcc -o lesson_1 lesson_1.c
lesson_1.c: В функции «main»:
lesson_1.c:6:5: ошибка: в программе обнаружен некорректный символ «\321»
     int с, i, nwhite, nother;
     ^
lesson_1.c:6:5: ошибка: в программе обнаружен некорректный символ «\201»
lesson_1.c:6:11: ошибка: expected identifier or «(» before «,» token
     int с, i, nwhite, nother;
           ^
lesson_1.c:9:5: ошибка: «nwhite» undeclared (first use in this function)
     nwhite = nother = 0;
     ^
lesson_1.c:9:5: замечание: each undeclared identifier is reported only once for each function it appears in
lesson_1.c:9:14: ошибка: «nother» undeclared (first use in this function)
     nwhite = nother = 0;
              ^
lesson_1.c:10:10: ошибка: «i» undeclared (first use in this function)
     for (i = 0; i < 10, ++i)
          ^
lesson_1.c:10:28: ошибка: expected «;» before «)» token
     for (i = 0; i < 10, ++i)
                            ^
lesson_1.c:13:13: ошибка: «c» undeclared (first use in this function)
     while ((c = getchar()) != EOF)
             ^
lesson_1.c:14:9: ошибка: в программе обнаружен некорректный символ «\321»
         if (c >='0' && с <= '9')
         ^
lesson_1.c:14:9: ошибка: в программе обнаружен некорректный символ «\201»
lesson_1.c:14:27: ошибка: expected expression before «<=» token
         if (c >='0' && с <= '9')
                           ^
lesson_1.c:15:13: ошибка: в программе обнаружен некорректный символ «\342»
             ++ndigit[c – '0'];
             ^
lesson_1.c:15:13: ошибка: в программе обнаружен некорректный символ «\200»
lesson_1.c:15:13: ошибка: в программе обнаружен некорректный символ «\223»
lesson_1.c:15:28: ошибка: expected «]» before '0'
             ++ndigit[c – '0'];
                            ^
[leonid@localhost C]$


Оффлайн LanuHum

  • Житель
Re: Язык программирования С
« Ответ #11 : 05 Декабрь 2015, 15:37:09 »
Ага, копировать из html код нельзя.
Код
#include <stdio.h>

/* подсчет цифр, символов-разделителей и прочих символов */
main()
{
    int c, i, nwhite, nother;
    int ndigit[10];

    nwhite = nother = 0;
    for (i = 0; i < 10, ++i;)
        ndigit[i] = 0;

    while ((c = getchar()) != EOF)
        if (c >='0' && c <= '9')
            ++ndigit[c - '0'];
        else if (c == ' ' || c == '\n' || c == '\t')
            ++nwhite;
        else
            ++nother;

    printf("цифры =");
    for (i = 0; i < 10; ++i)
        printf("%d", ndigit[i]);
    printf(", символы-разделители =%d, прочие =%d\n", nwhite, nother);
}
gcc -o "lesson_1" "lesson_1.c" (в каталоге: /home/leonid/C)
Сборка прошла успешно.
test.txt:
Код
derty-sdf rty fgjj 1 4 t
wsyj
sdfgh fhgj dtyh
1
4
5
0
9
[leonid@localhost C]$ ./lesson_1 < test.txt
Ничего нет в консоли.
Да, учителя, просто супер,супер,супер :)
Striver, выручай. Думаю, что это какие-то не пойманные мною нюансы, но не вижу.

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Re: Язык программирования С
« Ответ #12 : 05 Декабрь 2015, 15:53:37 »
Некоторые символы испортились.
Вот в виде файла (в кодировке utf8, возможно тебе надо будет поменять).

У меня в винде работает (только с кодировкой проблемы, в линухе не должно быть)
Код
D:\moe\prg\98-dmc>proba03 < aaa.txt
╤Ж╨╕╤Д╤А╤Л =0065000000, ╤Б╨╕╨╝╨▓╨╛╨╗╤Л-╤А╨░╨╖╨┤╨╡╨╗╨╕╤В╨╡╨╗╨╕ =6, ╨┐╤А╨╛╤З╨╕╨╡ =
30

Оффлайн Striver

  • Житель
  • недоинженер, полупрограммист
    • http://striver00.ru
Re: Язык программирования С
« Ответ #13 : 05 Декабрь 2015, 16:45:21 »
Попробовал в Линуксе:
Код
striver@striver-AOA110:~$ proba03 < aaa.txt
цифры =0065000000, символы-разделители =6, прочие =30

Оффлайн LanuHum

  • Житель
Re: Язык программирования С
« Ответ #14 : 05 Декабрь 2015, 16:54:27 »
Попробовал в Линуксе:
Код
striver@striver-AOA110:~$ proba03 < aaa.txt
цифры =0065000000, символы-разделители =6, прочие =30
Твой работает, а, мой нет.
У меня написано
Код
    for (i = 0; i < 10, ++i)
        ndigit[i] = 0;
У тебя написано:
Код
    for (i = 0; i < 10; ++i)
        ndigit[i] = 0;
У тебя сборка успешная, у меня
Код
lesson_1.c: В функции «main»:
lesson_1.c:10:28: ошибка: expected «;» before «)» token
     for (i = 0; i < 10, ++i)
Сборка завершилась с ошибкой.
Вот такие пироги. И, никто нигде не говорит, что такое может случиться. Явно же, что сие имело место быть уже где-то.
Но, ещё раз, спасибо!

 


Яметрика

* По форуму

* Рекламный блок

* Последние вложения

1 (1).png
Скачано: 68
Автор: LEXA ANЭGROWND
blender.png
Скачано: 78
Автор: ipv2007
4.png
Скачано: 100
Автор: hiroyukiss
2.png
Скачано: 122
Автор: hiroyukiss

Скачано: 112
Автор: Dilifa12