Keresés

Hirdetés

Új hozzászólás Aktív témák

  • blaces

    tag

    Sziasztok!

    Tudtok C-hez olyan parancsot/függvényt (még kezdő vagyok) ami megállítja az exe-t (fordítás után a programot), hogy lássam az eredményt. Most tanuljuk és a C++-ból ismerős system("pause") parancsot nem engedik használni, mást helyette meg nem találtam.
    Az első hozzászólásban lévő doksik közül is ez szerepelt a syste("pause")...
    magamtól a do-while ciklusra gondoltam, hogy akarom-e újra futatni a programot, akkor látom, hogy mit akar, vagy esetleg karakter bekérést :D.
    Vagy egy C könyvet amiben benne van ez (Programozunk C nyelvben nem találtam még, de ha lenne egy ilyen, a gyakvezér orra alá tudna rakni, hogy nézd mégis létezik :D)

    Még egy kérdés, hol találhatok neten magyarul ilyen C függvény leírásokat, ami frissítve van? (google sok érdekeséget ad ki...)

  • blaces

    tag

    válasz blaces #568 üzenetére

    kiegészítés: CodeBlocks alkalmas C program fejlesztéséhez? vagy csak C++-hoz? Mintha angol szövegből ezt vettem ki, de a magyar leírásnál csak a c++-t említik.

  • blaces

    tag

    Hello! Mi ezzel a baj? nem hajlandó lefordítani a program (Codeblocks)?
    A lényeg, hogy egy egész szám fordítottját írja ki.

    #include<stdio.h>

    main()
    {
    int szam, jegy;

    printf(”Kérek egy egész számot:”);
    scanf(”%d”,&szam);
    printf(”\nA fordítottja: ”);

    do
    {
    jegy = szam % 10;
    printf(”%d”,jegy);
    szam /= 10;
    } while ( szam != 0);
    }

  • blaces

    tag

    válasz Fire/SOUL/CD #580 üzenetére

    ctrl+c és ctrl+v volt... valami a Codeblocks-sal nem jó... ha új C projektet hozzok létre, akkor kiírja hogy a projekt védett (és egy kis lakat jel rajta) illetve a main.c fájlnak az ikonja kettévan szakadva és nem nyitja meg, full új C projekt, érdekes ez a baj a C++-al is ha van valaki aki jártas ebben kérem segítsen... priviben

    DevC++ alatt megy simán, de az egyik tantárgyból nem engedik használni ezt az eszközt.

  • blaces

    tag

    válasz Fire/SOUL/CD #582 üzenetére

    köszi, nem egy létezőt akartam :) már az első projektnél is ezt írta, ki, jót töltöttem le ahogy te is írtad, a beállítást meg mindjá meglesem :)

    Egyenlőre a beadandóval kínlodok: ezt a részt nem tudom megcsinálni:
    beolvass egy ötjegyű természetes számot,( a többi már működött ennek a kódját másoltam be.) ezt hogyan kell?

  • blaces

    tag

    válasz blaces #583 üzenetére

    javítok: az ötjegyű természetes szám: azaz hogy megszámolja a számjegyeket és ha kisebb !=5-el akkor kiír egy hibaüzenetet és vége a programnak, azt már sejtem, hogy if-fel kell (bocs de tényleg amatőr vagyok még...), csak ennek az ötletét nem sejtem, hogy hogyan lehet számjegyeket számolni.

  • blaces

    tag

    válasz doc #585 üzenetére

    Kösz, ez nagyon ott van :D, az biztos hogy ezt egy életre megjegyeztem :D

  • blaces

    tag

    Miért hagyja figyelmetlenül az else ágat? a feltételben mit adtam meg rosszul, hogy nem nem veszi figyelembe?

    #include<stdio.h>

    main()
    {
    int szam, fszam;

    printf("Kerek egy otjegyu termeszetes szamot:");
    scanf("%d",&szam);

    if (9999 <= szam <=100000)
    {
    printf("\nA fordítottja: ");

    do
    {
    fszam = szam % 10;
    printf("%d",fszam);
    szam /= 10;
    } while ( szam != 0);
    getch();
    return 0;
    }

    else
    {

    printf("Nem otjegyu termeszetes szamot adtal meg! Probald ujra!");
    getch();
    }
    return 1;
    }

  • blaces

    tag

    válasz ArchElf #589 üzenetére

    Kösz, szóval ha kiértékeli az egyik egyenlőség jelet, akkor már nem foglalkozik a másikkal? (erre nem gondoltam)

    és ezért kell így külön kétszer megadni a feltételt... vagyis hogy a változót azt mindig egy reláció jellel kell szerepeltetni? (nem egyszerre kettővel ahogy én csináltam)
    /csak egy artimetikai műveleti jelet kaphat, és nem kettőt/

  • blaces

    tag

    válasz sghc_toma #592 üzenetére

    1.így már értem :) ez így már világos :)
    2.Igaz, jobban odafigyelek az ilyesmire

    Kösz mindenkinek a segítséget, a végén még megszeretem a C programozást :)

  • blaces

    tag

    válasz ArchElf #594 üzenetére

    Az előző hsz. alapján én is így logikáztam. Áttekinthetően leírtad, most már világos, hogy akkor mit csinál "valójában" az if függvényem.

    Ez a 0, 1 igaz, hamis-os kiértékelés magyarázattal (jó ez a szemlélet mód), már tényleg értem, hogy miért így csinálta elsőnek :) ezek után szerintem már én is megtudom csinálni, hogy mit csinál az if függvény, vagy leellenőrizni magam. :R

  • blaces

    tag

    /* Feladat:
    Írjunk programot, amely kiszámolja és kiírja egy gépkocsi fékútját a sebesség és
    az útviszonyok függvényében. A feltételezett lassulás:
    a) normál úton: 4.4
    b) vizes úton: 3.4
    c) vizes, nyálkás úton: 2.4
    reakcióidő: 1 másodperc
    A gépkocsi kezdő sebessége bemenő adat.*/

    #include <stdio.h>

    main()
    {
    double b, v, aa=4.4, ab=3.4, ac=2.4, s, s1, s2; /* aa=normál út, ab=vizes út, ac=vizes, nyálkás út */
    int t=1, menu;

    //Menü létrehozása, hogy mely útviszonyok között számoljon a program
    printf ("Melyik utviszonyt vizsgáljam?\n 1-Normal ut,\n 2-Vizes ut,\n 3-Vizes, Nyalkas ut\n");
    scanf ("%d", &menu);

    switch (menu)
    {
    case 1:
    {
    printf("Kerem a kezdosebesseget:\n");
    scanf ("%lf", &b);
    v=b/3.6;
    s1=v*t;
    s2=v*v/2*aa;
    s=s1+s2;
    printf("Gepkocsi fekutja normal uton: s=%lf", &s);
    break;
    }
    case 2:
    {
    printf("Kerem a kezdosebesseget:\n");
    scanf ("%lf", &b);

    break;
    }
    case 3:
    {
    printf("Kerem a kezdosebesseget:\n");
    scanf ("%lf", &b);

    break;
    }
    default:
    {
    printf("Hiba\n");
    break;
    }

    }
    getch();
    return 0;
    }

    Hibalista:
    C:\Documents and Settings\hallgato\Dokumentumok\utviszony.c In function `main':
    18 C:\Documents and Settings\hallgato\Dokumentumok\utviszony.c syntax error before '/' token
    18 C:\Documents and Settings\hallgato\Dokumentumok\utviszony.c stray '\252' in program
    aztán így tovább csak a számok különböznek... a 252 helyett 246 és stb.

    Úgy építettem fel mint az órán csináltuk az egyik feladatot, de ott nem rinyált (igaz ott megjegyzést sem tettem be) itt nem tudom hogy mi a baj.

  • blaces

    tag

    válasz blaces #602 üzenetére

    Mivel erősen az órai vázlatra építettem, ezt hogyan lehetne szebben is megírni, hogy a case ágakban ne ismétlődjön a képlet (mert csak az aa, ab, ac változokat kell módosítani).

    Erre gondoltam, hogy if else else-vel készíteném el, hogy

    printf("Kerem a kezdosebesseget:\n");
    scanf ("%lf", &b);
    v=b/3.6;
    s1=v*t;
    if (választottmenüpont == 1) {
    s2=v*v/2*aa;}
    else (választottmenüpont ==2){
    s2=v*v/2*ab;}
    else (választottmenüpont == 3){
    s2=v*v/2*ab;}
    s=s1+s2;
    printf("Gepkocsi fekutja normal uton: s=%lf", &s);

    (vázlatosan)

  • blaces

    tag

    válasz doc #605 üzenetére

    igen az elírás volt :DD Nem kell a case 1: case 2: case 3: esetén nem kell {} jel? az enyémnél szerepel, így mutatták órán...
    (ez tényleg szebb és egyszerűbb megoldás kösz :R )

    Viszont ha getchar()-t írtam be akkor is ugyanaz a szintaktikai hibája van...

  • blaces

    tag

    szintaktikai hiba megoldva :D csak a megjegyzést kellett kitörölnöm...

    /* Feladat:
    Írjunk programot, amely kiszámolja és kiírja egy gépkocsi fékútját a sebesség és
    az útviszonyok függvényében. A feltételezett lassulás:
    a) normál úton: 4.4
    b) vizes úton: 3.4
    c) vizes, nyálkás úton: 2.4
    reakcióidő: 1 másodperc
    A gépkocsi kezdő sebessége bemenő adat.*/

    #include <stdio.h>

    main()
    {
    double b, v, aa=4.4, ab=3.4, ac=2.4, s, s1, s2; /* aa=normál út, ab=vizes út, ac=vizes, nyálkás út */
    int t=1, menu;

    printf ("Melyik utviszonyt vizsgaljam?\n 1-Normal ut,\n 2-Vizes ut,\n 3-Vizes, Nyalkas ut\n");
    scanf ("%d", &menu);

    printf("Kerem a kezdosebesseget:\n");
    scanf ("%lf", &b);
    v=b/3.6; /* km/h órát átkonvertálja m/s-ba */
    s1=v*t;

    switch (menu)
    {
    case 1: s2=v*v/2*aa; break;
    case 2: s2=v*v/2*ab; break;
    case 3: s2=v*v/2*ac; break;
    default: printf("Hiba"); break;
    }
    s=s1+s2;
    printf("Gepkocsi fekutja normal uton:\n");
    printf ("s=%lf", &s);

    getch();
    return 0;
    }

    Eredményre mindig ezt dobja ki: s=0.00000

    [feladathoz megadott segédlet linkje:]

  • blaces

    tag

    köszi :)

    Van különbség a b/3.6=v (ebbe beleköt a fordító) és a v=b/3.6 művelet végrehajtása között?

    azt akarom, hogy a v egy méter/sec egység legyen, mert a b km/h-ban van...
    valahol valamit elszámol a program...

    [ Szerkesztve ]

  • blaces

    tag

    Sziasztok!

    Én csak annyit találtam a végtelen ciklusokról, hogy ha a feltétélük mindig igaz, akkor végtelen ciklus lesz. Csak akkor lép ki a feltételből ha az már hamissá teszi.
    Ezek közül melyik végtelen ciklus és miért? hogyan értelmezi ezt a program? (az if-eset jól elmagyaráztatok anno)
    a, i=10, while (i);
    b, while (i=10) i;
    c, for(x=1; x=10; x++);
    d, for(x=1; x==10; x++);

    Szerintem az a, c, d végtelen ciklus

  • blaces

    tag

    válasz doc #635 üzenetére

    Kösz :R az első kettőnél vágom, hogy akkor hogyan lehet igaz a feltétel :)

    A harmadiknál értem, hogy miért nem megy be a ciklusba, mivel ott igazából nincs feltétel, csak kétszer lett megadva az x, de azt nem értem, hogy miért végtelen :(

    A negyedik azért véges, mert addig csinálja amíg egyenlő lesz 10-el az x, de amint 11 lesz az x értéke akkor 0 lesz, azaz hamis, így véges a ciklus

  • blaces

    tag

    válasz doc #639 üzenetére

    köszi, köszi, vágom a harmadikat, és a negyediknél akkor igazából le sem fut a ciklus, hát ez így rohadt jó, már értem ezt is, hogy hogyan működik a C-ben :)

  • blaces

    tag

    Sziasztok!

    Most hardcore szinten belefogtam a C tanulásába magamtól (könyv alapján) eldöntöttem, hogy ideje normálisan megtanulni programozni ,persze közben a félévben is tanulni kell az egyetemen :DDD

    A könyv azt írja, hogy a ?: operátor jobbról balra típusú... egy fél nap alatt a többire rájöttem, hogy miért olyan asszociativitással rendelkezik. A könyv két példát hozz fel erre az operátorra:

    x < y ? (min1 = x) : (min1 = y);
    min2 = x < y ? x : y;

    az utóbbinál értem, mert ez olyan mint egy értékadás :)) , de az első verziónál nem látom, hogy mitől lenne ez jobbról balra... nekem balról jobbra félének látszik.

  • blaces

    tag

    válasz gygabor88 #807 üzenetére

    Kösz, vágom az elméletét. Olyan mintha egy egymásba ágyazott IF utasítás lenne.

  • blaces

    tag

    válasz celeron #830 üzenetére

    Celeron: Pasz, én nem tudok segíteni ez ügyben, esetleg próbálkozz mással [CodeBlocks] ez Linuxon is elérhető.

    Csak nem Debreceni Egyetem?

    Cellpeti a fenti linken 64-bites linux változatot találsz a CodeBlocks-ból :))

    [ Szerkesztve ]

  • blaces

    tag

    Sziasztok!

    Van néhány kód aminél nem értem, hogy miért ennyi az eredmény, vagy én nem tudom már nyomon követni,

    int i=5, j=0;
    while ( --i>0 && j++<5)
    printf("%d, %d\n", i, j);

    Itt i=0, j=4 megoldókulcs szerint, de miért?

    int i=0, j=0;
    while (i++<5 && j++<5)
    printf("%d, %d\n", i, j);

    Itt i=6, j=5

    int i=0
    for (i++; ++i<=10; i++)
    printf("szöveg");

    Ez miért csak egyszer fut le? nem 5-ször kéne?

    Mert én más megoldásra gondoltam, de az nem jó... lehet rosszul gondolkozom.
    Csak jó lenne ha valaki érthetően eltudná magyarázni, hogy miért :F
    Köszi a segítséget előre is :R

  • blaces

    tag

    válasz Davey7 #860 üzenetére

    Amúgy ez nem lenne jobb?

    while (!(szam && mertekegyseg))

    Szerintem erre akart gondolni haver...
    Ilyen példát láttam könyvben és én is alkalmaztam egyszerű proginál:
    while (a%2 ==0) az ekvivalens ezzel while (!(a%2)) ---> ugyanis !() ilyenkor a ! jel a zárójelben lévő kifejezésnek 0-t ad eredményül ebben a példában.

  • blaces

    tag

    Sziasztok!

    Nem tagadom beadandó házifeladat :U A lenti kódból látszik is, hogy milyen kezdő vagyok...
    A feladat ez akar lenni: Írj programot, amely a népszerű kő-papír-olló játék végeredményét segít eldönteni! Ezt a játékot ketten játsszák és több körből áll. A program írja a standard outputra, hogy melyik játékos nyert! Ha az első, a kimeneten az "elso" szó jelenjen meg, ha a második, akkor a "masodik", ha pedig döntetlen lett a játék végeredménye, akkor a "dontetlen" szó! (A körök összesített eredményét kell kiíratni.) A program bemenetként megkapja a körök számát, majd utána soronként két betűt, szóközzel elválasztva. Ez a két betű jelenti az első, ill. a második játékos választását (k - kő, p - papír, o - olló). Mindig az nyeri a kört, akinek a választása "erősebb" a másik játékosénál (a kő kicsorbítja az ollót, az olló elvágja a papírt, a papír becsomagolja a követ).
    példa bemenetre:
    3
    p k
    k o
    p p

    erre a kimenet: elso

    #include <stdio.h>

    int main(){

    int n, elso, masodik;
    char p, k, o;
    int i=1;
    int elsonyer=0;
    int masodiknyer=0;
    scanf("%d", &n);

    while(i<=n){
    scanf("%c %c", &elso, &masodik);

    if(elso=='p' && masodik=='k')
    elsonyer+=1;
    else if(elso=='p' && masodik=='o')
    masodiknyer+=1;
    else if(elso=='k' && masodik=='p')
    masodiknyer+=1;
    else if(elso=='k' && masodik=='o')
    elsonyer+=1;
    else if(elso=='o' && masodik=='p')
    elsonyer+=1;
    else if(elso=='o' && masodik=='k')
    masodiknyer+=1;
    i++;
    }

    if (elsonyer>masodiknyer)
    printf("elso\n");
    else if (elsonyer<masodiknyer)
    printf("masodik\n");
    else
    printf("dontetlen\n");

    return 0;

    }

    A körök számát bekéri, aztán beadom neki, hogy:"p k" nyomok egy entert, erre eredményül azt írja ki, hogy döntetlen :(((

    Hol lehet a hiba? :U

  • blaces

    tag

    válasz Benmartin #880 üzenetére

    Szia!

    kijavítottam (így értettem a javítást):

    #include <stdio.h>

    int main(){

    int n;
    char elso, masodik, p, k, o;
    int i=1;
    int elsonyer=0;
    int masodiknyer=0;
    scanf("%d", &n);

    while(i<=n){
    scanf("%s %s", &elso, &masodik);

    if(elso=='p' && masodik=='k')
    elsonyer+=1;
    else if(elso=='p' && masodik=='o')
    masodiknyer+=1;
    else if(elso=='k' && masodik=='p')
    masodiknyer+=1;
    else if(elso=='k' && masodik=='o')
    elsonyer+=1;
    else if(elso=='o' && masodik=='p')
    elsonyer+=1;
    else if(elso=='o' && masodik=='k')
    masodiknyer+=1;
    i++;
    }

    if (elsonyer>masodiknyer)
    printf("elso\n");
    else if (elsonyer<masodiknyer)
    printf("masodik\n");
    else
    printf("dontetlen\n");

    return 0;

    }

    De még mindig ugyanaz a baja...

    Viszont ha scanf("%c %c",&elso, &masodik)-ot használok, akkor hajlando másodjára is bekérni a karaktereket, de ugyanúgy döntetlent ír ki :DD

  • blaces

    tag

    válasz Benmartin #882 üzenetére

    Köszi, megy! :R

    Miért kellett globálisan deklarálni? Valahányszor csináltunk valamit a laboron, akkor mindig main-en belül volt a deklarálás, meg a globális változónak úgy tudom akkor van jelentősége ha több függvényt használok.

    és a scanf("%s %s", &elso, &masodik)-nál azért kellett %s %c helyet, mert a %s után karakterlánc (elso, masodik van), és nem pedig egy karakter( pl: a, b)?

    Csak szeretném érteni, miért így jó a program :)

  • blaces

    tag

    válasz Benmartin #884 üzenetére

    Köszönöm :K

    A while és a scanf közé raktam az fflush(stdin) függvényt

    while(i<=n){
    fflush(stdin);
    scanf("%c %c",&elso,&masodik);

    és így simán ment %c-vel is, és köszönöm hozzá a magyarázatot érthető volt és sokat segített! Ekkor már ugye nem volt a %s-es hiba így elkezdtem kísérletezni.

    Kiszedtem a globális változókat (char elso, masodik) és beraktam a main()-be. És érdekes módon ment! Hibátlanul :R

  • blaces

    tag

    válasz Jester01 #885 üzenetére

    köszi a segítséget mindkettőtöknek!

    scanf(" %c %c",&elso,&masodik); - így tényleg megy.

    jelenleg két könyvet olvasok át ez ügyben, de nem találtam ehhez hasonló példát, ahol két karaktert olvass be, vagy hogy miért kell szóköz oda, vagy mit hogyan befolyásolja a /n ezt az egészet.

    Szóval nálam a hiba a /n miatt volt, ami az okozta, hogy ha egy sorból kellett olvasnia két karaktert, akkor az első karakter után berakott egy sortörést, és a scanf a második sorból akarta olvasni a második karaktert? és emiatt valamilyen túlcsordulás történt?

  • blaces

    tag

    válasz Jester01 #889 üzenetére

    kösz, így értem, hogy miért volt rá szükség. A példával eltudom már képzelni a próblémát. :)

    Lortech nekem ez már egy picit magas :DDD habár gondolom hogy valami olyasmit akartál írni, hogy az elsonyer+=1 helyett elsonyer++ használjak. A többi részt nem nagyon értettem a szépítésnek, bocsi.
    Meg jobb az ha csak annyit finomítok rajta amennyit értek, mert ha meg kell védeni a progit (van valami plágium ellenörző) akkor eltudjam magyarázni. De szívesen megtanulnám a rövidebb(szebb) formákat is.

  • blaces

    tag

    válasz Lortech #892 üzenetére

    elméletben értem, de gyakorlatban még nem bírtam megvalósítani ezt. Majd ha kész lesz még kettő akkor visszatérek rá. Kösz.

  • blaces

    tag

    Ez meg egy másik beadandó, én így tudtam értelmezni és megoldani... de ez olyan is...
    A feladat ez:
    [I]Írj programot, amely a standard inputról olvas karaktereket az EOF fájlvége jelig, és kiírja a képernyőre a bemenetnek megfelelő "mobiltelefonos kódolást", vagyis azt, hogy melyik gombot hányszor kell lenyomnunk, ha egy mobiltelefon segítségével szeretnénk előállítani az adott karaktersorozatot! A betűk elhelyezkedése a következő: (mint a mobil telefon)

    Az adott gomb száma annyiszor jelenjen meg a kimeneten, ahányszor azt le kell ütnünk! Például, ha az 5-ös gombot kell megnyomnunk háromszor, a program ezt 555-tel jelezze! Új billentyű lenyomásakor az előző és az új között ne legyen az outputon szóköz, csak abban az esetben, ha ismét ugyanaz a gomb következik, amelyet ezt megelőzően használtunk! A kis- és nagybetűk között nincs különbség.

    Pl:
    bemenet:Szauervein Szabolcs
    kimenet: 777799992883377788833444661777799992 226665552227777 [/I]

    #include <stdio.h>
    int main() {

    char nev[10000];
    int i=0;
    int j=0;

    gets(nev);
    while(i<(strlen(nev))){


    if (nev[i]=='a' || 'A') {
    if (nev[i-1]=='a' || 'A' || nev[i-1]=='b' || 'B' || nev[i-1]=='c' || 'C') {
    printf(" "); }
    printf("2"); }
    else if (nev[i]=='b' || 'B') {
    if (nev[i-1]=='b' || 'B' || nev[i-1]=='a' || 'A' || nev[i-1]=='c' || 'C') {
    printf(" "); }
    printf("22"); }
    else if (nev[i]=='c' || 'C') {
    if (nev[i-1]=='c' || 'C' || nev[i-1]=='a' || 'A' || nev[i-1]=='b' || 'B') {
    printf(" "); }
    printf("222"); }
    else if (nev[i]=='d' || 'D') {
    if (nev[i-1]=='d' || 'D' || nev[i-1]=='e' || 'E' || nev[i-1]=='f' || 'F') {
    printf(" "); }
    printf("3"); }
    else if (nev[i]=='e' || 'E') {
    if (nev[i-1]=='e' || 'E' || nev[i-1]=='d' || 'D' || nev[i-1]=='f' || 'F') {
    printf(" "); }
    printf("33"); }
    else if (nev[i]=='f' || 'F') {
    if (nev[i-1]=='f' || 'F' || nev[i-1]=='d' || 'D' || nev[i-1]=='e' || 'E') {
    printf(" "); }
    printf("333"); }
    else if (nev[i]=='g' || 'G') {
    if (nev[i-1]=='g' || 'G' || nev[i-1]=='h' || 'H' || nev[i-1]=='i' || 'I') {
    printf(" "); }
    printf("4"); }
    else if (nev[i]=='h' || 'H') {
    if (nev[i-1]=='h' || 'H' || nev[i-1]=='g' || 'G' || nev[i-1]=='i' || 'I') {
    printf(" "); }
    printf("44"); }
    else if (nev[i]=='i' || 'I') {
    if (nev[i-1]=='i' || 'I' || nev[i-1]=='g' || 'G' || nev[i-1]=='h' || 'H') {
    printf(" "); }
    printf("444"); }
    else if (nev[i]=='j' || 'J') {
    if (nev[i-1]=='j' || 'J' || nev[i-1]=='k' || 'K' || nev[i-1]=='l' || 'L') {
    printf(" "); }
    printf("5"); }
    else if (nev[i]=='k' || 'K') {
    if (nev[i-1]=='k' || 'K' || nev[i-1]=='j' || 'J' || nev[i-1]=='l' || 'L') {
    printf(" "); }
    printf("55"); }
    else if (nev[i]=='l' || 'L') {
    if (nev[i-1]=='l' || 'L' || nev[i-1]=='j' || 'J' || nev[i-1]=='k' || 'K') {
    printf(" "); }
    printf("555"); }
    else if (nev[i]=='m' || 'M') {
    if (nev[i-1]=='m' || 'M' || nev[i-1]=='n' || 'N' || nev[i-1]=='o' || 'O') {
    printf(" "); }
    printf("6"); }
    else if (nev[i]=='n' || 'N') {
    if (nev[i-1]=='n' || 'N' || nev[i-1]=='m' || 'M' || nev[i-1]=='o' || 'O') {
    printf(" "); }
    printf("66"); }
    else if (nev[i]=='o' || 'O') {
    if (nev[i-1]=='o' || 'O' || nev[i-1]=='m' || 'M' || nev[i-1]=='n' || 'N') {
    printf(" "); }
    printf("666"); }
    else if (nev[i]=='p' || 'P') {
    if (nev[i-1]=='p' || 'P' || nev[i-1]=='q' || 'Q' || nev[i-1]=='r' || 'R' || nev[i-1]=='s' || 'S') {
    printf(" "); }
    printf("7"); }
    else if (nev[i]=='q' || 'Q') {
    if (nev[i-1]=='q' || 'Q' || nev[i-1]=='p' || 'P' || nev[i-1]=='r' || 'R' || nev[i-1]=='s' || 'S') {
    printf(" "); }
    printf("77"); }
    else if (nev[i]=='r' || 'R') {
    if (nev[i-1]=='r' || 'R' || nev[i-1]=='p' || 'P' || nev[i-1]=='q' || 'Q' || nev[i-1]=='s' || 'S') {
    printf(" "); }
    printf("777"); }
    else if (nev[i]=='s' || 'S') {
    if (nev[i-1]=='s' || 'S' || nev[i-1]=='r' || 'R' || nev[i-1]=='p' || 'P' || nev[i-1]=='q' || 'Q') {
    printf(" "); }
    printf("7777"); }
    else if (nev[i]=='t' || 'T') {
    if (nev[i-1]=='t' || 'T' || nev[i-1]=='u' || 'U' || nev[i-1]=='v' || 'V') {
    printf(" "); }
    printf("8"); }
    else if (nev[i]=='u' || 'U') {
    if (nev[i-1]=='u' || 'U' || nev[i-1]=='t' || 'T' || nev[i-1]=='v' || 'V') {
    printf(" "); }
    printf("88"); }
    else if (nev[i]=='v' || 'V') {
    if (nev[i-1]=='v' || 'V' || nev[i-1]=='t' || 'T' || nev[i-1]=='u' || 'U') {
    printf(" "); }
    printf("888"); }
    else if (nev[i]=='w' || 'W') {
    if (nev[i-1]=='w' || 'W' || nev[i-1]=='x' || 'X' || nev[i-1]=='y' || 'Y' || nev[i-1]=='z' || 'Z') {
    printf(" "); }
    printf("9"); }
    else if (nev[i]=='x' || 'X') {
    if (nev[i-1]=='x' || 'X' || nev[i-1]=='w' || 'W' || nev[i-1]=='y' || 'Y' || nev[i-1]=='z' || 'Z') {
    printf(" "); }
    printf("99"); }
    else if (nev[i]=='y' || 'Y') {
    if (nev[i-1]=='y' || 'Y' || nev[i-1]=='w' || 'W' || nev[i-1]=='x' || 'X' || nev[i-1]=='z' || 'Z') {
    printf(" "); }
    printf("999"); }
    else if (nev[i]=='z' || 'Z') {
    if (nev[i-1]=='z' || 'Z' || nev[i-1]=='w' || 'W' || nev[i-1]=='x' || 'X' || nev[i-1]=='y' || 'Y') {
    printf(" "); }
    printf("9999"); }
    else if (nev[i]=='0') {
    if (nev[i-1]=='0') {
    printf(" "); }
    printf("0"); }
    else if (nev[i]==' ') {
    printf("1"); }
    i++;
    }

    }

    printf("\n");
    return(0);
    }

    Az a baj, hogy most sulis gépen vagyok... itt csak devc++ van, és a printf előtt valami szintaktikai hibát jelezz. Előtte majdnem jó volt a program, csak akkor minden egyes megegyező karakter elé szóközt rakott ki... Nem tudom mi a gond. :(

    Másik megoldásom az lett volna, hogy karaktertömböt hozok létre, és akkor azon megy egy keresés. De viszont ennél nem volt ötletem, a szóköz (space) próblémára, hogy azt hogyan valósítsam meg.

  • blaces

    tag

    válasz Jester01 #895 üzenetére

    véletlenül kétszer küldtem el a hsz-t és nem tom, hogy kell törölni. Bocs.

    [ Szerkesztve ]

  • blaces

    tag

    válasz Lortech #900 üzenetére

    Lortech köszönöm a kódot. Igyekszem átjavítani. Bocs a késői reagálásért, de közben zh időszak is van, így elvagyok havazva. És szívesen várom a további kritikákat :)
    gets() függvényhez annyit, hogy nem csak suliban alkalmazák, hanem könyvekben is... az fgets-et csak megemlítették, példa feladat mindegyike a gets()-el volt. Úgyhogy az a link nagyon jól jött. A többi "hibát" meg megpróbálom még magam kijavítani, csak a könyveken és a prohardveren kívül nem tudok másra támaszkodni, és a ezek szerint a könyvek alapján is betanulom a nem ajánlott kategóriákat.

    Jester01 értettem, majd törekszem arra, hogy jó C programozó legyek :)

    Ismét kéne egy kis help. Google-val nem tudtam, hogy hogyan kell arra még rákeresni, hogy ha több for ciklust eggyé alakítani. Meg angolul sem kaptam értelmes találatot a havi cikluson kívül...

    for(i=1; i<=terfog; i++){
    for(j=i; j<=terfog; j++){
    for(k=j; k<=terfog; k++){
    if(i*j*k==terfog)
    teglatestek++;
    }
    }
    }

    , hogy ezt a 3 for ciklust kéne 1 ciklusba írni, vagy gyorsabb formába, amiatt nem kaptam rá pontot mert lassú..., próbáltam az alap tudásommal is papíron, de ötletem sincs. Mivel j és k az előző for ciklusból kapja az értékét...

  • blaces

    tag

    válasz Jester01 #905 üzenetére

    Feladat:

    Írj programot, amely a bemenetről beolvas egy természetes számot - egy térfogatot! A program írja a szabványos kimenetre, hogy hány különböző téglatesthez tartozhat ez a térfogat! (A téglatestek oldalhossza csak egész szám lehet!)

    Példa:

    bemenet- kimenet
    27 - 3
    4 - 2
    99 - 4
    254 - 2

    Nekem erre csak a 3 for ciklusos megoldás jutott eszembe

    [ Szerkesztve ]

  • blaces

    tag

    válasz Jester01 #908 üzenetére

    konkrétan mondta a gyakvezér, hogy a 3 ciklus valami mást kell..., hogy a program 5 másodpercen belül legyen... (vagy millisecundum...).
    Rákérdezek mélben a gyakvezérnél, és még alszok rá egyet, holnap éjfélig van a beadási határidő, hátha eszembe jut valami okosság álomközben.

    a primtényezős felbontást meglestem. A wikipédián talált kóddal ellenőriztem le, a 99 kivételével mindegyikre annyi prím számot adott le amennyi a példában a kimenten szerepel.

    "Ha osztója, akkor gyorsan le is kell osztani és belső ciklusban már csak ezt felbontani."
    Ez hogy nézz ki egy példa kódban? if (terfogat%i==0) eddig oké a további részt nem tudom megvalósítani :(

  • blaces

    tag

    válasz Jester01 #910 üzenetére

    húúú köszi. :R na majd holnap este fele összedobok valamit és megosztom :DDD

  • blaces

    tag

    válasz Jester01 #910 üzenetére

    Igen a ciklus gyorsabb, az valóban nem jó neki. A 2 for ciklus megengedett...

    #include <stdio.h>


    int main(){

    int terfog;
    int i, j, k;
    int teglatestek=0;
    /*int rovidebb;*/

    scanf("%d", &terfog);
    /*rovidebb=terfog/2;*/

    for(i=1; i<=terfog/i; i++){
    if (!(terfog%i)){

    for(j=i; j<=terfog/j; j++){
    if (!(terfog%j)){
    k=terfog/(i*j);
    if(k>=j)
    teglatestek++;
    }
    }
    }
    }

    printf("%d\n", teglatestek);

    return 0;
    }

    Na így tudtam rövidíteni (a tegnapi fórumozásból így tudtam kivenni.), de most nem tudom, hogy hol a hiba, a példa esetekből a 254-re 3-t ad, holott 2-öt kéne adnia, a többire annyit ad amennyit illik neki.

    [ Szerkesztve ]

  • blaces

    tag

    Hello!

    Ismét egy feladathoz kéne segítség.
    A feladat két hosszú egész szám összeszorzása (olyannyira hosszú, hogy a long double-kbe se ment bele, ezért stringeztem) 3 napig tartott az összehegesztése...

    Feladat: Írj programot, amely két hosszú egész számot szoroz össze! Csak pozitív számok fordulnak elő a bemeneten, viszont ezek tetszőlegesen sok 0-val kezdődhetnek. Egy szám legfeljebb 100 számjegyből áll. A két szám két egymást követő sorban helyezkedik el. A program kimenetén nem lehetnek vezető nullák!
    Bemenet: Kimenet:
    2. eset:
    0000789675 19375465800
    24536
    3. eset:
    0000000000000000000000000000000000000000000000000000 0.
    35363567

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

    #define MAX_NUMBER 200

    int toInt(char ch) {
    return (ch - '0');
    }

    char toChar(int num) {
    return (num + '0');
    }

    void eraseNewLine(char* str) {
    size_t len;

    len = strlen(str);
    if (len > 0 && str[len-1] == '\n') {
    str[len-1] = '\0';
    }
    }

    void eraseNulls(char* str) {
    unsigned int count = 0;
    size_t i = 0;
    size_t len;
    char c;

    len = strlen(str);
    c = str[0];

    while (c != '\0') {
    c = str[i];
    i++;
    if (c == '0') {
    count++;
    } else {
    break;
    }
    }

    if (count == len) {
    str[0] = '0';
    str[1] = '\0';
    } else if (count > 0) {
    memcpy(str, str+count, (len-count+1));
    }
    }

    void addNulls(int num, char* solution) {
    size_t len;
    unsigned int i;

    len = strlen(solution);
    if (num > 0) {
    for (i = 0; i < num; i++) {
    solution[len+i] = '0';
    }
    solution[i+len] = '\0';
    }
    }

    void changeStr(char* s1, char* s2) {
    char temp[2*MAX_NUMBER];
    size_t l1;
    size_t l2;

    l1 = strlen(s1);
    l2 = strlen(s2);

    memcpy(temp, s1, l1+1);
    memcpy(s1, s2, l2+1);
    memcpy(s2, temp, l1+1);
    }

    void multiplyWithOneChar(char x, char* y, char* solution) {
    unsigned int xv = toInt(x);
    unsigned int yi;
    unsigned int tempi;
    unsigned int carry = 0;
    char temp[2*MAX_NUMBER];
    unsigned int i;
    size_t len;

    len = strlen(y);
    for (i = 0; i < len; i++) {
    yi = toInt(y[len-i-1]);
    tempi = yi * xv + carry;
    if (tempi > 9) {
    carry = tempi / 10;
    yi = tempi % 10;
    } else {
    carry = 0;
    yi = tempi;
    }
    temp[i] = toChar(yi);
    }
    if (carry > 0) {
    temp[i] = toChar(carry);
    temp[i+1] = '\0';
    } else {
    temp[i] = '\0';
    }

    len = strlen(temp);
    for (i = 0; i < len; i++) {
    solution[i] = temp[len-i-1];
    }
    solution[i] = '\0';
    }

    void add(char* y, char* solution) { // solution = solution + y;
    unsigned int yi;
    unsigned int si;
    unsigned int tempi;
    unsigned int carry = 0;
    char temp[2*MAX_NUMBER];
    unsigned int i;
    size_t len;
    size_t lens;

    len = strlen(y);
    lens = strlen(solution);
    if (lens > len) {
    changeStr(y, solution);
    len = strlen(y);
    lens = strlen(solution);
    }
    for (i = 0; i < len; i++) {
    yi = toInt(y[len-i-1]);
    if (i < lens) {
    si = toInt(solution[lens-i-1]);
    } else {
    si = 0;
    }
    tempi = yi + si + carry;
    if (tempi > 9) {
    carry = tempi / 10;
    yi = tempi % 10;
    } else {
    carry = 0;
    yi = tempi;
    }
    temp[i] = toChar(yi);
    }
    if (carry > 0) {
    temp[i] = toChar(carry);
    temp[i+1] = '\0';
    } else {
    temp[i] = '\0';
    }

    len = strlen(temp);
    for (i = 0; i < len; i++) {
    solution[i] = temp[len-i-1];
    }
    solution[i] = '\0';
    }

    void multiply(char* x, char* y, char* solution) {
    size_t len;
    unsigned int i;
    char temp[2*MAX_NUMBER];

    eraseNewLine(x);
    eraseNewLine(y);
    eraseNulls(x);
    eraseNulls(y);
    solution[0] = '0';
    solution[1] = '\0';

    len = strlen(y);
    for (i = 0; i < len; i++) {
    multiplyWithOneChar(y[len-i-1], x, temp);
    addNulls(i, temp);
    add(temp, solution);
    }
    }

    int main() {
    char first[MAX_NUMBER];
    char second[MAX_NUMBER];
    char solution[2*MAX_NUMBER];

    fgets(first, MAX_NUMBER, stdin);
    fgets(second, MAX_NUMBER, stdin);
    multiply(first, second, solution);
    printf("%s\n", solution);

    return 0;
    }

    és a második esett az ahol, a második számjegyig végig adja ki a nullákat, az elsőre(ezt nem írtam fentebb) és másodikra jó!

  • blaces

    tag

    válasz Jester01 #937 üzenetére

    char first[MAX_NUMBER];
    char second[MAX_NUMBER];
    char solution[2*MAX_NUMBER];
    int solution0=0;

    fgets(first, MAX_NUMBER, stdin);
    if (first==0)
    printf("%d\n", solution0);

    így gondoltad? :), bocs, csak itt nincsen fordító ezen a gépen, és nem tudom megnézni, hogy helyes-e.

  • blaces

    tag

    Hello!

    Tudtok olyan C vagy C++ könyvet ajánlani amelyben rengeteg: Fa, Lista programkód található? :R

  • blaces

    tag

    Hali!

    Így csináltam meg a házim:
    A feladat:[I]Írj programot, amely kiszámítja, hogy két szöveges állomány szóhasználata mennyire hasonló! A hasonlóságot egy 0 és 1 közé eső törtszámmal mérjük. Kiszámítása a következőképpen történik: minden szóra, ami legalább az egyik állományban előfordul, vesszük a szó gyakoriságát az első fájlban és a másodikban. A két gyakoriságot kivonjuk egymásból, majd a különbség abszolútértékét elosztjuk a szó összes előfordulásának számával (gyakoriság_az_első_fájlban + gyakoriság_a_második_fájlban). Ezt a számítást elvégezzük minden szóra. Az szavakra kiszámított értékeket végül összeadjuk, és elosztjuk a két állományban előforduló különböző szavak számával.

    A szöveges állományok nevét a program parancssori argumentumként kapja meg. Az állományok minden sora legfeljebb 1000 karakter hosszú. A sorokban a szavak szóközzel, vesszővel, felkiáltójellel, kérdőjellel és ponttal lehetnek elválasztva. A kis- és nagybetűket azonosként kell kezelni. Az állományok szavai közül csak azokat kell figyelembe venni, amelyek három vagy több karakterből állnak. Minden szó csak az angol ábécé kis- és nagybetűit tartalmazhatja.

    A program a kiszámított értéket írja a kimenetre 5 tizedesjegy pontossággal![/I]

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #define IGAZ 1
    #define HAMIS !IGAZ


    typedef struct listaelem{
    char szo[50];
    struct listaelem *kov;
    }LISTAELEM;

    int abszolut(int a,int b)
    { int c;
    c=(a-b)>=0 ? (a-b):(a-b)*(-1);
    return c;
    }

    int keres(LISTAELEM *fej,char sz[])
    {
    LISTAELEM *seged;
    for(seged=fej;seged;seged=seged->kov)
    {
    if(strcmp(sz,seged->szo)!=0)
    return IGAZ;
    }
    return HAMIS;

    }

    LISTAELEM* beszur(LISTAELEM *fej,char szo[])
    {
    LISTAELEM *ujelem=(LISTAELEM*)malloc(sizeof(LISTAELEM));
    strcpy(ujelem->szo,szo);
    ujelem->kov=NULL;
    if(!fej)
    return ujelem;
    else
    {
    LISTAELEM *seg=fej;
    while(!seg->kov)
    seg=seg->kov;
    seg->kov=ujelem;
    }
    return fej;
    }

    LISTAELEM* feldolgoz(FILE *f,LISTAELEM *fej)
    {
    char betu,sz[50];
    int j,i=0;
    while( (betu=fgetc(f)) !=EOF)
    {
    if(betu==' ' || betu==',' || betu=='!' || betu=='?' || betu=='.' || betu=='\n')
    {
    if(strlen(sz)>2)
    {
    fej=beszur(fej,sz);
    for(j=0;j<50;j++)
    sz[j]=' ';
    i=0;
    }
    }
    else
    {
    sz[i]=tolower(betu);
    i++;
    }
    }
    return fej;
    }

    int gyak(LISTAELEM *fej,char sz[])
    {
    LISTAELEM *seg;
    int gyakorisag=0;
    for(seg=fej;seg;seg=seg->kov)
    {
    if(strcmp(seg->szo,sz)==0)
    gyakorisag++;
    }
    return gyakorisag;
    }

    int main(int argc,char **argv)
    {
    FILE *f1,*f2;
    LISTAELEM *fej1,*fej2,*fej3,*seged;
    int gyak1,gyak2,szavak=0,n;
    float hasonlosag=0,eredm;

    f1=fopen(argv[1],"r");
    f2=fopen(argv[2],"r");
    fej1=feldolgoz(f1,fej1);
    fej2=feldolgoz(f2,fej2);

    for(seged=fej1;seged;seged=seged->kov)
    {
    if((n=keres(fej3,seged->szo))==0)
    {
    gyak1=gyak(fej1,seged->szo);
    gyak2=gyak(fej2,seged->szo);
    hasonlosag+=(abszolut(gyak1,gyak2))/(gyak1+gyak2);
    szavak++;
    }
    }

    for(seged=fej2;seged;seged=seged->kov)
    {
    if((n=keres(fej3,seged->szo))==0)
    {
    gyak1=gyak(fej1,seged->szo);
    gyak2=gyak(fej2,seged->szo);
    hasonlosag+=(abszolut(gyak1,gyak2))/(gyak1+gyak2);
    szavak++;
    }
    }

    eredm=hasonlosag/szavak;
    printf("%.5f\n",eredm);

    return 0;
    }

    De lefordításkor ilyen szegmens hibát ír ki:

    Szegmens hiba
    A debug.out fájlban nyomkövetési információk érhetőek el.
    A teszt_debug.out fájlban a nyomkövetés során előállt kimenet található!
    Érvenytelen memória hivatkozás.

    debug tartalma:
    ==21624== Conditional jump or move depends on uninitialised value(s)
    ==21624== at 0x40079A: feldolgoz (1_feladat.c:57)
    ==21624== by 0x4008C3: main (1_feladat.c:95)
    ==21624==
    ==21624== Conditional jump or move depends on uninitialised value(s)
    ==21624== at 0x4A1CD9E: strcpy (mc_replace_strmem.c:272)
    ==21624== by 0x4006E5: beszur (1_feladat.c:35)
    ==21624== by 0x4007B7: feldolgoz (1_feladat.c:59)
    ==21624== by 0x4008C3: main (1_feladat.c:95)
    ==21624==
    ==21624== Conditional jump or move depends on uninitialised value(s)
    ==21624== at 0x4006F7: beszur (1_feladat.c:37)
    ==21624== by 0x4007B7: feldolgoz (1_feladat.c:59)
    ==21624== by 0x4008C3: main (1_feladat.c:95)
    ==21624==
    ==21624== Invalid read of size 8
    ==21624== at 0x40071D: beszur (1_feladat.c:42)
    ==21624== by 0x4007B7: feldolgoz (1_feladat.c:59)
    ==21624== by 0x4008C3: main (1_feladat.c:95)
    ==21624== Address 0x38 is not stack'd, malloc'd or (recently) free'd
    ==21624==
    ==21624== Process terminating with default action of signal 11 (SIGSEGV)
    ==21624== Access not within mapped region at address 0x38
    ==21624== at 0x40071D: beszur (1_feladat.c:42)
    ==21624== by 0x4007B7: feldolgoz (1_feladat.c:59)
    ==21624== by 0x4008C3: main (1_feladat.c:95)

    Ez meg egy másik házinak a kódja, de itt is ugyanaz a hiba, érvénytelen memória hivatkozás:

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

    typedef struct faelem{
    int adat;
    struct faelem *bal,*jobb;
    }FA;
    typedef struct listaelem{
    int adat;
    struct listaelem *kov;
    }LISTA;


    LISTA* beszur_lista(LISTA *fej,int adat)
    {
    LISTA *ujelem=(LISTA*)malloc(sizeof(LISTA));
    ujelem->adat=adat;
    ujelem->kov=NULL;
    if(!fej)
    return ujelem;
    else
    {
    LISTA *segb=fej;
    while(!segb->kov)
    segb=segb->kov;
    segb->kov=ujelem;
    }
    return fej;
    }



    FA *ujelem(){
    FA *uj = (FA *)malloc(sizeof(FA));

    uj -> bal = NULL;
    uj -> jobb = NULL;
    return uj;
    }


    FA *beszur_fa(FA *gyoker, int adat){
    FA *uj;

    if(gyoker == NULL)
    {
    uj = ujelem();
    uj -> adat = adat;
    gyoker = uj;
    }
    else if(adat <= gyoker -> adat)
    gyoker -> bal =beszur_fa(gyoker -> bal, adat);
    else if(adat > gyoker -> adat)
    gyoker -> jobb =beszur_fa(gyoker -> jobb, adat);
    return gyoker;
    }

    int elemszam(FA *fa)
    {
    return fa ? 1+elemszam(fa->bal)+elemszam(fa->jobb) : 0;
    }

    LISTA* preorder(FA *fa,LISTA *fej1)
    { if(fa)
    {
    fej1=beszur_lista(fej1,fa->adat);
    preorder(fa->bal,fej1);
    preorder(fa->jobb,fej1);
    }
    return fej1;
    }

    LISTA* inorder(FA *fa,LISTA *fej2)
    {
    if(fa)
    {
    inorder(fa->bal,fej2);
    fej2=beszur_lista(fej2,fa->adat);
    inorder(fa->jobb,fej2);
    }
    return fej2;
    }

    int hasonlit(LISTA *fej1,LISTA *fej2)
    {
    LISTA *seged1,*seged2;
    seged1=fej1;
    seged2=fej2;
    while(seged1)
    {
    if(seged1->adat!=seged2->adat)
    goto c;
    seged1=seged1->kov;
    seged2=seged2->kov;
    }
    c:return 1;
    return 0;
    }


    int main(int argc,char **argv)
    {
    int szam,i;
    FILE *f,*ki;
    FA *forras;
    LISTA *in,*pre;
    f=fopen(argv[1],"r");
    ki=fopen(argv[2],"w");
    fscanf(f,"%d\n",&szam);
    forras=beszur_fa(forras,szam);
    while(szam!=EOF)
    {
    fscanf(f,"%d\n",&szam);
    forras=beszur_fa(forras,szam);
    }
    in=inorder(forras,in);
    pre=preorder(forras,pre);

    i=hasonlit(pre,in);
    if(i==1)
    fprintf(ki,"nem\n");
    else fprintf(ki,"igen\n");

    fclose(f);
    fclose(ki);

    return 0;
    }

    A CodeBlocks nem talál hibákat, és az egyik C ismerősöm sem érti, hogy mi a gond... :R

  • blaces

    tag

    válasz Jester01 #1000 üzenetére

    Ezeket modósítottam:

    char betu,sz[50]={};
    int j,i=0;
    int h=strlen(sz);
    while( (betu=fgetc(f)) !=EOF)
    {
    if(betu==' ' || betu==',' || betu=='!' || betu=='?' || betu=='.' || betu=='\n')
    {
    if(h>2)
    {
    fej=beszur(fej,sz);
    for(j=0;j<50;j++)
    sz[j]='\0';
    i=0;
    }

    HOgy kell a fejváltozót inicializálni? mert a jegyzetben nem találok róla leírást... Ezt hogy kell inicializálni?

    a fordított while feltétel azt takarta, hogy ehelyett: while(!seg->kov) ezt használjam: while(seg->kov)

  • blaces

    tag

    válasz Jester01 #1004 üzenetére

    Kijavítva, de ugyanúgy van valami baja :(, ugyanúgy érvénytelen memória hivatkozás

  • blaces

    tag

    válasz Jester01 #1006 üzenetére

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #define IGAZ 1
    #define HAMIS !IGAZ


    typedef struct listaelem{
    char szo[50];
    struct listaelem *kov;
    }LISTAELEM;

    int abszolut(int a,int b)
    { int c;
    c=(a-b)>=0 ? (a-b):(a-b)*(-1);
    return c;
    }

    int keres(LISTAELEM *fej,char sz[])
    {
    LISTAELEM *seged;
    for(seged=fej;seged;seged=seged->kov)
    {
    if(strcmp(sz,seged->szo)!=0)
    return IGAZ;
    }
    return HAMIS;

    }

    LISTAELEM* beszur(LISTAELEM *fej,char szo[])
    {
    LISTAELEM *ujelem=(LISTAELEM*)malloc(sizeof(LISTAELEM));
    strcpy(ujelem->szo,szo);
    ujelem->kov=NULL;
    if(!fej)
    return ujelem;
    else
    {
    LISTAELEM *seg=fej;
    while(seg->kov)
    seg=seg->kov;
    seg->kov=ujelem;
    }
    return fej;
    }

    LISTAELEM* feldolgoz(FILE *f,LISTAELEM *fej)
    {
    char betu,sz[50];
    int j,i=0;
    int h=strlen(sz);
    while( (betu=fgetc(f)) !=EOF)
    {
    if(betu==' ' || betu==',' || betu=='!' || betu=='?' || betu=='.' || betu=='\n')
    {
    if(h>2)
    {
    fej=beszur(fej,sz);
    for(j=0;j<50;j++)
    sz[j]='\0';
    i=0;
    }
    }
    else
    {
    sz[i]=tolower(betu);
    i++;
    }
    }
    return fej;
    }

    int gyak(LISTAELEM *fej,char sz[])
    {
    LISTAELEM *seg;
    int gyakorisag=0;
    for(seg=fej;seg;seg=seg->kov)
    {
    if(strcmp(seg->szo,sz)==0)
    gyakorisag++;
    }
    return gyakorisag;
    }

    int main(int argc,char **argv)
    {
    FILE *f1,*f2;
    LISTAELEM *fej1=NULL,*fej2=NULL,*fej3=NULL,*seged=NULL;
    int gyak1,gyak2,szavak=0,n;
    float hasonlosag=0,eredm;

    f1=fopen(argv[1],"r");
    f2=fopen(argv[2],"r");
    fej1=feldolgoz(f1,fej1);
    fej2=feldolgoz(f2,fej2);

    for(seged=fej1;seged;seged=seged->kov)
    {
    if((n=keres(fej3,seged->szo))==0)
    {
    gyak1=gyak(fej1,seged->szo);
    gyak2=gyak(fej2,seged->szo);
    hasonlosag+=(abszolut(gyak1,gyak2))/(gyak1+gyak2);
    szavak++;
    }
    }

    for(seged=fej2;seged;seged=seged->kov)
    {
    if((n=keres(fej3,seged->szo))==0)
    {
    gyak1=gyak(fej1,seged->szo);
    gyak2=gyak(fej2,seged->szo);
    hasonlosag+=(abszolut(gyak1,gyak2))/(gyak1+gyak2);
    szavak++;
    }
    }

    eredm=hasonlosag/szavak;
    printf("%.5f\n",eredm);

    return 0;
    }

    valgrind -v eredmények:
    ==3173== Memcheck, a memory error detector.
    ==3173== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al.
    ==3173== Using LibVEX rev 1658, a library for dynamic binary translation.
    ==3173== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.
    ==3173== Using valgrind-3.2.1-Debian, a dynamic binary instrumentation framework.
    ==3173== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.
    ==3173==
    --3173-- Command line
    --3173-- ./elso
    --3173-- Startup, with flags:
    --3173-- -v
    --3173-- Contents of /proc/version:
    --3173-- Linux version 2.6.18-6-xen-amd64 (Debian 2.6.18.dfsg.1-23etch1) (dannf@debian.org) (gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)) #1 SMP Fri Dec 12 07:02:03 UTC 2008
    --3173-- Arch and hwcaps: AMD64, amd64-sse2
    --3173-- Valgrind library directory: /usr/lib/valgrind
    --3173-- Reading syms from /home/izgatopasi/Prog1/3/1/elso (0x400000)
    --3173-- Reading syms from /lib/ld-2.3.6.so (0x4000000)
    --3173-- Reading debug info from /lib/ld-2.3.6.so...
    --3173-- ... CRC mismatch (computed 1CBD6C2C wanted 509BB065)
    --3173-- object doesn't have a symbol table
    --3173-- Reading syms from /usr/lib/valgrind/amd64-linux/memcheck (0x38000000)
    --3173-- object doesn't have a dynamic symbol table
    --3173-- Reading suppressions file: /usr/lib/valgrind/default.supp
    --3173-- Reading syms from /usr/lib/valgrind/amd64-linux/vgpreload_core.so (0x4918000)
    --3173-- Reading syms from /usr/lib/valgrind/amd64-linux/vgpreload_memcheck.so (0x4A19000)
    --3173-- Reading syms from /lib/libc-2.3.6.so (0x4B1F000)
    --3173-- Reading debug info from /lib/libc-2.3.6.so...
    --3173-- ... CRC mismatch (computed AD7708C1 wanted 5D81B887)
    --3173-- object doesn't have a symbol table
    --3173-- REDIR: 0x4B91980 (rindex) redirected to 0x4A1C450 (rindex)
    --3173-- REDIR: 0x4B8D0F0 (malloc) redirected to 0x4A1B7D6 (malloc)
    ==3173== Syscall param open(filename) points to unaddressable byte(s)
    ==3173== at 0x4BDB152: open (in /lib/libc-2.3.6.so)
    ==3173== by 0x4B85F52: _IO_file_open (in /lib/libc-2.3.6.so)
    ==3173== by 0x4B8609B: _IO_file_fopen (in /lib/libc-2.3.6.so)
    ==3173== by 0x4B7C053: (within /lib/libc-2.3.6.so)
    ==3173== by 0x4008B9: main (1_feladat.c:94)
    ==3173== Address 0x0 is not stack'd, malloc'd or (recently) free'd
    --3173-- REDIR: 0x4B8B180 (free) redirected to 0x4A1B3E6 (free)
    ==3173==
    ==3173== Conditional jump or move depends on uninitialised value(s)
    ==3173== at 0x400771: feldolgoz (1_feladat.c:53)
    ==3173== by 0x4008E3: main (1_feladat.c:96)
    ==3173==
    ==3173== Invalid read of size 2
    ==3173== at 0x4B82DE1: getc (in /lib/libc-2.3.6.so)
    ==3173== by 0x400801: feldolgoz (1_feladat.c:54)
    ==3173== by 0x4008E3: main (1_feladat.c:96)
    ==3173== Address 0x0 is not stack'd, malloc'd or (recently) free'd
    ==3173==
    ==3173== Process terminating with default action of signal 11 (SIGSEGV)
    ==3173== Access not within mapped region at address 0x0
    ==3173== at 0x4B82DE1: getc (in /lib/libc-2.3.6.so)
    ==3173== by 0x400801: feldolgoz (1_feladat.c:54)
    ==3173== by 0x4008E3: main (1_feladat.c:96)
    --3173-- REDIR: 0x4B92830 (memset) redirected to 0x4A1C960 (memset)
    ==3173==
    ==3173== ERROR SUMMARY: 6 errors from 3 contexts (suppressed: 8 from 1)
    ==3173==
    ==3173== 1 errors in context 1 of 3:
    ==3173== Invalid read of size 2
    ==3173== at 0x4B82DE1: getc (in /lib/libc-2.3.6.so)
    ==3173== by 0x400801: feldolgoz (1_feladat.c:54)
    ==3173== by 0x4008E3: main (1_feladat.c:96)
    ==3173== Address 0x0 is not stack'd, malloc'd or (recently) free'd
    ==3173==
    ==3173== 1 errors in context 2 of 3:
    ==3173== Syscall param open(filename) points to unaddressable byte(s)
    ==3173== at 0x4BDB152: open (in /lib/libc-2.3.6.so)
    ==3173== by 0x4B85F52: _IO_file_open (in /lib/libc-2.3.6.so)
    ==3173== by 0x4B8609B: _IO_file_fopen (in /lib/libc-2.3.6.so)
    ==3173== by 0x4B7C053: (within /lib/libc-2.3.6.so)
    ==3173== by 0x4008B9: main (1_feladat.c:94)
    ==3173== Address 0x0 is not stack'd, malloc'd or (recently) free'd
    ==3173==
    ==3173== 4 errors in context 3 of 3:
    ==3173== Conditional jump or move depends on uninitialised value(s)
    ==3173== at 0x400771: feldolgoz (1_feladat.c:53)
    ==3173== by 0x4008E3: main (1_feladat.c:96)
    --3173--
    --3173-- supp: 8 Debian libc6 (2.3.x) stripped dynamic linker
    ==3173==
    ==3173== IN SUMMARY: 6 errors from 3 contexts (suppressed: 8 from 1)
    ==3173==
    ==3173== malloc/free: in use at exit: 0 bytes in 0 blocks.
    ==3173== malloc/free: 2 allocs, 2 frees, 1,136 bytes allocated.
    ==3173==
    ==3173== All heap blocks were freed -- no leaks are possible.
    --3173-- memcheck: sanity checks: 0 cheap, 1 expensive
    --3173-- memcheck: auxmaps: 0 auxmap entries (0k, 0M) in use
    --3173-- memcheck: auxmaps: 0 searches, 0 comparisons
    --3173-- memcheck: SMs: n_issued = 12 (192k, 0M)
    --3173-- memcheck: SMs: n_deissued = 0 (0k, 0M)
    --3173-- memcheck: SMs: max_noaccess = 524287 (8388592k, 8191M)
    --3173-- memcheck: SMs: max_undefined = 0 (0k, 0M)
    --3173-- memcheck: SMs: max_defined = 66 (1056k, 1M)
    --3173-- memcheck: SMs: max_non_DSM = 12 (192k, 0M)
    --3173-- memcheck: max sec V bit nodes: 0 (0k, 0M)
    --3173-- memcheck: set_sec_vbits8 calls: 0 (new: 0, updates: 0)
    --3173-- memcheck: max shadow mem size: 4336k, 4M
    --3173-- translate: fast SP updates identified: 921 ( 86.7%)
    --3173-- translate: generic_known SP updates identified: 90 ( 8.4%)
    --3173-- translate: generic_unknown SP updates identified: 51 ( 4.8%)
    --3173-- tt/tc: 2,648 tt lookups requiring 2,655 probes
    --3173-- tt/tc: 2,648 fast-cache updates, 2 flushes
    --3173-- transtab: new 1,324 (31,539 -> 556,589; ratio 176:10) [0 scs]
    --3173-- transtab: dumped 0 (0 -> ??)
    --3173-- transtab: discarded 0 (0 -> ??)
    --3173-- scheduler: 23,425 jumps (bb entries).
    --3173-- scheduler: 0/1,389 major/minor sched events.
    --3173-- sanity: 1 cheap, 1 expensive checks.
    --3173-- exectx: 30,011 lists, 15 contexts (avg 0 per list)
    --3173-- exectx: 18 searches, 4 full compares (222 per 1000)
    --3173-- exectx: 0 cmp2, 39 cmp4, 0 cmpAll

    valgrind eredmény (simán csak valgrind [nev]):
    ==3298== Memcheck, a memory error detector.
    ==3298== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al.
    ==3298== Using LibVEX rev 1658, a library for dynamic binary translation.
    ==3298== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.
    ==3298== Using valgrind-3.2.1-Debian, a dynamic binary instrumentation framework.
    ==3298== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.
    ==3298== For more details, rerun with: -v
    ==3298==
    ==3298== Syscall param open(filename) points to unaddressable byte(s)
    ==3298== at 0x4BDB152: open (in /lib/libc-2.3.6.so)
    ==3298== by 0x4B85F52: _IO_file_open (in /lib/libc-2.3.6.so)
    ==3298== by 0x4B8609B: _IO_file_fopen (in /lib/libc-2.3.6.so)
    ==3298== by 0x4B7C053: (within /lib/libc-2.3.6.so)
    ==3298== by 0x4008B9: main (1_feladat.c:94)
    ==3298== Address 0x0 is not stack'd, malloc'd or (recently) free'd
    ==3298==
    ==3298== Conditional jump or move depends on uninitialised value(s)
    ==3298== at 0x400771: feldolgoz (1_feladat.c:53)
    ==3298== by 0x4008E3: main (1_feladat.c:96)
    ==3298==
    ==3298== Invalid read of size 2
    ==3298== at 0x4B82DE1: getc (in /lib/libc-2.3.6.so)
    ==3298== by 0x400801: feldolgoz (1_feladat.c:54)
    ==3298== by 0x4008E3: main (1_feladat.c:96)
    ==3298== Address 0x0 is not stack'd, malloc'd or (recently) free'd
    ==3298==
    ==3298== Process terminating with default action of signal 11 (SIGSEGV)
    ==3298== Access not within mapped region at address 0x0
    ==3298== at 0x4B82DE1: getc (in /lib/libc-2.3.6.so)
    ==3298== by 0x400801: feldolgoz (1_feladat.c:54)
    ==3298== by 0x4008E3: main (1_feladat.c:96)
    ==3298==
    ==3298== ERROR SUMMARY: 6 errors from 3 contexts (suppressed: 8 from 1)
    ==3298== malloc/free: in use at exit: 0 bytes in 0 blocks.
    ==3298== malloc/free: 2 allocs, 2 frees, 1,136 bytes allocated.
    ==3298== For counts of detected errors, rerun with: -v
    ==3298== All heap blocks were freed -- no leaks are possible.
    Szegmens hiba

    [ Szerkesztve ]

  • blaces

    tag

    Közben a harmadikkal is foglalkozom... szinte egésznap, lehet a fáradtságtól nem tudok már oda figyelni rendesen.
    Feladat:
    [I]Írj programot, amely egy egész számokat tartalmazó szöveges állományból felépít egy bináris fát, és eldönti, hogy a fa inorder és preorder bejárásával ugyanazt a számsorozatot kapja-e! A számokat tartalmazó állomány nevét az első parancssori argumentumként kapja meg a program.

    A szöveges állomány soronként pontosan egy tízes számrendszerbeli egész számot tartalmaz. A sorokat az újsor karakter (\n) zárja. Az állományt az állomány vége (EOF) jelig kell olvasni.

    A bináris fa felépítésében két szabályt kell figyelembe venni. Ha a beszúrandó szám nagyobb, mint az, amelyik a gyökérben van, akkor a gyökértől jobbra kerüljön, ha kisebb vagy egyenlő, akkor a gyökér bal oldalára. Azaz ez a fa nem bináris keresőfa.

    A program járja be a fát inorder és preorder módon. Ha a két bejárás ugyanazt a számsorozatot adja eredményül, akkor a program a második parancssori argumentumként megkapott nevű állományba írja az "igen", különben a "nem" szót. [/I]

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

    #define HAMIS 0
    #define IGAZ (!HAMIS)

    typedef struct faelem {

    char *adat;
    int szamlalas, input;
    struct faelem *bal, *jobb;
    } FA;

    void beszuras(FA **gyok, char *adat, int fajlnev) {
    if(*gyok == NULL) {
    *gyok = (FA*)malloc(sizeof(FA));
    (*gyok)->adat = (char*)malloc((strlen(adat)+1)*sizeof(char));
    strcpy((*gyok)->adat, adat);
    (*gyok)->szamlalas = 1;
    (*gyok)->input = fajlnev;
    (*gyok)->bal = (*gyok)->jobb = NULL;
    } else if(strcmp((*gyok)->adat, adat) < 0) {
    beszuras(&(*gyok)->jobb, adat , fajlnev);
    } else if(strcmp((*gyok)->adat, adat) > 0) {
    beszuras(&(*gyok)->bal, adat, fajlnev);
    } else if((strcmp((*gyok)->adat, adat) == 0) && ((*gyok)->input != fajlnev)) {
    (*gyok)->szamlalas++;
    (*gyok)->input = fajlnev;
    }

    return;
    }

    void bejaras(FA *gyok, int n) {
    if(gyok != NULL) {
    bejaras(gyok->bal, n);
    if(gyok->szamlalas == n) {
    printf("%s\n",gyok->adat);
    }
    bejaras(gyok->jobb, n);
    }
    return;
    }

    void torles(FA *gyok) {
    if(gyok != NULL) {
    free(gyok->adat);
    torles(gyok->bal);
    torles(gyok->jobb);
    free(gyok);
    }
    return;
    }

    int atugras(int ch) {
    if(ch != (int)' ' && ch != (int)'\n' && ch != (int)'\r' &&
    ch != (int)'\t' && ch != (int)'.' && ch != (int)',' && ch != (int)';' &&
    ch != (int)EOF) {
    return HAMIS;
    }

    return IGAZ;
    }

    char *memoriafoglalas(char *szo, int j) {
    return (szo == NULL) ?
    (char*)malloc(sizeof(char)) : (char*)realloc(szo,(j+1)*sizeof(char));
    }

    int main(int argc, char **argv) {
    FILE **fp = NULL;
    char *szo = NULL;
    int ch;
    FA *gyok = NULL;
    int i, j;

    if((fp = (FILE**)malloc((argc-1)*sizeof(FILE*)))==NULL)
    exit(1);
    for(i=1;i<argc;++i)
    if((fp[i-1] = fopen(argv[i],"rt+"))==NULL)
    exit(1);

    for(i=1;i<argc;++i) {
    j = 0;

    while((ch = fgetc(fp[i-1]))) {
    if((szo = memoriafoglalas(szo, j))==NULL)
    exit(1);

    if(atugras(ch) == HAMIS) {
    szo[j++] = tolower(ch);
    } else if(j > 0 || ch == (int)EOF) {
    szo[j] = '\0';
    beszuras(&gyok, szo, i-1);
    free(szo);
    szo = NULL;
    j = 0;

    if(ch == (int)EOF) {
    break;
    }
    }
    }
    fclose(fp[i-1]);
    }
    free(fp);
    bejaras(gyok, argc-1);
    torles(gyok);

    return 0;
    }

    Ez lefordul, csak hibás kimenetet ad vissza :( az egyetemi tesztelőn

    [ Szerkesztve ]

Új hozzászólás Aktív témák