NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
ra3sk
Člen
Avatar
ra3sk:2.4.2016 15:52

Ahoj. Chcel by som založiť jedno vlákno kde by sa písali veľmi banálne problémy. Ja mám jeden. Mám zakúpené knihy Pavla Herouta Učebnice jazyka C a aj jej druhý diel. Dnes som si sadol ku knižke v kľude s tým, že už nie som v C začiatočník. Dostal som sa k veľmi jednoduchému príkladu ktorý má výsledok 7Fh pri vstupe 127. Program má prekonvertovať dekadické číslo na hexadecimálne. A dekadické má byť v rozsahu od 0 do 255 čiže unsigned. Napísal som tento kód.

int main() {
   unsigned int znak;
  scanf("%u",&znak);
    printf("%X",znak);
    return 0;
}

a samozrejme som zainkludoval hlavičkové súbory. Výsledok čo mi môj program dal je 7F. Kde je chyba??

 
Odpovědět
2.4.2016 15:52
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na ra3sk
tomisoka:2.4.2016 16:04

"%X" ti vypíše jen hexadecimální číslo, nevypisuje žádnou koncovku jako 'h', už jen kvůli tomu, že někdo by to chtěl vypsat třeba jako "0x7F". Prostě si tu koncovku napiš do toho printfu.

 
Nahoru Odpovědět
2.4.2016 16:04
Avatar
ra3sk
Člen
Avatar
ra3sk:6.4.2016 16:48

Nový problém. Keď delím 6 a 3 a potom aj 3 a 6 tak to vyjde na cislo 1. Ak je prve cislo mensie tak sa to ma prehodit. Najdete chybu?

#include <stdio.h>
#include <stdlib.h>

void vymen(float *a, float *b);
void sucet(float *a, float *b);
void rozdiel(float *a, float *b);
void sucin(float *a, float *b);
void podiel(float *a, float *b);

int main() {
    float *a,*b;
    a=(float*)malloc(sizeof(float));
    b=(float*)malloc(sizeof(float));
    int operacia,c;

    if (a==NULL || b==NULL){
        printf("Program prestal pracovat");
    }
    else {
        do{
            printf("\nZadaj 1.cislo:");
            scanf("%f", a);
            printf("Zadaj 2.cislo:");
            scanf("%f", b);
            printf("Napis cislo operacie ktoru chces vykonat\n1.Sucet\n2.Rozdiel\n3.Sucin\n4.Podiel\n:");
            scanf("%d", &operacia);
            switch (operacia) {
                case 1:
                    sucet(a, b);
                    break;
                case 2:
                    rozdiel(a, b);
                    break;
                case 3:
                    sucin(a, b);
                    break;
                case 4:
                    podiel(a, b);
                    break;
                default:
                    printf("Zadal si neplatnu operaciu");
                    break;

            }
        }while(c = getchar() != ' ');
    }
    free(a);
    free(b);
    return 0;
}

void vymen(float *a, float *b){
    float pom;
    *a = pom;
    *a = *b;
    pom = *b;
}

void sucet(float *a, float *b){
    printf("%f",*a+ *b);
}

void rozdiel(float *a, float *b){
    printf("%f",*a- *b);
}

void sucin(float *a, float *b){
    printf("%f",*a* *b);
}

void podiel(float *a, float *b){
    if(a<b){
        vymen(a,b);
        printf("%f",*a/ *b);
    }
    else
        printf("%f",*a/ *b);

}
 
Nahoru Odpovědět
6.4.2016 16:48
Avatar
Odpovídá na ra3sk
Libor Šimo (libcosenior):6.4.2016 17:15

Premenená pom sa stratí.

Editováno 6.4.2016 17:16
Nahoru Odpovědět
6.4.2016 17:15
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
ra3sk
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
ra3sk:6.4.2016 17:44

To áno ale aj keď som ju dal do globálu nad main ani to nepomohlo. Problém je v tom ze aj keď zadám 6 a potom 3 kedy by funkcia vymen nemala prebehnut sa mi vrati vysledok 1

 
Nahoru Odpovědět
6.4.2016 17:44
Avatar
Odpovídá na ra3sk
Libor Šimo (libcosenior):6.4.2016 17:47

