Linux за българи: Форуми

Програмиране => Общ форум => Темата е започната от: cRuSh3r в Jan 29, 2010, 14:33



Титла: програмка на С
Публикувано от: cRuSh3r в Jan 29, 2010, 14:33
Здр.,
тука се боря с една програма ,която трбва да брои - нов ред,дума и символи ,които са въведени.Това е кода
Цитат
#include <stdio.h>
#define IN 1
#define OUT 0

main()
{
int c, nl, nw, nc, state;
state = OUT;
nl = nw = nc = 0;
while ((c = getchar()) != EOF) {
++nc;
if (c == '\n')
++nl;
if (c == ' ', c == '\n', c = '\t')
state = OUT;
else if (state == OUT) {
state = IN;
++nw;
}
}
printf("%d %d %d\n", nl, nw, nc);
}

Проблема е ,че неиска да брои думите.Винаги изкарва 0.  ???


Титла: Re: програмка на С
Публикувано от: lkr в Jan 29, 2010, 14:50
if (c == ' ', c == '\n', c = '\t')

Код:
 if (c == ' ' || c == '\n' || c == '\t') 


Титла: Re: програмка на С
Публикувано от: cRuSh3r в Jan 29, 2010, 14:54
Ами дава ми грешка компилатора (lcc-win32) :
Цитат
the left side of the assignment can't be assigned to

pp
|| - значи "или" ?


Титла: Re: програмка на С
Публикувано от: lkr в Jan 29, 2010, 15:00
Дава ти, защото пак имаш:  c = '\t', а не c == '\t'


Титла: Re: програмка на С
Публикувано от: tyuio в Jan 29, 2010, 15:10
"=" присвояване
"==" равенство
Моно грешки има или поне много неща които са ненужни:
nl = nw = nc = 0;
това е не нужно щом си ги дефинирал те са си 0.
После коя дума ти брои? аз дума не виждам както и функция за въвеждане
Аз този компилатор не го знам поддържа ли АНСИ стандарта?
Почни от начало с езика С този пример е почти безсмислен!


Титла: Re: програмка на С
Публикувано от: cRuSh3r в Jan 29, 2010, 15:29
Дава ти, защото пак имаш:  c = '\t', а не c == '\t'
Oправи се :)

@tyuio
Аз почнах от начало.В момент ачета Kernighan & Ritchie - The C Programming Language. Просто такъв е примера в книгата.
А това ,че като са си дефинирани ,значи са 0 не го знех или поне още не съм стигнал до там :P

pp
http://en.wikipedia.org/wiki/LCC_(compiler)


Титла: Re: програмка на С
Публикувано от: lkr в Jan 29, 2010, 15:44
nl = nw = nc = 0;
това е не нужно щом си ги дефинирал те са си 0.
Пълни глупости, 0 са само, ако са static.

После коя дума ти брои? аз дума не виждам както и функция за въвеждане

Ми как да видиш, то чете от stdin.


Титла: Re: програмка на С
Публикувано от: cRuSh3r в Jan 29, 2010, 15:55


Цитат
Цитат
После коя дума ти брои? аз дума не виждам както и функция за въвеждане

Ми как да видиш, то чете от stdin.
E  getchar не е ли за въвеждане ?Нали то чете това което въвеждаш от клавиатурата или тука става дума за хедър файла ?


Титла: Re: програмка на С
Публикувано от: tyuio в Jan 29, 2010, 15:56
nl = nw = nc = 0;
това е не нужно щом си ги дефинирал те са си 0.
Пълни глупости, 0 са само, ако са static.

После коя дума ти брои? аз дума не виждам както и функция за въвеждане

Ми как да видиш, то чете от stdin.
Аз не знам в С да има статик поправиме?
stdin също не видях само getchar w while
Не съм го компилирал но така на пръв поглед не ми изглежда работеща коректно С програма даже и да не плюе грешки


Титла: Re: програмка на С
Публикувано от: tyuio в Jan 29, 2010, 15:57
щом е в while това е условие за цикъла незнам как ще вземи променливата когато е в () а не в {}


Титла: Re: програмка на С
Публикувано от: lkr в Jan 29, 2010, 16:03

Цитат
Аз не знам в С да има статик поправиме?

http://wiki.answers.com/Q/What_is_a_static_identifier_in_C

Цитат
E  getchar не е ли за въвеждане ?Нали то чете това което въвеждаш от клавиатурата или тука става дума за хедър файла ?

Код:
laker@dg:~$ echo "bla bla bla" | ./a.out
1 3 12

Код:
laker@dg:~$ ./a.out < bla.txt
1 3 12


Титла: Re: програмка на С
Публикувано от: tyuio в Jan 29, 2010, 16:38
Прав си има статик, никога не съм я ползвал! Въпреки това не смятам че програмата е написана коректно особенно като за начинаещ има много "но"


Титла: Re: програмка на С
Публикувано от: hyankov в Jan 31, 2010, 13:18
@crusher: Реализирал си един от най-неприятните бъгове в С,С++ (поне според мен) и то още в самото начало. "Което е добре!" (Б.Турбото). В книгата Expert C Programming именно с това започват и са дали един полезен съвет, който се опитвам да спазвам. Когато имаш проверка за равенство (a.k.a оператор ==) може да слагаш константния израз (ако има такъв) от лявата страна. Тогава дори да си допуснал грешка (= вместо ==) компилатора ще те наплюе с грешка от рода lvalue нещо си.

@tyuio: Всъщност най-вероятно си използвал static променливи, без обаче изрично да си го заявил. Например - всички глобални променливи, които дефинираш, са по същество статични, дори без да използваш ключовата дума static. За тях е вярно, че можеш напълно убедено да вярваш, че са инициализирани и то с нула. (Ех, този Весо Компилатора - голям идиот, ама хубави неща ни научи)

Поздрави,
Ицо


Титла: Re: програмка на С
Публикувано от: tyuio в Jan 31, 2010, 13:36
Цитат
(Ех, този Весо Компилатора - голям идиот, ама хубави неща ни научи)
Ама той ли ти е преподавал :) Легендарна личност !


Титла: Re: програмка на С
Публикувано от: task_struct в Jan 31, 2010, 14:30
nl = nw = nc = 0;
това е не нужно щом си ги дефинирал те са си 0.

Имахме си един джава програмист в офиса дето беше на същото мнение. Бая работа ми съзададе да му оправя мизериите. Та от тогава вече наистина вярвам на приказката, че Джавата поврежда мозъка  ;D (сигурно и джава програмистите мислят така за C :D )

Има една интересна книжка - Writing Solid Code ( http://www.cs.brown.edu/courses/cs190/2008/documents/restricted/Writing%20Solid%20Code.pdf ), която дава някои съвети и напътствия как е добре да се пише на С. Писана е от микромек, и то доста отдавна, но е добра :)



Титла: Re: програмка на С
Публикувано от: lkr в Jan 31, 2010, 15:41
Цитат
Има една интересна книжка - Writing Solid Code ( http://www.cs.brown.edu/courses/cs190/2008/documents/restricted/Writing%20Solid%20Code.pdf ), която дава някои съвети и напътствия как е добре да се пише на С. Писана е от микромек, и то доста отдавна, но е добра :)

Ето нещо малко по-ново:

http://acts.creatronic.com/docs/Write%20Great%20Code%20-%20Volume%20I%20-%20Understanding%20The%20Machine/
http://acts.creatronic.com/docs/Write%20Great%20Code%20-%20Volume%20II%20-%20Thinking%20Low-Level,%20Writing%20High-Level%20%282006%29/