Portál AbcLinuxu, 15. července 2025 09:42


Dotaz: Ukoly v C [easy]

Bundas avatar 2.1.2014 14:04 Bundas | skóre: 14 | Pardubice
Ukoly v C [easy]
Přečteno: 424×
Odpovědět | Admin
Ahojte vsichni. Ucim se C z jedne knihy. Ted tam mam na konci kapitoly ukoly. Vsechny sem vyresil az na posledni dva. Premyslel sem nad tim, ale opravdu nevim.

Prvni ukol:

Napiste program, ktery vypise hodnotu EOF

Druhy ukol:

Napiste program pro kopirovani vstupu na vystup, nahrazujici retezce jedne nebo nekolika mezer jednou mezerou

Vim jak okopirovat vstup na vystup, ale nevim jak nahradit ty retezce.
int main(void){

 int z;

 while((z = getchar()) != EOF){
 putchar(z);
 }
 return 0;

}
diky za pomoc
Abe the Messiah has come.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Jendа avatar 2.1.2014 14:27 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Ukoly v C [easy]
Odpovědět | | Sbalit | Link | Blokovat | Admin
bool space=0;
if (z == ' ') {
  if(!space) {
    putchar(z);
  }
  space=1;
} else {
  putchar(z);
  space=0;
}
Netestováno a neumím programovat.
2.1.2014 14:45 DK
Rozbalit Rozbalit vše Re: Ukoly v C [easy]
nahradit bool za int a je to ok
Bundas avatar 2.1.2014 14:51 Bundas | skóre: 14 | Pardubice
Rozbalit Rozbalit vše Re: Ukoly v C [easy]
no, nejak mi tam chybi prikaz pro vstup.
Abe the Messiah has come.
Jendа avatar 2.1.2014 15:09 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Ukoly v C [easy]
To musíš dát do toho cyklu, co už máš…
rADOn avatar 2.1.2014 15:39 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Ukoly v C [easy]
…Netestováno a neumím programovat.
Je to znát :-) Kdyz si misto priznaku (byla/nebyla mezera) budes drzet cely predchozi znak, tak se ti to podstatne zjednodussi.
"2^24 comments ought to be enough for anyone" -- CmdrTaco
2.1.2014 14:50 axel
Rozbalit Rozbalit vše Re: Ukoly v C [easy]
Odpovědět | | Sbalit | Link | Blokovat | Admin
Napiste program, ktery vypise hodnotu EOF

k tomu neni moc co poradit, predstav si temer identickou ulohu

Napiste program, ktery vypise hodnotu 123

a bude to jasne
Bundas avatar 2.1.2014 14:52 Bundas | skóre: 14 | Pardubice
Rozbalit Rozbalit vše Re: Ukoly v C [easy]
Takze to bude
printf("%EOF");
?
Abe the Messiah has come.
Jendа avatar 2.1.2014 15:11 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Ukoly v C [easy]
Ne (man printf)

putchar(hodnota EOF, kterou jsi zjistil v ASCII tabulce);
rADOn avatar 2.1.2014 15:30 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Ukoly v C [easy]
Ceckovy EOF neni znak v ascii tabuli, je to konstanta definovana v libc.

Napoveda: getchar() vraci int a ne char.

Napoveda pro pomalejsi: kdyby EOF byl platny znak, tak ceckove programy (vcetne rady dalsich programovacich jazyku ktere jsou v C napsany) mely celkem velky problem precist soubor ve kterem se takovy znak vyskytuje.
"2^24 comments ought to be enough for anyone" -- CmdrTaco
2.1.2014 16:00 MadCatX
Rozbalit Rozbalit vše Re: Ukoly v C [easy]
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jak pozoruji, máš problém pochopit rozdíl mezi znakem a hodnotou, která ten znak kóduje. Znak je celkem logicky to, co se vykreslí na obrazovku, hodnota znaku (jakkoliv to zní kostrbatě) je číslo, které ten znak reprezentuje. Text je v počítači reprezentován jako posloupnost bytů v paměti. Když třeba v C zavoláš
char* str = "Ahoj!";
printf("%s", str);
bude se (zjednodušeně) dít toto: Funkce printf() bude číst řetězec "str" byte po bytu a podle použité převodní tabulky převádět ta čísla na znaky. Kdyby se použilo ISO-8895-1, provedl by následující kód toto:
#include <stdio.h>
#include <string.h>

int main()
{
    int i;
    char str[] = "Lama Glama!";

    for (i = 0; i <= strlen(str); i++) {
        int val = str[i];
        printf("%d => '%c'\n", val, str[i]);
    }

    return 0;
}        
               
76 => 'L'
97 => 'a'
109 => 'm'
97 => 'a'
32 => ' '
71 => 'G'
108 => 'l'
97 => 'a'
109 => 'm'
97 => 'a'
33 => '!'
0 => ''
Používat putchar() na zjištění hodnoty znaku je tedy blbost, putchar() dělá pravý opak. Správný postup je tedy použít getchar() a vypisovat, co dostane. Hodnota EOF by měla být -1, na *NIXech se EOF z klávesnice dá vložit pomocí CTRL+D.
martin-ux avatar 2.1.2014 20:38 martin-ux | skóre: 18 | Bratislava
Rozbalit Rozbalit vše Re: Ukoly v C [easy]
Odpovědět | | Sbalit | Link | Blokovat | Admin
EOF je zadefinovane macro, e.g. (BSD):
$ grep EOF /usr/include/stdio.h
#define	EOF	(-1)
takze vypisat to vies napr.
#include <stdio.h>

int main() {

#ifdef EOF
   printf ("yop, EOF is defined: %d\n", EOF);
#else
   printf ("sorry, we don't have EOF defined\n");
#endif

	return 0;
}
no, a co sa tyka tej druhej ulohy, trosku sa potrap :). ako hint - ulozeny retazec budes prechadzat po znakoch a budes kontrolovat, ci dany znak je medzera.

..when you do things right, people won't be sure you've done anything at all..

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.