Funkciu výmen máš zlé napísanú.

Nahoru Odpovědět
6.4.2016 17:47
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
ra3sk
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
ra3sk:6.4.2016 17:51

Aha... to som si ani nevšimol. Ďakujem za radu cením si ju. Aj keď síce tému nezavriem nakoľko sa často vyskytne takýto banálny problém.

Editováno 6.4.2016 17:51
 
Nahoru Odpovědět
6.4.2016 17:51
Avatar
Jakub Horák
Člen
Avatar
Jakub Horák:6.4.2016 17:51

Ve funkci podíl porovnáváš adresy místo hodnot. Zkus tam dát if (*a <*b) {...}

 
Nahoru Odpovědět
6.4.2016 17:51
Avatar
ra3sk
Člen
Avatar
Odpovídá na Jakub Horák
ra3sk:6.4.2016 17:55

Díky aj tvoja rada pomohla. Už to beží v pohode.

 
Nahoru Odpovědět
6.4.2016 17:55
Avatar
Odpovídá na ra3sk
Libor Šimo (libcosenior):7.4.2016 9:44

Tiež pridám jeden problémik. ;-)
Pokladňa má za úlohu vypočítať z výdavkovej sumy koľko akých bankoviek a kovových drobných má predavačka vydať.

#include <stdio.h>

void vydavok(float suma)
{
    int i, vydajEura[8], vydajCenty[6], peniazEura[] = { 500, 100, 50, 20, 10, 5, 2, 1 };
    float peniazCenty[] = { 0.5, 0.2, 0.1, 0.05, 0.02, 0.01 }, skuska = 0.0, vstupna_cena = suma;
    char *hodnotaEura[] = { "patsto", "sto", "patdesiat", "dvadsat", "desat", "pat", "dve", "jedno" };
    char *hodnotaCenty[] = { "patdesiat", "dvadsat", "desat", "pat", "dva", "jeden" };

    for (i = 0; i < 8; i++) {
        vydajEura[i] = suma / peniazEura[i];
        suma -= vydajEura[i] * peniazEura[i];
    }
    for (i = 0; i < 6; i++){
        vydajCenty[i] = suma / peniazCenty[i];
        suma -= vydajCenty[i] * peniazCenty[i];
    }
    for (i = 0; i < 8; i++) {
        if (vydajEura[i] != 0)
            printf("%s euro - %d ks = %.2f eur\n", hodnotaEura[i], vydajEura[i], (float)(peniazEura[i] * vydajEura[i]));
            skuska += (float)(peniazEura[i] * vydajEura[i]);
    }
    for (i = 0; i < 6; i++) {
        if (vydajCenty[i] != 0)
            printf("%s cent - %d ks = %.2f eur\n", hodnotaCenty[i], vydajCenty[i], (float)(peniazCenty[i] * vydajCenty[i]));
            skuska += (float)(peniazCenty[i] * vydajCenty[i]);
    }
    printf("\nSkuska spravnosti:\nVstupna cena je %.2f\nSucet vydanych bankoviek a minci je %.2f\nrozdiel je %.2f\n",
           vstupna_cena, skuska, vstupna_cena - skuska);
}

int main(void)
{
    float suma;

    printf("Zadajte sumu vydavku: ");
    scanf("%f", &suma);
    putchar('\n');
    vydavok(suma);

    return 0;
}

Pri väčšine výdavkov to vypočíta správne, ale v niektorých prípadoch nie.
Zadajte napríklad výdavok 1.08

Editováno 7.4.2016 9:45
Nahoru Odpovědět
7.4.2016 9:44
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):7.4.2016 9:50

Ten príklad som neuviedol dobrý. Rozpis peňazí vyjde správne. Skúste 1.03 a výjde to o jeden cent menej.

Nahoru Odpovědět
7.4.2016 9:50
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):7.4.2016 11:09

Poznámka.
Tú skúšku som tam pridal pre informáciu programátorovi, aby vedel nájsť riešenie.
Nie je to zložité, stačí napísať podmienku a rozpis bankviek a kovových bude správny. ;-)

