Diskuze: Zpracování textu
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 50 zpráv z 102.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
No tak v prvním případě to počítá počet projitých argumentů a druhý je pro to prvočíslo, protože když to dám i=1 tak vše se dá dělit jedničkou, takže existuje víc jak 0 dělitelů - tudíž to není prvočíslo..
Jde o to, že tam máš jednu proměnnou, kterou si přepisuješ tím druhým
cyklem...
Joo, jasně. Ať už je to céčko nebo dřív když jsem začínal s PHP tak
já vždy prehlidnu nějakou takovou defacto drobnost. Jak budu zase u pc tak to
opravím a snad se zase pohnu dal.
Čím může být způsobena chyba SIGSEGV? Takhle - vše s čísly funguje,
když chci zkusit ale zadat znak, vyhodí to chybu neoprávněného přístupu
do paměti SIGSEGV.
Pro určení znaku mám zatím tento kus kódu, navíc se jen snažím vypsat,
zda-li ho opravdu mám:
else if(isalpha(argv[i][j]))
{
printf("Word: %s \n", argv[i][j]);
}
daj sem celý kód - už upravený, predpokladám, že nebude úplne rovnaký ako ten čo si sem dával predtým.
Už to vypisuje, jde o to, že jsem to vypisoval jako string %s, stačilo to
dát jako %c
Teď se spíš snažím nějak všechny ty znaky zadané v jednom argumentu nějak "slepit" dohromady jako jedno slovo.. Jdu dobrým směrem, když jsem si dal
char znak[100];
??
A potom se to snažím nějak vkládat do toho pole:
znak[j]=argv[i][j];
Ano
Jinak sigsegv je neoprávněný přístup do paměti..
áno, takto to môžeš spraviť, len nesmieš zabudnúť ako posledný člen
poľa znak dať '\0'.
teda predpokladajme, že znak[posledne], je posledný člen, ktorému si už
nejakú hodnotu zadal. Potom musiš spraviť toto:
znak[posledne + 1] = '\0';
On to aj sám napísal
vyhodí to chybu neoprávněného přístupu do paměti
A jak v tom cyklu řeknu, že už je poslední a má to přidat ten koncový znak? Resp. ten znak "slepuje" celé slovo argumentu?
No asi se mi to podařilo přidat za to, když zadám jeden znak, tak o to vypíše, ale když více, tak to vypíše pouze první..
if(znak)
{
znak[j+1]='\0';
printf("Word: %c \n",*znak);
}
vypisuje to jeden znak, protože tomu říkáš, že chceš jeden znak..
a proč tam máš tu dereferenci? o.O
keď už máš pole znakov null-terminated, tak používaj %s, teda
printf("Word: %s \n",znak);
jj, došlo mi potom, že vypisuju znak
Jen mi to v případě čtyřpísmenného slova dá nakonec jakýsi divný znak
a někdy to při pětipísmenným slovu vynechá to poslední
to proto, že se ti nejspíš provede ještě poslední inkrementace, než
podmínka skončí.
zkus dát jen znak[j] = '\0'
S tímhle už to funguje.. ale myslel jsem, že tam to +1 je správně, aby se právě ten poslední znak nesmazal.. ale tím zpětným lomítkem se nestane, že by se poslední znak přemazal, že?
No není to zpětným lomítkem.. tím jen dáváš najevo, že tam opravdu chceš dát nulu a ne znak nula..
Hoď sem ten cyklus a zkus si ho vykrokovat.. Uvidíš, proč tam bude v tomto případě j a ne j+1
Michal, vidím, že stále tápeš v tých reťazcoch. Ak chceš prečítaj
si toto: http://www.freespace.sk/…5%a1kola-r25
Je to časť o reťazcoch a zdrojom článku bola knižka od Herouta.
Vyskúšaj toto:
#include <stdio.h>
#include <ctype.h>
/**
* Funkcia skontroluje, ci retazec obsahuje iba jednu desatinnu botku,
* ak ich obsahuje viac,vrati false
* skontroluje, ci vstupny retazec obsahuje iba cislice a maximalne jednu bodku,
* ak nie, prvy odlisny znak zapise na prvu poziciu retazca
* @param vstupny retazec
* @return 1 (true) alebo 0 (false)
*/
int je_cislo(char *number)
{
int i, point = 0;
for (i = 0; number[i] != '\0'; i++) {
/** spocita pocet bodiek **/
if (number[i] == '.') {
point++;
/** ak je bodiek viac ako 1, return 0 **/
if (point > 1)
return 0;
}
/** ak je znak iny ako cislica alebo bodka, return 0 **/
if (!isdigit(number[i]) && number[i] != '.') {
return 0;
}
}
return 1;
}
int main(int argc, char **argv)
{
int i;
for (i = 1; i < argc; i++) {
if (je_cislo(argv[i])) {
printf("Retazec %s je cislo.\n", argv[i]);
}
else
printf("Retazec %s nie je cislo.\n", argv[i]);
}
return 0;
}
Malá oprava v popise funkcie.
namiesto
má byť
Snažím se funkcí získat délku řetězce, ale nechce se mi to přeložit:
int strlen(char **znak)
{
int velikost=0;
while(znak++ !='\0')
velikost++;
return velikost;
}
printf("Delka: %d\n",strlen(*znak));
Vyzkoušel jsem ještě různě ty ukazatele, ale furt to háže chybu,
hlavně u toho, že do strlen vkládám znak a je tam konflikt typů
int strlen(char *retazec)
-
-
-
main()
{
printf("Delka: %d\n", strlen(retazec));
To som tu už ale písal:
/** vrati pocet znakov v retazci */
int strlen(char *slovo)
{
int velkost = 0;
while (*slovo++ != '\0')
velkost++;
return velkost;
}
A tu máš funkciu na palindrom:
int je_palindrom(char * retazec)
{
int i, velkost, pom = strlen(retazec);
int j = pom - 1;
for (i = 0; i < pom / 2; i++) {
if (retazec[i] != retazec[j--])
return 0;
}
return 1;
}
Díky moc.. Já vím že jeden kód jsi už posílal, ale on mi ne a ne fungovat.. resp. když to dělám teď u sebe v IDE tak to jede, když to pak překládám na terminálu na školním serveru tak to vyhodí chybu právě u toho int strlen ale funguje to potom správně..
Možno treba len premenovať funkciu zo strlen() na niečo iné, napr.: dlzka_retazca(). To preto, ak ten server kontroluje funkcie z knižnice string.h.
Wow, měl jsi pravdu
fungovalo to, jen tomu vadil ten název, tak jsem pro pořádek to změnil na
delka_slova
Díky Už jen udělám
rozpoznání data a mám hotovo..
S datumom to moze byt zlozitejsie. Zalezi na jeho formate. Ak je zarucene, ze bude dd.mm.rrrr, je to jednoduche, ale ak bude moznost aj d.m.rrrr, uz musis pocitat s kazdou moznostou, teda aj s d.mm.rrrr a dd.m.rrrr.
bude ve formátu DD-DD-DDD (D=0-9), ale musím ještě určit i den v týdnu (Po-Ne) resp. (Mon-Sun)
na to ti môže byť užitočné toto: http://www.tutorialspoint.com/…n_mktime.htm
nechám si to v záloze, nejdřív udělám v cyklu rozpoznání vůbec toho formátu, zda je to tak zadané.
teda formát má být DDDD-DD-DD, ale to je vlastně fuk
Lebo neviem, ako by si bez toho, čo som ti posielal, resp. niečoho podbného zistil, o aký deň sa jedná. Dostaneš zadané 17.11.1985 a ako zistíš, či to bol pondelok, utorok...? Pomocou toho čo som posielaj ti to hneď napíše
Jo, to bezesporu použiju
jen musím někam do svýho kódu, zřejmě hnedka někam na začátek cyklu
if(argc > 0)
{
for(i=1;i < argc; i++)
{
for(j=0; argv[i][j] != '\0'; j++)
{
if(isdigit(argv[i][j]))
{
cislo=cislo*10 + (argv[i][j] - '0');
}
else if(isalpha(argv[i][j]))
{
znak[j]=argv[i][j];
}
}
if(cislo)
{
for(k=2; k < cislo; k++)
{
if(cislo % k==0)
{
prvocislo=0;
break;
}
}
if(prvocislo)
{
printf("Number: %d (prvocislo) \n",cislo);
cislo=0;
}
else
{
printf("Number: %d \n",cislo);
cislo=0;
}
}
else if(znak)
{
znak[j]='\0';
if(je_palindrom(znak))
printf("Word: %s (palindrom)\n",znak);
else
printf("Word: %s \n",znak);
}
}
}
hodit podmínku, která se vykoná, pokud vstup bude ve formátu DDDD-DD-DD a pokud to nebude takový formát, tak se provedou ostatní testy isdigit nebo is alpha.. nebo to je blbost?
a ten dátum bude teda zadaný napr. takto: 2015-10-20 ? teda yyyy-mm-dd ? čísla oddelené pomlčkou alebo proste medzerou?
Tak v tom prípade to je ľahké. Keď narazíš na pomlčku, vieš, že ide o dátum. (Predpokladám, že nedostaneš vstup "Ahoj_ako" ani nič podobné)
No zkusil jsem otrocky napsat toto:
if(sizeof(argv[i])==10)
{
if(!(isdigit(argv[i][1])) &&!(isdigit(argv[i][2])) &&!(isdigit(argv[i][3])) &&!(isdigit(argv[i][4]))&&(argv[i][5]!='-')&&!(isdigit(argv[i][6]))&&!(isdigit(argv[i][7]))&&(argv[i][8]!='-')&&!(isdigit(argv[i][9]))&&!(isdigit(argv[i][10])))
{
break;
}
else
{
for(l=0;l<10;l++)
{
printf("%s\n",argv[i]);
/*datum[l]=argv[l];*/
}
}
}
Jenže to nechce fungovat jak bych chtěl.. prostě to jakoby přeskočí a potom to přijde až na to, že se jedná o číslo a pomlčky to vymaže..
tak zjištění a ověření dvojité zda-li se skutečně jedná o tvar YYYY-MM-DD jsem již zvládl, teď ještě konkrétně rozpoznat přesný den v týdnu..
Nemáš náhodou za chvíli deadline?
Jinak určitě průběžně tam nahrávej aktuální verzi, co tam máš..
Někteří cvičící ti pak dají možnost opravy na získání dalších
bodů-- ale musíš tam aspoň něco už mít
Průběžně to tam nahrávám Odevzdáno to má být až v neděli, na obhajobu na cviku jsem aspoň
částečně ready
Zobrazeno 50 zpráv z 102.