3d форум по Blender

Другое => Программирование (любое) => Тема начата: LanuHum от 05 Декабрь 2015, 14:05:37

Название: Язык программирования С
Отправлено: 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'];
Подскажите мне, пожалуйста,где найти курс, в котором все примеры работают.
Название: Re: Язык программирования С
Отправлено: Striver от 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
т.е. у меня программа работает.
Название: Re: Язык программирования С
Отправлено: LanuHum от 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
т.е. у меня программа работает.
Дело ни в том, какой язык хорош для использования. Дело в том, что нужно научиться читать уже написанное разработчиками Блендера.
Так, у тебя работает, почему не работает тогда у меня? Потому что линукс? Где искать различия написания кода на С для разных осей?
Название: Re: Язык программирования С
Отправлено: Striver от 05 Декабрь 2015, 14:40:09
Цитировать
Так, у тебя работает, почему не работает тогда у меня?
Вывод программы сюда скопируй.

Цитировать
Потому что линукс? Где искать различия написания кода на С для разных осей?
В линуксе однозначно с С проще, чем винде, вряд-ли проблема из-за этого.
Название: Re: Язык программирования С
Отправлено: LanuHum от 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

Это что?
Название: Re: Язык программирования С
Отправлено: LanuHum от 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 - ничего
Название: Re: Язык программирования С
Отправлено: Striver от 05 Декабрь 2015, 14:54:15
Цитировать
Это что?
Вывод программы в каждой итерации цикла. Верни первый вариант программы.

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

Именно поэтому я направлял в программу текстовый файл:
Код
D:\moe\prg\98-dmc>proba02 < aaa.txt
В линуксе синтаксис направления ввода такой же, попробуй. В случае с файлом, EOF случится, когда файл закончится.
Название: Re: Язык программирования С
Отправлено: Striver от 05 Декабрь 2015, 14:57:20
Цитировать
Жму Enter - ничего
Если нужно завершение цикла по Enter, замени строку
Код
getchar() != EOF
на
Код
getchar() != '\n'
Название: Re: Язык программирования С
Отправлено: LanuHum от 05 Декабрь 2015, 14:59:09
Цитировать
Это что?
Вывод программы в каждой итерации цикла. Верни первый вариант программы.

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

Именно поэтому я направлял в программу текстовый файл:
Код
D:\moe\prg\98-dmc>proba02 < aaa.txt
В линуксе синтаксис направления ввода такой же, попробуй. В случае с файлом, EOF случится, когда файл закончится.
Если я пишу asdafsdf, а затем жму Ctrl-C, то программа завершается. Где же результат подсчёта?
Название: Re: Язык программирования С
Отправлено: LanuHum от 05 Декабрь 2015, 15:06:51
Цитировать
Именно поэтому я направлял в программу текстовый файл:
Striver, спасибо, сообразил я.
[leonid@localhost C]$ ./hellow < test.txt
5

А, что со вторым примером?
Название: Re: Язык программирования С
Отправлено: LanuHum от 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]$

Название: Re: Язык программирования С
Отправлено: LanuHum от 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, выручай. Думаю, что это какие-то не пойманные мною нюансы, но не вижу.
Название: Re: Язык программирования С
Отправлено: Striver от 05 Декабрь 2015, 15:53:37
Некоторые символы испортились.
Вот в виде файла (в кодировке utf8, возможно тебе надо будет поменять).

У меня в винде работает (только с кодировкой проблемы, в линухе не должно быть)
Код
D:\moe\prg\98-dmc>proba03 < aaa.txt
╤Ж╨╕╤Д╤А╤Л =0065000000, ╤Б╨╕╨╝╨▓╨╛╨╗╤Л-╤А╨░╨╖╨┤╨╡╨╗╨╕╤В╨╡╨╗╨╕ =6, ╨┐╤А╨╛╤З╨╕╨╡ =
30
Название: Re: Язык программирования С
Отправлено: Striver от 05 Декабрь 2015, 16:45:21
Попробовал в Линуксе:
Код
striver@striver-AOA110:~$ proba03 < aaa.txt
цифры =0065000000, символы-разделители =6, прочие =30
Название: Re: Язык программирования С
Отправлено: LanuHum от 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)
Сборка завершилась с ошибкой.
Вот такие пироги. И, никто нигде не говорит, что такое может случиться. Явно же, что сие имело место быть уже где-то.
Но, ещё раз, спасибо!
Название: Re: Язык программирования С
Отправлено: Striver от 05 Декабрь 2015, 17:54:14
Цитировать
У меня написано
for (i = 0; i < 10, ++i)