Nahoru Odpovědět
7.4.2016 11:09
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Jan Doskočil:12.4.2016 22:43

Dobrý den, před několika dny jsem se tu začal učit C++. Po přečtení několika tutoriálů jsem si řekl že své znalosti otestuji a napsal jsem jednoduchou konzolovou aplikaci viz. zde:

#include <iostream>
#include <string>
#include <conio.h>
using namespace std;

int main(void)
{
        int a;
        int b;
        int c;
        char n = '\n';
        char devider[] = "--------------------------------------------------------------------------------";
        cout << n;
        cout << devider << endl;
        cout << n;
        cout << "Hello and thanks for using my math test." << endl;
        cout << n;
        cout << devider << endl;
        cout << n;
        cout << "First one" << endl;
        cout << n;
        cout << devider << endl;
        cout << n;
        cout << "8 x 12" << endl; // = 96
        cout << n;
        cout << devider << endl;
        cout << n;
        cin >> a;
        cout << n;
        if (a != 96) // when a isn´t 96
        {
                cout << "Wrong" << endl;
        }
        else // and when it is
        {
                cout << "That one was easy." << endl;
        }
        cout << n;
        cout << devider << endl;
        cout << n;
        cout << "12 : 0,5" << endl; // = 24
        cout << n;
        cout << devider << endl;
        cout << n;
        cin >> b;
        cout << n;
        if (b != 24) // if b isn´t 24
        {
                cout << "Wrong." << endl;
        }
        else // and when it is
        {
                cout << "Right, let's move to the next one!" << endl;
        }
        cout << n;
        cout << devider << endl;
        cout << n;
        cout << "( 2358 : 2 ) x 7  = 4x - 1" << endl; // x = 256
        cout << n;
        cout << devider << endl;
        cout << n;
        cin >> c;
        if (c != 256) // if c isn´t 256
        {
                cout << "Wrong." << endl;
        }
        else // and when it is correct
        {
                cout << "Very well!" << endl;
        }
        cout << n;
        cout << devider << endl;
        cout << n;
        cout << "Corect answers: 1. = 96 2. = 24 3. = 256" << endl;
        cout << n;
        cout << devider << endl;
        cout << n;
        cout << "Thanks for using my test. Created by Jan Doskocil 2016." << endl;
        cout << n;
        cout << devider << endl;
        cout << n;
        cout << "Press any key." << endl;
        _getch();
}

Z hlediska kódu je naprosto v pořádku problém ale nastává při spuštění kdy proměnná 'n' před každým příkazem 'cout' odřádkuje dvakrát a ne jednou, za příkazem už je znovu v pořádku. Nevíte někdo čím to je? Jsem naprosto bezradný a i můj o mnoho zkušenější kamarád nenašel chybu. Tak mi prosím napište nějáké řešení jinak to rovnou hodím do Akt X.

Editováno 12.4.2016 22:45
Nahoru Odpovědět
12.4.2016 22:43
"Existuje pouze 10 typů lidí, ti kteří strojovému kódu rozumí a ti kteří ne."
Avatar
ra3sk
Člen
Avatar
Odpovídá na Jan Doskočil
ra3sk:12.4.2016 22:51

Daj preč endl. To odriadkováva samo. Alebo tam nedavaj znak novej riadky. Endl sa pri takýchto jednoduchých appkách tuším, že ani nepoužíva.

Editováno 12.4.2016 22:52
 
Nahoru Odpovědět
12.4.2016 22:51
Avatar
Odpovídá na ra3sk
Jan Doskočil:12.4.2016 22:58

Jsi si opravdu jistý že je to tím? Vždyť endline jenom zalomí řádek a když na to koukám tak s tím by neměl být problém... ale stejně zkusím snad to vyjde.

Nahoru Odpovědět
12.4.2016 22:58
"Existuje pouze 10 typů lidí, ti kteří strojovému kódu rozumí a ti kteří ne."
Avatar
ra3sk
Člen
Avatar
Odpovídá na Jan Doskočil
ra3sk:12.4.2016 23:13

potom daj vediet

 
Nahoru Odpovědět
12.4.2016 23:13
Avatar
Odpovídá na ra3sk
Jan Doskočil:12.4.2016 23:18

