Megcsináltam sprintf-el egy programot csak annyi a baj vele, hogy megadok neki egy számot és például ha a szám 10 akkorcsak a 7-est irja ki 2,3,5,7 helyett, a program GUI-val van megcsinálva elsöre csinálok ilyet mit hibáztam el?
Megnéztem a cmd-s változatot amit csináltam printf meg scanfekel ugy müködik valami hiba az sprintfnél van szerintem:
if(strcmp(val, kiir_list[5])==0)
{
int M; //Meddig vizsgáljuk a számokat
GetWindowText(beker[0], bekert, 20);
sscanf(bekert, "%d", &M);
int tomb [M+1]; //tömböt hozunk létre
char s[M+1];
tomb[0]=tomb[1]=0; // a 0-át és az 1-et alapból hamisnak vesszük, hiszen nem prímek.
for (int i=2;i<=M;++i) tomb[i]=1; //2-tol indítjuk a for-t, alapból mindent igazra állítunk.
int j=2; //indexet ezzel figyelem
while (j<=M) {
for(int i=j*j; i<=M; i+=j) tomb [i] = 0;// a többszörösök logikai értékét hamisra állítom
while(tomb[++j]==0);} // ha a következo érték hamis, akkor továbbugrik a következore
for(int i=0;i<=M;++i)
if(tomb[i]==1) //megnézzük hogy igaz e
sprintf (s, "%d ", i);
SetWindowText(kiir[1], s);
}
Ezt borzalmas nekem még látni is.
Jó hogy csak a hetest látod, ha folyamatosan újradeklarálod a tömböt.
a szita nagyon rosszul van implementálva. Feleslegesen dolgozol tömbben. Elég lenne úgy gondolkodni, az osztók számát összeadnád, és ha ez nagyobb mint 2( ugye 1 és önmagával oszható a szám)
De ha mindenáron tömbben dolgozol, akkor tüntesd el, a tömb[M+1].
Előre hozz létre egy olyan tömböt, mint amekkora maga a szám.
int tömb[szam];
Ha dinamikus adatszerkezet kell, akkor használd a struktúrát.
Akkor a s[m+1] is baromság, újradefinálod a változót, csak a legutolsó eredménye marad meg. Ez porzalmas.
Primeket erasztothenész szitájával így tudsz előállítani.
int prime(unsigned int szam)
{
unsigned int i
unsigned int oszto=0;
for (i=1;i<szam-1;i++)
{
if (szam%i==0)
{
oszto++;
}
}
if (oszto==2)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
printf("Meddig kéred a primeket? ( maxérték 65535);
scanf("%d",&a);
for(b=0;b<a;b++)
{
if(prime(b)==1)
{
printf("%d",b);
}
}
return 0;
}
a windows-os alkalmazásokhoz nem értek. De valami borzalmas a kódod. Ennél rosszabbat nem láttam még erre a feladatra.
De nem vettél figyelembe jó pár dolgot.
A c és a c++ közötti különbségeket.
Nem a printf a fő különbség.
c-ben változókat a program elején kell deklarálni a c++-ban már ez nincs így.
Ha tömbben csinálod, akkor felülírod az összes elemet egy újbőli deklarációval. Ez emiatt van csak 7. eleme.
másrészt.
De én a pszeudokód alapján nem így implementálnám őket.
Mindkettőt értem a pascal-ost meg a c++-osat is. De nem túl szép megoldás. Legalább egy függvénybe csinálná a feladatot.
" c-ben változókat a program elején kell
deklarálni a c++-ban már ez nincs így."
LoL. Innentõl kezdve légszi.ne.osztogass segítséget programozás témakörben jó?
Jah mert dierkt szintax error-al csináltam, hogy te is dolgozz valamit.
Azért nem működik.
Keresd meg a szintaktiai hibás és működni fog.
Kódod ettől még hibás( és logikailag) hibás.
Itt a program cmds változata c-ben ez mukodik rendesen:
include <stdio.h>
void szita()
{
int M; //Meddig vizsgáljuk a számokat
scanf("%d", &M);
int tomb [M+1]; //tömböt hozunk létre
char s[M+1];
tomb[0]=tomb[1]=0; // a 0-át és az 1-et alapból hamisnak vesszük, hiszen nem prímek.
for (int i=2;i<=M;++i) tomb[i]=1; //2-tol indítjuk a for-t, alapból mindent igazra állítunk.
int j=2; //indexet ezzel figyelem
while (j<=M) {
for(int i=j*j; i<=M; i+=j) tomb [i] = 0;// a többszörösök logikai értékét hamisra állítom
while(tomb[++j]==0);} // ha a következo érték hamis, akkor továbbugrik a következore
for(int i=0;i<=M;++i)
if(tomb[i]==1) //megnézzük hogy igaz e
printf ("%d ", i);
}
int main()
{
szita();
}
Fent van az a programrészlet amit átraktam a Guis verzióba csak valamiért a GUI-s verzióban csak az utólsó primet irja ki a szám után valamit biztos a kiirásnál rontottam el az sprintf az egész tipusu i-t átalakitja stringé csak azt nem tudom mit rontottam el:
sprintf (s, "%d ", i);
SetWindowText(kiir[1], s);
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!