Kezdőoldal » Számítástechnika » Programozás » Mi lehet a hiba ebben a C...

Mi lehet a hiba ebben a C programban?

Figyelt kérdés

int main() {

double total = 0.0;

double num;

char buffer[100];


while (1) {

if (scanf("%lf", &num) == 1) {

total += num;

} else {

// Olvassuk be az utolsó beolvasás után maradt szöveget

fgets(buffer, sizeof(buffer), stdin);

break;

}

}


printf("%.3lf\n", total);

printf("%s", buffer);


return 0;

}



hiba: -----

Test case #1:

input =

-----

Your standard output:

0.000

3U

Correct standard output:

0.000



-----

Test case #2:

input = 0

-----

Your standard output:

0.000

3U

Correct standard output:

0.000



-----

Test case #3:

input = 1.0 2.0 3.0alma korte szilva

-----

OK


-----

Test case #4:

input = 1e-3 -2e-3 bolha 3e-8

-----

OK


-----

Test case #5:

input = jupiter 3.8

-----

OK


-----

Test case #6:

(random input)

-----

OK


-----

Test case #7:

(random input)

-----

OK


-----

Test case #8:

(random input)

-----

OK



Holnap 3 óra a leadási határidő. Előre is köszönöm a válaszokat!



2023. okt. 2. 22:05
 1/4 anonim ***** válasza:
57%

A hiba a programban az, hogy a scanf() függvény nem kezeli helyesen a hibás bemeneti adatokat. Amikor nem sikerül egy számot beolvasni, a scanf() nem fogyasztja el a hibás karaktereket, ami azt eredményezi, hogy azok az adatok a bemeneti pufferekben maradnak, és a következő fgets() hívás során beolvasódnak.


Ezt a problémát úgy lehet orvosolni, hogy töröljük a bemeneti puffert, miután a scanf() hibát észlelt. Ezt megtehetjük a következő módon:


```c

int main() {

double total = 0.0;

double num;

char buffer[100];


while (1) {

if (scanf("%lf", &num) == 1) {

total += num;

} else {

// Olvassuk be az utolsó beolvasás után maradt szöveget

fgets(buffer, sizeof(buffer), stdin);

break;

}

}


printf("%.3lf\n", total);

printf("%s", buffer);


return 0;

}

```


Ezzel a módosítással a program helyesen kezeli a hibás bemeneti adatokat, és megfelelően fogyasztja el a hibás karaktereket a bufferből.

2023. okt. 2. 22:13
Hasznos számodra ez a válasz?
 2/4 anonim ***** válasza:
57%

Előző vagyok:


íme néhány teszteset a módosított programhoz:


1. Teszteset: Beolvasás egyetlen számból, majd hibás karakterek következnek.

- Bemenet: `5.0 abcdef`

- Elvárt kimenet:

```

5.000

abcdef

```


2. Teszteset: Beolvasás egész és lebegőpontos számokból egyaránt.

- Bemenet: `1 2.5 3 4.2 5`

- Elvárt kimenet:

```

15.700

```


3. Teszteset: Beolvasás hibás karakterekből, majd helyes számokból.

- Bemenet: `abcdef 1.0 2.0`

- Elvárt kimenet:

```

3.000

1.0 2.0

```


4. Teszteset: Beolvasás negatív számokból.

- Bemenet: `-1.5 -2.5 -3.5 -4.5`

- Elvárt kimenet:

```

-12.000

```


5. Teszteset: Üres bemenet.

- Bemenet: `<üres sor>`

- Elvárt kimenet: `<üres sor>`


6. Teszteset: Beolvasás tudományos jelöléssel.

- Bemenet: `1.23e-4 5e3 6E-2`

- Elvárt kimenet:

```

501.230

```


7. Teszteset: Beolvasás nagyobb számokból.

- Bemenet: `1000000000 2000000000 3000000000`

- Elvárt kimenet:

```

6000000000.000

```


Ezek a tesztesetek segítenek ellenőrizni, hogy a program helyesen kezeli a különböző bemeneti adatokat és helyesen fogyasztja el a hibás karaktereket.


Természetesen, vegyük figyelembe az eredeti teszteseteket is, és ellenőrizzük a módosított programot ezekkel is:


Eredeti tesztesetek:


1. Teszteset: Üres bemenet.

- Bemenet: `<üres sor>`

- Elvárt kimenet: `<üres sor>`


2. Teszteset: Beolvasás számokból és nem számokból.

- Bemenet: `1.0 2.0 3.0alma korte szilva`

- Elvárt kimenet:

```

6.000

alma korte szilva

```


3. Teszteset: Beolvasás tudományos jelöléssel.

- Bemenet: `1e-3 -2e-3 bolha 3e-8`

- Elvárt kimenet:

```

-0.001

bolha 3e-8

```


4. Teszteset: Beolvasás hibás karakterekből, majd helyes számokból.

- Bemenet: `jupiter 3.8`

- Elvárt kimenet:

```

3.800

jupiter

```


5. Teszteset: Véletlenszerű bemenet.

- Bemenet: `<véletlen számok és karakterek>`

- Elvárt kimenet: Ebben az esetben nincs előre meghatározott elvárt kimenet, csak azt várjuk, hogy a program helyesen kezelje a bemeneti adatokat és fogyassza el a hibás karaktereket.


Az eredeti tesztesetek is segítenek ellenőrizni, hogy a módosított program helyesen működik a változatos bemeneti adatokkal és helyesen kezeli a hibás karaktereket.

2023. okt. 2. 22:17
Hasznos számodra ez a válasz?
 3/4 anonim ***** válasza:
57%

A fentiből lemaradt:


#include <stdio.h>


int main() {

double total = 0.0;

double num;

char buffer[100];


while (1) {

if (scanf("%lf", &num) == 1) {

total += num;

} else {

// Töröljük a bemeneti puffert, hogy megszabaduljunk a hibás karakterektől

while (getchar() != '\n') {

continue;

}

break;

}

}


printf("%.3lf\n", total);

printf("%s", buffer);


return 0;

}


Ebben a programban a getchar() függvényt használjuk a hibás karakterek fogyasztására a bemeneti pufferekből, miután a scanf() hibát észlelt. Ez biztosítja, hogy a hibás karakterek ne befolyásolják a program többi részét.

2023. okt. 2. 22:24
Hasznos számodra ez a válasz?
 4/4 anonim ***** válasza:
36%
Miért írsz ki saját magadnak kérdéseket?
2023. okt. 3. 10:09
Hasznos számodra ez a válasz?

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!