Aaah díky (v) . Už funguje a nejspíš jsem i přišel na to proč předtím nefungoval. Nejsem moc zkušený a tak se radši ptám, ta moje proměnná 'n' řádek zalomí nebo ho přeskočí? Protože kdyby byl řádek zalomeý endlinem a na další řádek by se vypsala moje 'n' dávalo by perfektní smysl proč vynechala dva řádky. Je to tak nebo to má jiné vysvětlení?

Nahoru Odpovědět
12.4.2016 23:18
"Existuje pouze 10 typů lidí, ti kteří strojovému kódu rozumí a ti kteří ne."
Avatar
ra3sk
Člen
Avatar
Odpovídá na Jan Doskočil
ra3sk:12.4.2016 23:21

n odriadkuje. Cize ak ho das na konci vety tak skoci na novy riadok, ak das endl tak odriadkuje a potom sa pusti iba \n a to spravi tu medzeru.

 
Nahoru Odpovědět
12.4.2016 23:21
Avatar
ra3sk
Člen
Avatar
ra3sk:14.4.2016 18:49

Zdar. Problém je jednoduchý. Program sa skončí ešte pred začatím cyklu... neviem si dať rady. K C som sa teraz vrátil po práci s assemblerom tak som celkom dezorientovaný.

#include <stdlib.h>
#include <stdio.h>

int main() {
    FILE *textfile_w;
    int pocet_cisel,i,cislo;

    if ((textfile_w=fopen("textfile_get.rtf","w"))==NULL){
        printf("Subor sa nepodarilo otvorit v rezime 'write");
    }
    else{
        printf("Kolko cisel si zelas ulozit: ");
        scanf("%d",&pocet_cisel);
        printf("Mozes zacat zapisovat cisla. Cisla oddel klavesou ENTER.\n");
        for (i=0;i<pocet_cisel;i++) {
            putc(cislo,textfile_w);
        }
    }


    fclose(textfile_w);
    return 0;
}
 
Nahoru Odpovědět
14.4.2016 18:49
Avatar
LacoS.
Člen
Avatar
LacoS.:14.4.2016 19:02

pocet_cisel je pravdepodobne <= 0;

Najprv si aj vypisat premennu: pocet_cisel, a az potom spustaj cyklus;

 
Nahoru Odpovědět
14.4.2016 19:02
Avatar
Odpovídá na ra3sk
Libor Šimo (libcosenior):15.4.2016 5:48

Ten súbor sa ti neotvorí. Dôvod musíš nájsť sám.
Toto je čo?
printf("Mozes zacat zapisovat cisla. Cisla oddel klavesou ENTER.\n");
Príkaz putc() vypisuje.

Editováno 15.4.2016 5:51
Nahoru Odpovědět
15.4.2016 5:48
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):15.4.2016 6:10

Oprava.
Súbor otvoríš na zápis a v cykle sa z neho pokušaš čítať. Ak je prázdny, neprečítaš nič. :-)

Nahoru Odpovědět
15.4.2016 6:10
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):15.4.2016 7:31
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    FILE *textfile_w;
    int pocet_cisel, i, cislo;

    if ((textfile_w = fopen("textfile_get.rtf", "w")) == NULL) {
        printf("Subor sa nepodarilo otvorit v rezime 'write");
        return 1;
    }
    printf("Kolko cisel si zelas ulozit: ");
    scanf("%d", &pocet_cisel);
    printf("Mozes zacat zapisovat cisla. Cisla oddel klavesou ENTER.\n");
    for (i = 0; i < pocet_cisel; i++) {
        scanf("%d", &cislo);
        fprintf(textfile_w, "%d ", cislo);
    }
    fclose(textfile_w);

    return 0;
}
Nahoru Odpovědět
15.4.2016 7:31
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
ra3sk
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
ra3sk:15.4.2016 14:26

Vďaka, to som si ani nevšimol.

 
Nahoru Odpovědět
15.4.2016 14:26
Avatar
ra3sk
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
ra3sk:15.4.2016 14:48

