Kezdőoldal » Számítástechnika » Programozás » Segítene valaki az alábbi,...

Segítene valaki az alábbi, egyébként könnyű C programozási házimban? (egy számomra érthetetlen hiba van benne)

Figyelt kérdés

A feladat az, hogy bekérjek két integer számot, és azt visszaírjam.

Tudom, marha egyszerű feladatnak tűnik, de valahogy mégse megy : valamilyen tömbös hibába ütközhettem a 'scanf()' parancs kapcsán.


Itt a (hibás) kódom:



#include <stdio.h>


int main(void)

{

//const char *c[2]={"first","second"};

int a[2],b[2];

for(b[0]=0;b[0]<2;b[0]++)

{

//printf("Type the %s integer : ",*c[b[0]]);

printf("Type the %i. integer : ",b[0]+1);

scanf("%i",&a[b[0]]);

}

for(b[1]=0;b[1]<2;b[1]++)printf("%i. added integer : %i\n",b[1]+1,a[b[0]]);


system("PAUSE");

return 0;

}



A számok bekérése formálisan működik, de valahogy mégis az a[] kételemű 1D-s tömböm elemei ugyanúgy egy 250 ezer körüli értékkel töltődnek fel... fogalmam sincs, hogy miért.

Gondolom bizonyára valamit a 'scanf()' parancsnál szúrok el, de nem tudom, hogy itt milyen jelölésre lenne szükség.



Kérem, segítsen valaki, aki haladó szinten ért a sima C nyelvhez!!! :O


Lehetőleg a kérdésre válaszoló kommenteket írjatok, kérem szépen!



Thanks in advance! :)



2013. szept. 18. 19:04
1 2 3 4
 31/36 smidla válasza:
100%

Kedves Kérdező!


Látom, hogy problémát okozott, hogy printf nélkül old meg a feladatot. Szívesen segítek megoldani a problémát, íme az én megoldásom:


#include <stdio.h>


void writeString(const char * str) {

unsigned int index = 0;

while (str[index] != 0) {

putchar(str[index]);

index++;

}

}


void writeInt(int num) {

if (num < 0) {

putchar('-');

num = -num;

}

int divider = 1000000000;

while (num / divider == 0) {

divider /= 10;

}

while (num > 0) {

putchar((num / divider) + '0');

num %= divider;

divider /= 10;

}

while (divider > 0) {

putchar('0');

divider /= 10;

}

}


void write(const char * index, int num) {

writeString(index);

writeString(" added integer : ");

writeInt(num);

writeString("\n");

}


int main(void)

{

const char *c[2]={"First","Second"};

int a[2],b[2];

for(b[0]=0;b[0]<2;b[0]++)

{

writeString("Type the ");

writeString(c[b[0]]);

writeString(" integer : \n");

scanf("%i",&a[b[0]]);

}


for(b[1]=0;b[1]<2;b[1]++) {

write(c[b[1]], a[b[1]]);

}


return 0;

}



Ahogy látod, ez nem tartalmaz printf-et, csupán a szabványos put függvényt.

Persze ha neked még a put használata is zavaró, akkor erre

az esetre megírtam neked egy put nélküli megoldást is, igaz egyelőre csak linuxon működik:


#include <stdio.h>


#define BUFF_SIZE 100


void put(char ch) {

static char buffer[100];

static int bufferIndex = 0;

buffer[ bufferIndex ] = ch;

bufferIndex++;

if (bufferIndex >= BUFF_SIZE || ch == '\n') {

asm("movl $4, %%eax\n\t"

"movl $1, %%ebx\n\t"

"int $0x80": : "c"(buffer), "d"(bufferIndex) :);


bufferIndex = 0;

}

}


void writeString(const char * str) {

unsigned int index = 0;

while (str[index] != 0) {

put(str[index]);

index++;

}

}


void writeInt(int num) {

if (num < 0) {

put('-');

num = -num;

}

int divider = 1000000000;

while (num / divider == 0) {

divider /= 10;

}

while (num > 0) {

put((num / divider) + '0');

num %= divider;

divider /= 10;

}

while (divider > 0) {

put('0');

divider /= 10;

}

}


void write(const char * index, int num) {

writeString(index);

writeString(" added integer : ");

writeInt(num);

writeString("\n");

}


int main(void)

{

const char *c[2]={"First","Second"};

int a[2],b[2];

for(b[0]=0;b[0]<2;b[0]++)

{

writeString("Type the ");

writeString(c[b[0]]);

writeString(" integer : \n");

scanf("%i",&a[b[0]]);

}


for(b[1]=0;b[1]<2;b[1]++) {

write(c[b[1]], a[b[1]]);

}


return 0;

}


Az általam kiadott tesztelő program elfogadja mindkét megoldást. Ami a te megoldásodban nem volt jó, az az, hogy nem szabad kiírnod, hogy "Kerem az 1. szamot", mivel ez az 1 a kimeneten jelenik meg, a tesztelő pedig válasznak hiszi. Ezért cseréltem le a kódodban a kiírást a main függvényben úgy, hogy csak 2 helyen írjon ki számot.


Viszont ha már itt vagyok, akkor had kérdezzem meg, hogy az alábbi megoldás miért nem megfelelő a számodra, hiszen ez a legegyszerűbb, és a tesztelő is elfogadja?


#include <stdio.h>


int main(void)

{

int a, b;

printf ("Az elso szam: ");

scanf ("%d", &a);

printf ("Az masodik szam: ");

scanf ("%d", &b);

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

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

return 0;

}


Valóban az a célom a tesztelővel, hogy nektek segítsek, hiszen később ennél jóval összetettebb házikat kaptok majd, nyilván szeretnél biztos lenni benne, hogy amit beadsz, azt valóban elfogadjuk.


Üdvözlettel: Smidla József

2013. szept. 21. 18:48
Hasznos számodra ez a válasz?
 32/36 anonim válasza:
100%
Az egyszerűség kedvéért azt a két számot eltárolhattad volna egy láncolt listában is, a tömb helyett :D
2013. szept. 21. 20:01
Hasznos számodra ez a válasz?
 33/36 anonim válasza:

Hodor!

Hodor, Hodor.

Hodor?

Hodor, Hodor!

2013. szept. 22. 08:20
Hasznos számodra ez a válasz?
 34/36 anonim ***** válasza:
100%
Minden elismerésem Smidla tanár úré! :D
2013. szept. 22. 16:56
Hasznos számodra ez a válasz?
 35/36 anonim válasza:
100%

Szerintem ezek után bekommentezhetnéd a programod valamelyik sorába, hogy


// #include <smidla.h>


mert ilyen tökéletes megoldás csak ott szerepel :D

2013. szept. 22. 17:37
Hasznos számodra ez a válasz?
 36/36 anonim válasza:
100%
Mekkora egy vadfasz vagy te, fiam... :D
2013. szept. 24. 10:18
Hasznos számodra ez a válasz?
1 2 3 4

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!