Registrovaný: 06 Jan 2012, 19:26 Príspevky: 458 Bydlisko: pod Pátrovom Udelené body:228 bodov Získané body:21 bodov
Aplikacia vypise k zadanym retazcom, ci je to cislo, ak je to cele cislo, ci je to prvocislo, dalej ci je to palindrom, dalej ci je to datum a ak je, nazov dna v tyzdni. Vstup moze byt zadany bud ako vstupne argumenty (napr. test.exe hanah koleso 2015-11-03 123.325 .123) alebo nacitanim z klavesnice. Jednotlive retazce musia byt oddelene jednou medzerou!
Spoiler:
Kód:
#include <stdio.h> #include <stdlib.h>
// zisti a vrati pocet znakov v retazci (okrem ukoncovacieho znaku '\0') int dlzka_slova(char *slovo) { int velkost = 0;
while (*slovo++ != '\0') // listuje retazec za pomoci pointerov velkost++; return velkost; }
// zisti ci je retazec cislo, vrati true/false int je_cislo(char *retazec) { int i, point = 0;
for (i = 0; retazec[i] != '\0'; i++) { if (retazec[i] == '.') { point++; // spocita pocet bodiek if (point > 1) return 0; // ak je viac ako 1 - false } if (!isdigit(retazec[i]) && retazec[i] != '.') return 0; // ak retazec obsahuje iny znak ako cislicu alebo botku - false } return 1; }
// zisti ci je retazec cele cislo, vrati true/false int je_cele_cislo(char *retazec) { int i, poradie_botky;
for (i = 0; retazec[i] != '\0'; i++) { if (retazec[i] == '.') // nastavi poradie botky, ak je v cisle poradie_botky = i; } for (i = poradie_botky + 1; retazec[i] != '\0'; i++) { if (retazec[i] != '0') // ak je za botkou ina cislica ako nula - false return 0; } return 1; }
// zisti ci je retazec palindrom, vrati true/false int je_palindrom(char * retazec) { int i, pom = dlzka_slova(retazec); int j = pom - 1;
for (i = 0; i < pom / 2; i++) { if (retazec[i] != retazec[j--]) return 0; // ak sa znaky zrkadlovo umiestnene v retazci nezhoduju - false } return 1; }
// zisti ci je retazec datum vo formate DDDD-DD-DD, vrati true/false int je_datum(char *retazec) { // splnenie podmienok: // dlzka retazca musi byt 10 // znaky 0, 1, 2, 3, 5, 6, 8, 9 musia byt cislice // znaky 4, 7 musia byt '-' if (dlzka_slova(retazec) == 10 && isdigit(retazec[0]) && isdigit(retazec[1]) && isdigit(retazec[2]) && isdigit(retazec[3]) && retazec[4] == '-' && isdigit(retazec[5]) && isdigit(retazec[6]) && retazec[7] == '-' && isdigit(retazec[8]) && isdigit(retazec[9])) return 1; else return 0; }
// rozdeli retazec na jednotlive casti datumu, prevedie ich na cele cisla a ulozi do pamäti (pole intov) void cisla_datumu(char *retazec, int *datum) { int i; char rok[5], mesiac[3], den[3];
for (i = 0; retazec[i] != '\0'; i++) { (i >= 0 && i < 4) ? rok[i] = retazec[i] : // vytvori retazec rok bez ukoncenia (i > 4 && i < 7) ? mesiac[i - 5] = retazec[i] : (i > 7) ? den[i - 8] = retazec[i] : 0; } rok[i + 1] = '\0'; // ukonci retazec rok mesiac[i + 1] = '\0'; den[i + 1] = '\0'; datum[0] = atoi(rok); // prevedie retazec na cele cislo a vlozi do pola int-ov datum[1] = atoi(mesiac); datum[2] = atoi(den); }
// zisti poradove cislo dna v tyzdni a vrati ho (0 = nedela, 1 = pondelok ...) // neviem poriadne ako to funguje, naiel som to na nete :-D int den_v_tyzdni(int d, int m, int y) { static int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 }; y -= m < 3; return ( y + y/4 - y/100 + y/400 + t[m-1] + d) % 7; }
// zisti ci je retazec prvocislo, vrati true/false int je_prvocislo(char *retazec) { int i; double dbcislo = atof(retazec); // prevedie retazec na desatinne cislo
if (dbcislo >= 2.0) { // ak je rovne alebo vacsie ako najmensie prvocislo, prevedie vypocet if (je_cele_cislo(retazec)) { int cislo = atoi(retazec); // prevedie retazec na cele cislo
for (i = cislo / 2; i > 1; i--) { //v cykle if(cislo % i == 0) // (modulo) deli cislo cislom o polovicu mensim a postupne ho znizuje az po cislo 2 return 0; // ak je cislo delitelne niektorym z uvedenych - false } return 1; } } return 0; }
int main(int argc, char **argv) { int i, pocet_slov = 0, pom = 0, pc = 0, datum[3]; char vstup[1024], **retazce; const char *den[] = {"nedela", "pondelok", "utorok", "streda", "svrtok", "piatok", "sobota"};
printf("\nAplikacia vypise k zadanym retazcom, ci je to cislo, ak je to cele cislo, ci je to prvocislo, dalej ci je to palindrom,\n" "dalej ci je to datum a ak je, nazov dna v tyzdni.\n" "Vstup moze byt zadany bud ako vstupne argumenty (napr. test.exe hanah koleso 2015-11-03 123.325 .123\n" "alebo nacitanim z klavesnice.\n" "Jednotlive retazce musia byt oddelene jednou medzerou!\n\n"); if (argc > 1) { // ak su argumenty zadane cez konzolu for (i = 1; i < argc; i++) { if (je_cislo(argv[i])) { if (je_prvocislo(argv[i])) printf("%s je prvocislo.\n", argv[i]); else printf("%s je cislo ale nie prvocislo.\n", argv[i]); } else if (je_palindrom(argv[i])) printf("%s je palindrom.\n", argv[i]); else if (je_datum(argv[i])) { printf("%s je datum ", argv[i]); cisla_datumu(argv[i], datum); printf("a je to %s.\n", den[den_v_tyzdni(datum[2], datum[1], datum[0])]); } else printf("%s nie je cislo, datum ani palindrom.\n", argv[i]); } } else { // argumenty budu zadane z klavesnice printf("Zadajte vstupne udaje s medzerami a ukoncite klavesou enter:\n"); gets(vstup); // nastavi pocet slov vo vete i = 0; while (vstup[i] != '\0') { if (vstup[i++] == ' ') pocet_slov++; }
char retazce[pocet_slov + 1][64]; // deklaracia statickeho pola retazcov
for (i = 0; vstup[i] != '\0'; i++) { // listuje po znakoch if (vstup[i] == ' ') { // ak je znak medzera retazce[pom][pc] = '\0'; // ukonci retazec pom++; // posun na dalsi retazec pc = 0; // prechod na prvy znak noveho retazca } else { retazce[pom][pc] = vstup[i]; // vloz do retazca znak z povodneho pc++; // posun na dalsi znak noveho retazca } } retazce[pom][pc] = '\0'; // ukoncenie posledneho retazca putchar('\n'); // odriadkovanie for (i = 0; i < pocet_slov + 1; i++) { // tak isto ako hore if (je_cislo(retazce[i])) { if (je_prvocislo(retazce[i])) printf("%s je prvocislo.\n", retazce[i]); else printf("%s je cislo ale nie prvocislo.\n", retazce[i]); } else if (je_palindrom(retazce[i])) printf("%s je palindrom.\n", retazce[i]); else if (je_datum(retazce[i])) { printf("%s je datum ", retazce[i]); cisla_datumu(retazce[i], datum); printf("a je to %s.\n", den[den_v_tyzdni(datum[2], datum[1], datum[0])]); } else printf("%s nie je cislo, datum ani palindrom.\n", retazce[i]); } }
return 0; }
Ak to chce niekto vyskúšať, pridávam zbalený exe súbor.
_________________ kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor), Skype: libcokamo, ICQ: 56312279 Ak treba, napíš mi na libcosenior@gmail.com. To mám v mobile a stále po ruke.
Užívatelia prezerajúci fórum: Žiadny registrovaný užívateľ nie je prítomný a 1 hosť
Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre Nemôžete zasielať súbory v tomto fóre