Ale podla mojho názoru je stále putc() zápis znaku do súboru.

 
Nahoru Odpovědět
15.4.2016 14:48
Avatar
Odpovídá na ra3sk
Libor Šimo (libcosenior):15.4.2016 14:51

Sorry, ale zapisuje znaky, nie?

Nahoru Odpovědět
15.4.2016 14:51
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
ra3sk
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
ra3sk:15.4.2016 15:03

Ouuu... moja chyba. Už som si to uvedomil.

 
Nahoru Odpovědět
15.4.2016 15:03
Avatar
Niekto Nejakí:17.4.2016 10:29

neviem nájsť Win32 Console Application

 
Nahoru Odpovědět
17.4.2016 10:29
Avatar
ra3sk
Člen
Avatar
ra3sk:25.4.2016 20:09

Zdravím, to som znova ja. Teraz sa snažím napísať kód ktorý keď zadám text o maximálnom počte písmen 40 zistí výskyt jednotlivých malých písmen a ich počet. Vôbec neviem ako to spraviť a teraz som bol schopný napísať len toto:

#include <stdlib.h>
#include <stdio.h>

int main() {
    char text[40];
    int i;
    printf("Zadaj text:\n");
    gets(text);
    for (i=0;i<40;i++){
        if(text[i]>='a' && text[i]<='z'){

        }
    }
    return 0;
}
 
Nahoru Odpovědět
25.4.2016 20:09
Avatar
Odpovídá na ra3sk
Libor Šimo (libcosenior):26.4.2016 5:59

To si robíš srandu!

Nahoru Odpovědět
26.4.2016 5:59
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
ra3sk
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
ra3sk:26.4.2016 6:49

Nie, ak je to take lahke tak ako? ja viem iba cez switch a to by bolo cele

 
Nahoru Odpovědět
26.4.2016 6:49
Avatar
Odpovídá na ra3sk
Libor Šimo (libcosenior):26.4.2016 9:03
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    char text[40];
    int i, pocet = 0;

    printf("Zadaj text:\n");
    scanf(" %40[^\n]s", text); // načíta vetu (max. 40 znakov vrátane bielych znakov) zadanú z klávesnice ukončenú znakom enter
    for (i = 0; i < strlen(text); i++){
        if(text[i]>='a' && text[i]<='z'){
            pocet++;
        }
    }
    printf("V texte je %d malych pismen.\n", pocet);

    return 0;
}
Editováno 26.4.2016 9:05
Nahoru Odpovědět
26.4.2016 9:03
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
ra3sk
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
ra3sk:26.4.2016 14:25

to je v pohode, to viem ale ja potrebujem napísať koľko krát sa tam nachádza a, potom b... a na akych poziciach

 
Nahoru Odpovědět
26.4.2016 14:25
Avatar
Odpovídá na ra3sk
Libor Šimo (libcosenior):26.4.2016 15:44

Vložený cyklus.

Nahoru Odpovědět
26.4.2016 15:44
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):26.4.2016 20:44

Vo vonkajšom cykle budeš prechádzať abecedu, vo vnútornom budeš jednotlivé písmená porovnávať s textom.

Nahoru Odpovědět
26.4.2016 20:44
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):27.4.2016 7:26
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    char text[40];
    int i, j, pocet = 0;

    printf("Zadaj text:\n");
    scanf(" %40[^\n]s", text); // načíta vetu (max. 40 znakov vrátane bielych znakov) zadanú z klávesnice ukončenú znakom enter
    for (j = 'a'; j <= 'z'; j++) {
        pocet = 0;
        for (i = 0; i < strlen(text); i++){
            if(text[i] == j)
                pocet++;
        }
        if (pocet > 0)
            printf("V texte je %d pismen %c.\n", pocet, j);
    }

    return 0;
}
Nahoru Odpovědět
27.4.2016 7:26
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
martanec
Člen
Avatar
martanec:29.4.2016 8:31