У тебя написано:
for (i = 0; i < 10; ++i)
Ну, тут, извини, но синтаксис оператора for однозначно требует двух символов ";"
так делать можно:
Код
for (;;)
а так нельзя:
Код
for (;,)
Название: Re: Язык программирования С
Отправлено: LanuHum от 05 Декабрь 2015, 18:42:12
Цитировать
У меня написано
for (i = 0; i < 10, ++i)

У тебя написано:
for (i = 0; i < 10; ++i)
Ну, тут, извини, но синтаксис оператора for однозначно требует двух символов ";"
так делать можно:
Код
for (;;)
а так нельзя:
Код
for (;,)

Блин, только что увидел разницу. Ничего не понимаю, откуда у меня вместо точки с запятой запятая...я ж тупо копировал текст. Поэтому и не сравнивал тексты по символам, видя одинаковые строчки.
Striver, будешь в Питере - с меня виски. :)
Да...
Название: Re: Язык программирования С
Отправлено: sungreen от 05 Декабрь 2015, 19:56:44
>> Блин, только что увидел разницу. Ничего не понимаю, откуда у меня вместо точки с запятой запятая...я ж тупо копировал текст.
... так там откуда ты копировал накосячено, видимо люди сканировали и оцифровывали бездумно, без проверки  :) ...
Название: Re: Язык программирования С
Отправлено: LanuHum от 05 Декабрь 2015, 20:04:17
>> Блин, только что увидел разницу. Ничего не понимаю, откуда у меня вместо точки с запятой запятая...я ж тупо копировал текст.
... так там откуда ты копировал накосячено, видимо люди сканировали и оцифровывали бездумно, без проверки  :) ...
Ясно, просто с пайтоном у меня такого не было. Доверял, так сказать. Но, теперь понятно, что тупое копирование не ведёт к пониманию. :)
Спасибо, Николай!
Название: Re: Язык программирования С
Отправлено: sungreen от 05 Декабрь 2015, 20:11:15
>> Доверял, так сказать.
... насколько понял, то тебе уже тоже стало очевидным, что нужно менять провайдера счастья :) ...
Название: Re: Язык программирования С
Отправлено: LanuHum от 05 Декабрь 2015, 20:37:26
>> Доверял, так сказать.
... насколько понял, то тебе уже тоже стало очевидным, что нужно менять провайдера счастья :) ...

Цитировать
Первая звезда мне сказала: "Ты первый"
Ветер научил меня ходить одному
Поэтому я до сих пор немножечко нервный
Когда мне говорят: "Смотри - счастье"
Я смотрю туда и вижу тюрьму
Название: Re: Язык программирования С
Отправлено: mr.A от 05 Декабрь 2015, 22:11:19
Накидаю ссылок, чтоб и самому потом почитать:
http://givi.olnd.ru/kr2/
http://prog-cpp.ru/c/
http://bourabai.ru/C-Builder/c/index.htm
http://any-book.org/download/23589.html
http://dfe.petrsu.ru/koi/posob/c/c.htm
Название: Re: Язык программирования С
Отправлено: LanuHum от 05 Декабрь 2015, 22:46:35
Накидаю ссылок, чтоб и самому потом почитать:
Я пока разбирался, закрыл страницу, где наряду со всей этой кучей информации писалось как нарисовать рябь на экране. Подозреваю, что это была нужная инфа, дающая понятие создания оконных приложений с их API. Блендер имеет собственный API. Стало быть оно на С, и, стало быть, примеры на эту тему неплохо иметь. Попадётся вновь, тоже тут ссылку кину, чтобы не потерять.