Hirdetés

2024. május 4., szombat

Gyorskeresés

Hozzászólások

(#5951) sztanozs válasza elistvan (#5950) üzenetére


sztanozs
veterán

szvsz szintaktikai hibás volt a második kód, nem tudta lefordítani, és így az előzőleg fordított binárist futtata...

JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...

(#5952) dabadab válasza elistvan (#5950) üzenetére


dabadab
titán

Nem fordítottad újra.
Ahogy láttam a Codeblocks nem fordítja magától újra a kódot, ha megváltozik a forrás.

DRM is theft

(#5953) elistvan


elistvan
senior tag

Kösz mindkettőtöknek!

Minőségi angol humor magyar felirattal: http://goo.gl/5kvyBr

(#5954) elistvan


elistvan
senior tag

Sziasztok! Olyan kódot keresek C ben, ami egy printf-el átszámolja nekem a decimális számot, binárissá. De csak 18 és 31 között. Csak egy változót lehet használni. Másfélét találtam, de ilyet még nem.

Esetleg ezt a kódot, esetleg át lehet alakítani, hogy a megadott módon működjön?
Vagy leegyszerűsíteni?

#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j,r,dec,bin[20];
printf("Kerek egy egesz szamot: ");
scanf("%d", &dec);
int n=dec;
i=0;
while (dec>0)
{
r=dec%2;
bin[i]=r;
dec=dec/2;
i++;
}
printf("\n %d binaris alakja : ",n);
for (j=i-1;j>=0;j--)
{
printf("%d ",bin[j]);
}
getch();
return 0;
}

Minőségi angol humor magyar felirattal: http://goo.gl/5kvyBr

(#5955) kovisoft válasza elistvan (#5954) üzenetére


kovisoft
őstag

Ha csak egy változót lehet használni és az maga a változó, amibe beolvastad a decimális számot, akkor itt egy ocsmány és gagyi megoldás: :B

printf("%d%d%d%d%d\n", (dec&16)>>4, (dec&8)>>3, (dec&4)>>2, (dec&2)>>1, (dec&1));

Mivel tudjuk, hogy legfeljebb 31 lehet a dec (ezt illik ellenőrizni előtte), ezért szimplán sorban kiolvassuk dec alsó 5 bitjét.

(#5956) elistvan


elistvan
senior tag

Kovisoft: Köszi, de valamiért nem fut le a C program hibát ír.

Sziasztok!

A következőp programkódom lenne. A feladat:
Készíts programot, ami egy dolgozat pontszámából kiszámítja a százalékos eredményt, majd kiírja a jegyet! Egy dolgozatra legfeljebb 20 pont adható, az eredmények: 60% - 2, 70% - 3, 80% - 4, 90% - 5
Nem akar az if-else rész működni, hogy továbblépjen a feltételeken.

[ Szerkesztve ]

Minőségi angol humor magyar felirattal: http://goo.gl/5kvyBr

(#5957) kovisoft válasza kovisoft (#5955) üzenetére


kovisoft
őstag

Közben még agyaltam egy általánosabb megoldáson is, ami egyesével olvassa ki a biteket. Triviálisan mindig az alsó bitet lehetne kiolvasni, kiírni, aztán jobbra shiftelni a biteket a számban amíg el nem fogynak a bitek. Viszont így fordított sorrendben írnánk ki a biteket. A lenti kód ehelyett mindig a felső bitet olvassa ki, majd balra shifteli a biteket, de legelőször berak jobbra egy plusz 1-es bitet, hogy tudja, mikor kell abbahagyni a ciklust:

dec=(dec<<1)|1;
while ((dec&255)>0)
{
  printf("%d", (dec&256)>>8);
    dec=dec<<1;
}
printf("\n");



Szerk: mi a hibaüzenet?

[ Szerkesztve ]

(#5958) Domonkos válasza elistvan (#5956) üzenetére


Domonkos
Ármester

talan ha nem int-et osztanal int-tel, akkor nem int lenne az eredmeny. Probald meg legalabb az egyiket valami float-ta (cast)-olni.

Gender of electrical connectors is defined by the pins.

(#5959) kovisoft válasza elistvan (#5956) üzenetére


kovisoft
őstag

Először szorozd 100-zal, csak utána legyen az osztás. Mert így az osztás miatt mindig 0 lesz az eredmény.

(#5960) elistvan válasza Domonkos (#5958) üzenetére


elistvan
senior tag

Float az egyik változó, a százalék.

[ Szerkesztve ]

Minőségi angol humor magyar felirattal: http://goo.gl/5kvyBr

(#5961) Domonkos válasza elistvan (#5960) üzenetére


Domonkos
Ármester

az osztas operandusaira ertettem.

Gender of electrical connectors is defined by the pins.

(#5962) kovisoft válasza elistvan (#5960) üzenetére


kovisoft
őstag

Az összes változó lehet int, ha először szorzol, utána osztasz.

Szerk: sőt a szazalek<=59 és szazalek>=60 eleve igényelné azt, hogy a szazalek int legyen, hiszen mi van, ha 59.5 a szazalek? (bár a jelen kiinduló adatokból ez most nem lehetséges)

[ Szerkesztve ]

(#5963) elistvan válasza kovisoft (#5962) üzenetére


elistvan
senior tag

Int csak egész szám lehet tudomásom szerint, a 59,5 az pedig tizedes tehát float, vagy én tudom rosszul?

Minőségi angol humor magyar felirattal: http://goo.gl/5kvyBr

(#5964) kovisoft válasza elistvan (#5963) üzenetére


kovisoft
őstag

A szazalek valtozot nem int-nek vetted fel, hanem float-nak. Egy osztás eredménye kerül bele, ezt hasonlítod utána egész számokkal. A konkrét esetben valóban csak egész szám kerülhet bele (mivel az osztást és a szorzást is int-eken végzed), de amúgy ha a képletben már eleve float-okkal dolgoznál, és mondjuk 47 pont lenne a maximum, amiből valaki 28-at ért el, akkor a szazalek értéke 59.57 lenne, ami se nem <=59, se nem >=60, hanem a kettő között van, de arra nincs feltételed. Ezért írtam, hogy jobb lenne csupa int-ekkel dolgozni. Vagy lehet float-okkal is, de akkor át kell írnod a feltételeket (és nem árt arra is gondolni, hogy bizonyos hányadosokat csak kerekítve lehet float-on ábrázolni).

(#5965) elistvan válasza kovisoft (#5964) üzenetére


elistvan
senior tag

Ez a kód már futtatja de 2-estől már nem adj jobbat! (Ami nekem speciel ebből a tantárgyből bőven jó.) Pedig 12-től már 3-asnak kellene lennie. Egyébként igazad van. Köszi.

[ Szerkesztve ]

Minőségi angol humor magyar felirattal: http://goo.gl/5kvyBr

(#5966) kovisoft válasza elistvan (#5965) üzenetére


kovisoft
őstag

Persze, mert hamarabb vizsgálod azt, hogy >=60, mint hogy >=70, stb. Emiatt ha monduk 75% az eredmény, az már rögtön bele fog esni a >=60 feltételbe. Meg kellene fordítani a feltételek sorrendjét: >=90, >=80, stb.

(#5967) elistvan válasza kovisoft (#5966) üzenetére


elistvan
senior tag

És tényleg! Köszi!

Minőségi angol humor magyar felirattal: http://goo.gl/5kvyBr

(#5968) Rula


Rula
tag

Sziasztok! Sikeresen a C++ topikba írtam ezt, ott pedig kiderült, hogy ez pedig sima C, szóval itt is feltenném a kérdésem.
Szeretnék egy olyan (hátul tesztelő) ciklust létrehozni, ami akkor lép ki, hogy ha az user beírja, hogy "end". Viszont nem igazán sikerül. Köszi előre is a segítséget!
Ahogy eddig próbáltam, siker nélkül:

#include <iostream>
int main()
{
 setlocale(LC_ALL, "");
 char kar[80];
 
 do {
  printf("írjon be valamit:\n");
  scanf("%s", kar);
  
 } while (kar != "end");
}

(#5969) kovisoft válasza Rula (#5968) üzenetére


kovisoft
őstag

C-ben nem tudsz így stringeket összehasonlítani, mert a kar != "end" a két stringre mutató pointert hasonlítja össze, nem pedig a stringek tartalmát. Használd az strcmp() függvényt stringek összehasonlítására (vagy strcmpi-t, ha nem számít a kis-nagybetű):

} while (strcmp(kar, "end") != 0);

[ Szerkesztve ]

(#5970) Rula válasza kovisoft (#5969) üzenetére


Rula
tag

Köszi! (Főleg azt, hogy szántál időt arra is, hogy leírd miért nem jó úgy! :R )

(#5971) m3zcal


m3zcal
újonc

Sziasztok,

A soros port programozassal kapcsolatban kerdeznem:
Szerintetek hany eszkozt (pl DC rele) lehet vezerelni egy soros portrol (DB-9) ?
Az erdekelne, hogy a TX-en kivul esetleg a tobbi labat is lehet "folyamatos" jel kikuldesre birni?
(pl. DCD, DSR,..)

(#5972) buherton válasza m3zcal (#5971) üzenetére


buherton
őstag

No, azt megnézem, hogyan vezérelsz reléket a soros portról. Neked valami ilyesmi kell: [link] de szerencsésebb lenne USB IO extendert keresned.

tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!

(#5973) m3zcal válasza buherton (#5972) üzenetére


m3zcal
újonc

Koszonom a javaslatokat, de ne feledd:
C-ben semmi sem lehetetlen.. :N

[ Szerkesztve ]

(#5974) buherton válasza m3zcal (#5973) üzenetére


buherton
őstag

Megnézném, hogyan változtatod meg a HW-t C-ből.

tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!

(#5975) #PeTeY#


#PeTeY#
tag

Sziasztok. Segítséget szeretnék kérni. Elkezdtem teljesen nulláról programozást tanulni, beiratkoztam egyetemre 38 éves fejjjel. Egyelőre nagyon tetszik, már csak azért is, mert teljesen sötét vagyok hozzá. :DDD
Szóval belefutottam egy feladatba (beadandó) és próbálom megoldani. A program egy fájlból kap mindenféle paramétert, ami alapján titkosít egy szöveget, amit kiír egy másik fájlba, de nem is ez a lényeg. Igyekszem lebontani kisebb részekre, de már az elején elakadtam. Azt szeretném megoldani, hogy egy szöveget mátrixos elrendezésben írjon ki, de nem sikerül. Egyszerűen csak kiírja egy sorba. Mit rontok el? Eddig jutottam:

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

int main(){

    char szoveg[256] = {"eztaszovegetkelltitkositanod"};
    char tomb[4][7];

    FILE* ki = fopen("ki.txt", "w");

    if (ki == NULL) {
    printf("Nem sikerült megynitni a ki.txt-t! (%d)\n", __LINE__);
    exit(1);
    }

    int i, j, count = 0;
    for (i=0; i<4; ++i) {
        for (j=0; j<7; ++j) {
            tomb[i][j]=szoveg[count];
            count=count+1;
            fprintf(ki, "%c ", tomb[i][j]);

        }
   }
    return 0;
}

Előre is köszönök minden segítséget.

(#5976) buherton válasza #PeTeY# (#5975) üzenetére


buherton
őstag

Hiányzik a sortörés karakter: \n.

tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!

(#5977) kovisoft válasza #PeTeY# (#5975) üzenetére


kovisoft
őstag

Ha 4 sorban szeretnél soronként 7 karaktert kiíratni, akkor a belső j-s ciklusod után írj ki egy sortörést:

fprintf(ki, "\n");

(#5978) #PeTeY# válasza kovisoft (#5977) üzenetére


#PeTeY#
tag

:W
Nagyon köszi. És neked is buherton.
Tegnap este óta ezzel szarakodok. :U

(#5979) buherton válasza #PeTeY# (#5978) üzenetére


buherton
őstag

Kitartást az egyetemez! Ha van kérdés, akkor tedd fel bátran. :K

Ha megnyugtat, akkor lesz még ilyen bőven :D.

tely, baly, fojó, mennyél, mingyárt, telyföl, tolyás, malyd, kapú, egyenlőre, ejsd, jáccani, ahoz, fúj, hüje, muszály, alat, álok, lasan, fojtatás, ál, fontós, költsön, eggyüt, lyob (jobb?), mek, mongyak, milyért - !!! Tanúlyunk már meghejjessen irni... !!!

(#5980) #PeTeY# válasza buherton (#5979) üzenetére


#PeTeY#
tag

Nagyon köszi. Biztosan fogok még kérdezni, de néha az is nehéz, hogy mit is akarok kérdezni. :)

(#5981) #PeTeY#


#PeTeY#
tag

Haladok a beadandómmal szépen lassan, nagy nehezen kitaláltam, minek hogyan is kellene működnie és működik is, de megint sikerült elakadnom. Esetleg valaki rá tudna nézni privátban a kódomra, hogy mi vele a gond?

(#5982) kovisoft válasza #PeTeY# (#5981) üzenetére


kovisoft
őstag

Szerintem inkább dobd be ide a problémás kódrészletet. Egyfelől többen is rá tudnak nézni, másrészt mások is tanulhatnak belőle.

(#5983) #PeTeY# válasza kovisoft (#5982) üzenetére


#PeTeY#
tag

Rendben. Szóval, a lényeg, hogy kódolni kéne egy szöveget úgy, hogy egy megadott kulcs alapján olvasom ki oszloponként a szöveget alulról felfelé. Sikerül megcsinálni a kódolás részét, azaz megfelelő sorrendben adja vissza az oszlopokat, de nem alulról felfelé. És nem látom, miért. Bár biztos ez is tök egyszerű:

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

int main()
{
    int kod = 7;
    int kulcs[32] = {3,4,2,1,5,6,7};
    char szoveg[256] = {"eztaszovegetkelltitkositanod"};
    int n = 28 / kod;
    char tomb[n][kod];

    FILE* ki = fopen("ki.txt", "w");

 if (ki == NULL) {
  printf("Nem sikerült megynitni a ki.txt-t! (%d)\n", __LINE__);
  exit(1);
 }

    int i, j, count = 0;
    for (i=0; i<n; ++i) {
        for (j=0; j<kod; ++j) {
            tomb[i][j]=szoveg[count];
            count=count+1;
            fprintf(ki, "%c ", tomb[i][j]);

        }
        fprintf(ki, "\n");
    }

    fclose(ki);

    FILE* ki2 = fopen("ki2.txt", "w");

    if (ki2 == NULL) {
  printf("Nem sikerült megynitni a ki.txt-t! (%d)\n", __LINE__);
  exit(2);
 }

 char kodolt[256];
    int l=0;

 for(j=0; j<kod; j++) {
  for(i=0; i<n; i++) {
            kodolt[l] = tomb[i][kulcs[j]-1];
            fprintf(ki2, "%c", kodolt[l]);
        }
    }

    fclose(ki2);
    return 0;
}

(#5984) kovisoft válasza #PeTeY# (#5983) üzenetére


kovisoft
őstag

Mit jelent, hogy "de nem alulról felfelé"? A sorokat fordított sorrendben kellene kiírni? Ebben az esetben haladj fordított sorrendben a legutolsó i-s ciklusoddal:

for(i=n-1; i>=0; i--) {

A másik lehetőség, hogy a tomb-ből olvasod ki tükrözve a sorokat:

          kodolt[l] = tomb[n-i-1][kulcs[j]-1];

(#5985) #PeTeY# válasza kovisoft (#5984) üzenetére


#PeTeY#
tag

Valóban. Nagyon köszi... Logikus, hogy sorok esetében lentről felfelé kell haladni, ha azt akarom, hogy így legyen kiírva. :) Pár év és belejövök.
Még egy kérdésem lenne, mert ehhez már nagyon fáradt vagyok: Hogyan oldom meg, ha azt szeretném, hogy a titkosítani kapott szöveget a kulcsnak megfelelően rendezze oszlopokba? Azaz itt az első négy karakter kerüljön a 3. oszlopba, úgy hogy az első karakter van a legalsó sorban...

(#5986) kovisoft válasza #PeTeY# (#5985) üzenetére


kovisoft
őstag

Ha jól értem, hogy mit szeretnél, akkor szerintem nem a második dupla ciklusban (amikor a ki2-be írsz) kellene alkalmazni a kulcs[j]-1-gyel való indexelést, hanem az első dupla ciklusban, amikor kitöltöd a tomb-öt (és persze ekkor oda kell figyelni arra is, hogy a ki file-ba továbbra is a jó karaktert írd ki):

for (i=0; i<n; ++i) {
for (j=0; j<kod; ++j) {
tomb[i][kulcs[j]-1]=szoveg[count];
fprintf(ki, "%c ", szoveg[count]);
count=count+1;
}
fprintf(ki, "\n");
}

A ki2-be történő kiírásnál pedig már csak szimplán kiszedni a j-edik oszlopot. Mert így most pont a kulcs inverz permutációját hajtod végre.

[ Szerkesztve ]

(#5987) #PeTeY# válasza kovisoft (#5986) üzenetére


#PeTeY#
tag

Nagyon köszönöm. Már munkahelyen vagyok, este megnézem. :)
Bár, most első ránézésre... Na, megpróbálom majd értelmezni. És tisztáznám, mit is akarok, mert valószínű nem voltam valami összeszedett már tegnap este. Mondjuk nem biztos, hogy most jobb lesz...
Szóval a feladat szerint a program egy fájlból kiolvas majd 3 dolgot. Egy egész számot, mint kód. Ennyi oszlopa lesz majd a mátrixnak, amibe be kell "tölteni" a harmadik paraméterben kapott szöveget, amit kódolni, vagy dekódolni kell. Illetve egy kulcsot azaz számsort, ami ebben a mátrixban mutatja az oszlopok sorrendjét. Kódolásnál be kell írni sorfolytonosan a mátrixba a szöveget: azaz a[0][0]-ba az első karakter, a[0][1]-be második, stb, és kiolvasásnál a kulcs által megadott sorrendben kell kiírni. Nálam a konkrét kódban, ugye a 3. oszlop utolsó sorában lévő karakter lesz az első, aztán ugyanezen oszlop utolsó előtti sorában lévő a második egészen az első sorig, majd jön a 4. oszlop utolsó sorában lévő, stb. Ezt a segítségetekkel sikerült is megcsinálni. Viszont a dekódolásnál ezt írja szó szerint a feladat: "A dekódoláshoz az adott sorrendben töltjük fel az oszlopokat, majd a szöveget sorfolytonosan olvassuk ki a táblázatból..." Azaz ha jól értem, fordítva kéne, mint a kódolásnál. Bocs a hosszú szövegért.

(#5988) kovisoft válasza #PeTeY# (#5987) üzenetére


kovisoft
őstag

Akkor gondolom sztornó, amit írtam, ha végülis maga a kódolás jó úgy, ahogy csináltad.

A kódolásnál eredeti sorrendben ([i][j]) töltöd fel a tomb tömböt és a kulcs szerint indexelve ([n-i-1][kulcs[j]-1]) olvasod ki.

Dekódolásnál fordítva kellene csinálni: a kulcs szerint indexelve ([n-i-1][kulcs[j]-1]) töltöd fel a tomb tömböt és eredeti sorrendben ([i][j]) olvasod ki.

(#5989) #PeTeY# válasza kovisoft (#5988) üzenetére


#PeTeY#
tag

Nagyon köszönöm, megnézem este.
Amúgy miért n-i-1? Ezt a részt nem teljesen érem. :B

(#5990) kovisoft válasza #PeTeY# (#5989) üzenetére


kovisoft
őstag

Az i=0,1,...,n-1 sorozatot úgy fordítod meg, hogy i helyett n-i-1 -et használsz (i=0 --> n-i-1=n-1, i=n-1 --> n-i-1=0). És akkor mindenhol indulhat minden i-s és j-s ciklusod 0-ról egyesével felfelé, és a sorokat úgy fordítod meg, hogy i helyett n-i-1 -et használsz az indexben azokon a helyeken, ahol a kulcs-csal is indexelsz.

Persze nem muszáj így, csinálhatod azt is, hogy marad az i az indexben, de az i-s ciklusod n-1-ről indul lefelé 0-ig. A végeredmény ugyanaz lesz.

(#5991) #PeTeY# válasza #PeTeY# (#5989) üzenetére


#PeTeY#
tag

Oké, megvan, csak át kellett gondolnom. :U

A magyarázatoddal meg pláne. Nagyon köszi a segítséget.

[ Szerkesztve ]

(#5992) DEV_NULL


DEV_NULL
őstag

Sziasztok!

A problémám amire tőletek várnék megoldást; a feladat egy C program ami először bekér egy számot, majd bekér ennyi de maximum 50 számot. Ezeket megszűri, hogy ne legyen benne ismétlődés, majd olyan ismétlődés nélküli számnégyeseket csinál belőlük ahol az első és utolsó szám összege megegyezik a második és harmadik szám összegével és a végén ezek darabszámát. Ezt egy robot ellenőrzi. Két gond van, az egyik, hogy malloc hibával elszáll, vagy ha program kimenete több ezer megfelelő számnégyes, akkor még néhány száz darab nullás számnégyest kipörget a végére... Én már kezdem feladni, bízom benne, tudtok segíteni. Remélem sikerül normálisan bemásolni a kódot, most írok ide először...

Hiba: prog: malloc.c:2401: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed. Aborted (core dumped)

Köszi előre is!

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

typedef struct dec10Hazi
{
    unsigned int meret, meret2;
    unsigned int csere, csere2;
    unsigned int *cim, *cim2;
    unsigned int tomb[4];
    unsigned int db;
} Nehez;

int main()
{
   Nehez hazi;
    unsigned int h, a, z, i;

    scanf("%u", &hazi.meret);

    hazi.cim=malloc(sizeof(unsigned int)*hazi.meret);

   for(h=0; h<hazi.meret; h++)
        {
        scanf("%u", &hazi.cim[h]);
        }

   hazi.csere2=1;
    while(hazi.csere2)
        {
        for(h=0; h<hazi.meret-1; h++)
            {
            if(hazi.cim[h]>hazi.cim[h+1])
                {
                hazi.csere=hazi.cim[h];
                hazi.cim[h]=hazi.cim[h+1];
                hazi.cim[h+1]=hazi.csere;
                }
            }
        hazi.csere2=0;
        for(h=0; h<hazi.meret-1; h++)
            {
            if(hazi.cim[h]>hazi.cim[h+1])
                {
               hazi.csere2=1;
               break;
               }
           }
        }

   hazi.meret2=0;
   for(h=0; h<hazi.meret-1; h++)
        {         
        if(hazi.cim[h]<hazi.cim[h+1])
            {            
            hazi.meret2++;
            }         
        }
    hazi.meret2++;

    hazi.cim2=malloc(sizeof(unsigned int)*hazi.meret2);

   h=0;
   hazi.csere=0;
   hazi.cim2[hazi.csere]=hazi.cim[h];
    h++;

   while(hazi.csere<hazi.meret2)
        {
       if(hazi.cim[h]>hazi.cim2[hazi.csere])
            {
           hazi.cim2[++hazi.csere]=hazi.cim[h];
            h++;
            }
       else  
            {
           h++;
           }
        }

   hazi.db=0;
  for(h=0; h<hazi.meret-3; h++)
        {         
       hazi.tomb[0]=hazi.cim2[h];
       for(a=h+1; a<hazi.meret-2; a++)
            {            
           hazi.tomb[1]=hazi.cim2[a];
            for(z=a+1; z<hazi.meret-1; z++)
                {                 
               hazi.tomb[2]=hazi.cim2[z];
               for(i=z+1; i<hazi.meret; i++)
                    {                     
                   hazi.tomb[3]=hazi.cim2[i];
                   if(hazi.tomb[0]+hazi.tomb[3]==hazi.tomb[1]+hazi.tomb[2])
                        {
                        hazi.db++;
                        }
                    }
               }
           }
        }

    printf("%u\n", hazi.db);

   free(hazi.cim);
    free(hazi.cim2);

    return 0;
}

[ Szerkesztve ]

(#5993) kovisoft válasza DEV_NULL (#5992) üzenetére


kovisoft
őstag

Csak tipp, de szerintem a lenti sorban kicímzel a hazi.cim2 tömbből, ugyanis amikor hazi.csere=hazi.meret2-1, akkor a ++ miatt hazi.cim2[hazi.meret2] lesz felülírva, de az már az allokált tömb után van:

           hazi.cim2[++hazi.csere]=hazi.cim[h];

Elképzelhető, hogy elég lenne a ++-t hátulra tenni (hazi.csere++), de mondom ezt úgy, hogy nem értelmeztem, mit csinál pontosan a programod.

(#5994) DEV_NULL válasza kovisoft (#5993) üzenetére


DEV_NULL
őstag

Szia!

Köszi a választ. A ++t áttéve megszűnik a malloc hiba, viszont a kimeneten a darabszám, sajnos nem jó. Valamiért vagy több, vagy kevesebb, mint amennyinek lennie kellene...

[ Szerkesztve ]

(#5995) kovisoft válasza DEV_NULL (#5994) üzenetére


kovisoft
őstag

Szerintem a gond még azzal a résszel van, ahol kiszűröd az azonos számokat és csak a különbözőket pakolod át a hazi.cim-ből a hazi.cim2-be (ahol az ominózus ++ is van). Nem elég átrakni a ++-t a végére, hanem kicsit át kell alakítani magát a ciklust is, hiszen így most a 0-dik cim2 elembe belerakod a 0-dik és az 1-ső cim elemet is (a legelső elvész). Mivel a hazi.csere=0 elemet már a ciklus előtt átraktad, ezért a ciklust hazi.csere=1 értékről kellene indítani.

Sokat segíthet, ha debug kiíratásokat helyezel el a kódban az egyes lépések után. Pl. kiírod a rendezett elemeket, az azonos elemek kiszűrése után maradtakat, ill. azokat a számnégyeseket, amikre egyeznek a megkívánt összegek. Ezekből látni fogod, hogy melyik lépésnél romlik el valami.

(#5996) DEV_NULL válasza kovisoft (#5995) üzenetére


DEV_NULL
őstag

Köszi a segítséget!

Mivel sehogy sem akart működni egy teljesen új, sokkal egyszerűbb megközelítésből oldottam meg végül:

#include <stdio.h>
 
 
typedef struct
{
    unsigned int tomb[50];
    unsigned int szam, db;
    unsigned int meret, meret2;
} Nehez;
 
 
Nehez meret()
{
    Nehez hazi;
    hazi.meret2=0;
    hazi.db=0;
 
    scanf("%u", &hazi.meret);
 
    return hazi;
}
 
Nehez beker()
{
    Nehez hazi;
    unsigned int h, a;
 
    for(h=0; h<hazi.meret; h++)
        {
        scanf("%u", &hazi.szam);
        a=0;
        while(a<h && hazi.szam!=hazi.tomb[a])
            {
            a++;
            }
        if(a==h)
            {
            hazi.tomb[hazi.meret2]=hazi.szam;
            hazi.meret2++;
            }
        }
 
    return hazi;
}
 
Nehez rendez(Nehez hazi)
{
    unsigned int h, a;
 
    for(h=0; h<hazi.meret2; h++)
        {
        for(a=h+1; a<hazi.meret2; a++)
            {
            if(hazi.tomb[h]>hazi.tomb[a])
                {
                hazi.szam=hazi.tomb[a];
                hazi.tomb[a]=hazi.tomb[h];
                hazi.tomb[h]=hazi.szam;
                }
            }
        }
 
    return hazi;
}
 
Nehez szamol(Nehez hazi)
{
    unsigned int h, a, z, i;
 
    for(h=0; h<hazi.meret2; h++)
        {
        for(a=h+1; a<hazi.meret2; a++)
            {
            for(z=a+1; z<hazi.meret2; z++)
                {
                for(i=z+1; i<hazi.meret2; i++)
                    {
                    if(hazi.tomb[h]+hazi.tomb[i]==hazi.tomb[a]+hazi.tomb[z])
                        {
                        hazi.db++;
                        }
                    }
                }
            }
        }
 
    return hazi;
}
 
void kiir(Nehez hazi)
{
    printf("%u", hazi.db);
}
 
 
 
int main()
{
    Nehez hazi;
 
    hazi=meret();
    hazi=beker();
 
    hazi=rendez(hazi);
    hazi=szamol(hazi);
 
    kiir(hazi);
 
    return 0;
}


(#5997) kovisoft válasza DEV_NULL (#5996) üzenetére


kovisoft
őstag

Remek! Még annyit lehet egyszerűsíteni, hogy a beolvasásnál egy füst alatt el lehet intézni a rendezést is és az egyező számok kiszűrését is:

Beolvasod a következő számot, megkeresed az első olyan szám indexét a (rendezett) tömbödben, aminél nem nagyobb. Ha megegyezik vele, akkor eldobod, mert van már ilyen szám. Ha pedig kisebb nála, akkor ettől az indextől kezdve eggyel hátrébb pakolod a számokat a tömbben, és beszúrod ide a beolvasott számot.

És ne feledkezz meg az adatok ellenőrzéséről sem, pl. mi van, ha 50-nél nagyobb számot adnak meg méretnek? Ekkor ki fogsz címezni a tömbödből.

(#5998) elistvan


elistvan
senior tag

Az alábbi programomat, hogyan tudnám lerövidíteni függvényekkel? Tudom a tartalmazza az, de hogyan tudom, a találatokat és tippeket fügvényekkel megoldani?

/*Kenorsolás program találatok számát irja ki, és a nyerőszámokat emelkedő sorrendben*/
#include <stdlib.h>
#include <time.h>
#include <stdio.h>

int tartalmazza(int tomb[], int hossz, int szam){
for(int i=0;i<hossz;i++){
if(tomb == szam){
return 1;
}
}
return 0;
}

int main(){
int tippeltszamok[10] = {0};

for(int i=0;i<10;i++){
int talalat(i);
int szam;
printf("%d. szám: ", i+1);
scanf("%d",&szam);
if(szam >= 1 && szam <= 80 && !tartalmazza(tippeltszamok,10,szam)){
tippeltszamok(i) = szam;
}else{
printf("Már tippelt vagy nem 1-80 közötti szám\n");
i--;
}
}

printf("A játékba küldött számok:\n");
for(int i=0;i<10;i++){
printf("%d ", tippeltszamok(i));
}

int nyeroszamok[20] = {0};

for(int i=0;i<20;i++){
int num = (rand() % (80 - 1 + 1)) + 1;
if(num >= 1 && num <= 80 && !tartalmazza(nyeroszamok,20,num)){
nyeroszamok(i) = num;
}else{
i--;
}
}

int talalat[10] = {0};
int tIndex = 0;
for(int i=0;i<10;i++){
for(int j=0;j<20;j++){
if(tippeltszamok(i) == nyeroszamok[j]){
talalat[tIndex++] = nyeroszamok[j];
}
}
}
int tmp;
int j =0;
int emelkedo[20] = {0};
for( int i=0; i<10; i++)
{
for( int j=0; j<20; j++)
{
if(nyeroszamok[j] > nyeroszamok(i)) /*Ha a nyerőszámok tömb 1 eleme nagyobb mint a második*/
{
tmp = nyeroszamok(i); /*Az első elemet kitesszük a tmp változóba*/
nyeroszamok(i) = nyeroszamok[j]; /*A második elem átkerül az első helyre a sorban*/
nyeroszamok[j] = tmp; /*a tmp-ben tárolt 2. elem, átkerül a második helyre.*/
}
}
}
printf("\nAz e heti nyerőszámok növekvő sorrendben:\n");
for(int i=0;i<20;i++)
{
emelkedo(i) = nyeroszamok(i);
printf("%d ", emelkedo(i));
}
printf("\n\n");
printf("\nA heti nyerőszámok pedig:\n");
{
for(int i=0;i<20;i++)
{
printf("%d ", nyeroszamok(i));
}

printf("\n%d találat:\n", tIndex);
for(int i=0;i<tIndex;i++){
printf("%d ", talalat(i));
}
}
return 0;
}

[ Szerkesztve ]

Minőségi angol humor magyar felirattal: http://goo.gl/5kvyBr

(#5999) kovisoft válasza elistvan (#5998) üzenetére


kovisoft
őstag

Ebben a programban jelenleg elég sok hiba van. Hirtelen néhány: A tartalmazza() függvényben a tomb címét hasonlítod a szam-hoz, nem a tomb egy elemét, itt tomb[i] kellene. Végig a kódban keverednek az íves (függvényhívás) és a szögletes (tömb eleme) zárójelek, ez így le sem tud fordulni. Mint pl. itt:

tippeltszamok(i) = szam;

vagy itt:

if(tippeltszamok(i) == nyeroszamok[j]){

A nyeroszamok-at fölöslegesen rakod át az emelkedo-be, mert már helyben rendezted azokat (ezért kiírni is fölösleges mindkettőt).

Függvényekkel rövidíteni akkor tudod, ha több ismétlődő feladatot hajt végre a programod. Itt maximum a számok kiírása az ilyen, tehát sok rövidítésre nincs lehetőség, így gondolom inkább arról lenne szó, hogy függvényekkel struktúráld a programod (ettől nem rövidebb, hanem olvashatóbb lesz). Be kell azonosítanod az egyes blokkokat a programodban, amik egy önálló részfeladatot hajtanak végre, és ezeket ki tudod emelni egy-egy önálló függvénybe. Most kb. ezeket csinálja a programod:

- tippek bekérése
- tippek kiírása
- nyerőszámok húzása
- találatok megkeresése
- nyerőszámok rendezése
- nyerőszámok kiírása (elég 1x)
- találatok kiírása

Ezekre írhatsz függvényeket, amik megkapják bemenő paraméterben tömbö(ke)t, amivel dolgozniuk kell, hasonlóan a tartalmazza() függvényedhez. De ezek a függvények nem adnak semmilyen értéket vissza, void lesz a visszatérési típusuk és nem lesz bennük return.

(#6000) elistvan válasza kovisoft (#5999) üzenetére


elistvan
senior tag

Szia!

Köszi. Pont azt szerettem volna elérni, hogy átláthatóbb legyen. Rosszul fejeztem ki magam.

A dupla kiírás eredeti célja az lett volna, hogy előbb simán kiírja a ciklus ahogy megtalálta a számot aztán emelkedő sorrendben. (Mint a tv-s sorsoláson.)

A konkrét programon egy ilyen tömbös rövidítést meg tudnál mutatni? Mert ezt a részt nem igazán értem.

[ Szerkesztve ]

Minőségi angol humor magyar felirattal: http://goo.gl/5kvyBr

Copyright © 2000-2024 PROHARDVER Informatikai Kft.