Как мне свойственно, начну с негатива.
Советуют: "Учи С!"
А, как его учить?
Вот, будучи знакомым уже с 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'];
Подскажите мне, пожалуйста,где найти курс, в котором все примеры работают.
Вот, будучи знакомым уже с Python, взялся разобраться с этим чудом С.
Ох, вряд-ли это приведёт к чему-то хорошему...
Когда я 12 лет назад познакомился с Питоном, я забросил С++ как страшный сон, и с тех пор он мне не был нужен. С не такой кривой, как С++, но сложностей в нём тоже хватает.
С тех пор я так или иначе изучал Java, Sheme, D (D - классный язык, леплю на нём иногда по-мелочи), но вот к С возвращаться не хочется.
/* подсчет вводимых символов; 1-я версия */
Скачал компилятор, скомпилил, вот вывод программы:
D:\moe\prg\98-dmc>proba02
сысыфс
7
^C
D:\moe\prg\98-dmc>proba02 < aaa.txt
13
т.е. у меня программа работает.
Кстати, нашёл в интернете свой вопрос. У чела не получалось исполнить пример. Ему написали следующее:
#include <stdio.h>
main()
{
int nc;
nc = 0;
while (getchar() != EOF)
{
++nc;
printf("%ld\n", nc);
}//без этой скобки в цикл входит только увеличение переменной nc, а функция printf
//выполнится только когда getchar() даст == -1;
}
Значит, проблема всё таки есть. Но, даже этот исправленный вариант даёт смутное представление.
Собираю этот код, запускаю, набираю текст, жму Enter
Это что?
Вот первый пример:
#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 - ничего
Это что?
Вывод программы в каждой итерации цикла. Верни первый вариант программы.
По-моему, ты не понял другой момент:
этот самый EOF при вводе с клавиатуры случится только, если остановить программу. В винде через Ctrl-Pause, в линухе Ctrl-C.
Именно поэтому я направлял в программу текстовый файл:
D:\moe\prg\98-dmc>proba02 < aaa.txt
В линуксе синтаксис направления ввода такой же, попробуй. В случае с файлом, EOF случится, когда файл закончится.
#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]$
Ага, копировать из 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, выручай. Думаю, что это какие-то не пойманные мною нюансы, но не вижу.
Некоторые символы испортились.
Вот в виде файла (в кодировке utf8, возможно тебе надо будет поменять).
У меня в винде работает (только с кодировкой проблемы, в линухе не должно быть)
D:\moe\prg\98-dmc>proba03 < aaa.txt
╤Ж╨╕╤Д╤А╤Л =0065000000, ╤Б╨╕╨╝╨▓╨╛╨╗╤Л-╤А╨░╨╖╨┤╨╡╨╗╨╕╤В╨╡╨╗╨╕ =6, ╨┐╤А╨╛╤З╨╕╨╡ =
30
Попробовал в Линуксе:
striver@striver-AOA110:~$ proba03 < aaa.txt
цифры =0065000000, символы-разделители =6, прочие =30
Попробовал в Линуксе:
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)
Сборка завершилась с ошибкой.
Вот такие пироги. И, никто нигде не говорит, что такое может случиться. Явно же, что сие имело место быть уже где-то.
Но, ещё раз, спасибо!