Osobne sa mi nepaci ten vnoreny cyklus, takze by som to skusil takto:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    char text[40];
    int stat[static_cast<int>('z') - static_cast<int>('a')];
    int pocet = 0;

    printf("Zadaj text:\n");
    scanf(" %40[^\n]s", text); // načíta vetu (max. 40 znakov vrátane bielych znakov) zadanú z klávesnice ukončenú znakom enter
    for (int i = 0; i < strlen(text); i++) {
      if(text[i] >= 'a' && text[i] <= 'z')
        stat[ (static_cast<int>(text[i]) - static_cast<int>('a')) ] ++;
    }

    printf("V texte sa vyskytuju nasledujuce znaky v poctoch:\n");
    for(int i = 0; i < (static_cast<int>('z') - static_cast<int>('a')); i++){
      printf("%c znak s vyskytom %d -krat.\n", (i+static_cast<int>('a')), stat[i]);
      pocet += stat[i];
    }
    printf("Celkovy vyskyt malych pismenok v texte je %d.\n", pocet);
    return 0;
}
 
Nahoru Odpovědět
29.4.2016 8:31
Avatar
Odpovídá na martanec
Libor Šimo (libcosenior):29.4.2016 8:47

Neviem v ako IDE si to napísal, ale mne to v code::blocks vypisuje toto: obrázok.

Nahoru Odpovědět
29.4.2016 8:47
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
martanec
Člen
Avatar
martanec:29.4.2016 9:10

static_cast<in­t>('z') je len inak napisane pretypovanie int('z')

... obavam sa, ze som do C kodu zamiesal nieco z C++ a teda to C kompilator nespracuje

 
Nahoru Odpovědět
29.4.2016 9:10
Avatar
Odpovídá na martanec
Libor Šimo (libcosenior):29.4.2016 10:16

Upravil som tvoj kód ako si napísal a tu je výsledok:

Nahoru Odpovědět
29.4.2016 10:16
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na martanec
David Novák:29.4.2016 10:22

static_cast je jen v C++.. Každopádně je to nepravost a až na výjimky bys to neměl používat...

Nahoru Odpovědět
29.4.2016 10:22
Chyba je mezi klávesnicí a židlí.
Avatar
martanec
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
martanec:29.4.2016 10:26

ach ano... zabudol som na inicializovanie pola intov stat[]..

int stat[int('z') - int('a')] = {0};
 
Nahoru Odpovědět
29.4.2016 10:26
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
David Novák:29.4.2016 10:31

Jeho řešení je dobré - použití hashovací tabulky je efektivnější než vnořené cykly :)

Při přepisování jsi tam udělal chybu: (static_cast<in­t>(text[i])) ti uteklo a máš tam místo toho z, takže většina pole zůstává neiniciovaná..

A jinak poznámka - nejsem si jistý, jestli by překladač nebrblal, ale mělo by být možné indexovat znakovým literálem (uvnitř jen číslo) bez těch castů.. tj. stat[text[i] - 'a'].. A osobně bych na ten převod udělal nějakou inline funkci pro přehlednost :)

Editováno 29.4.2016 10:33
Nahoru Odpovědět
29.4.2016 10:31
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na martanec
Libor Šimo (libcosenior):29.4.2016 10:36

Tak som to inicializoval.

int stat[(int)'z' - (int)'a'] = {0};

Výsledok:

Nahoru Odpovědět
29.4.2016 10:36
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na David Novák
Libor Šimo (libcosenior):29.4.2016 10:40

Máš pravdu, špatne som to upravil. Teraz to už funguje.
Martanec, ospravedlňujem sa.

Nahoru Odpovědět
29.4.2016 10:40
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
martanec
Člen
Avatar
Odpovídá na David Novák
martanec:29.4.2016 10:52

suhlasim s tebou.

Priznam sa, kod som zbuchal v priebehu dvoch minut a netestoval som to. Chcel som len poukazat na moznost efektivnejsieho napisania algoritmu a ze to ide aj bez toho vnoreneho cyklu. Som netusil, ze si tu takto 'zatopim' :)

 
Nahoru Odpovědět
29.4.2016 10:52
Avatar
ra3sk
Člen
Avatar
ra3sk:29.4.2016 19:33

Ja som sa už dávno, ale dávno stratil :D.

 
Nahoru Odpovědět
29.4.2016 19:33
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 48 zpráv z 48.