Diskuze: Ošetření vstupu
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
To jsi se s řešením DU na FITu moc nenadřel... Jinak máš špatně tu podmínku. Ve scanf načítáš dvě hodnoty, ale to podmínka tomu vůbec neodpovídá:
if(scanf(" %lf %lf", &a, &b) != 2)
{
// Pokud jsi zde, tak se nenačetly dvě hodnoty...
}
Mnohem lepší způsob než deklarovat několik dvouprvkových polí je vytvořit si tříprvkové pole struktůr se dvěma členy (int nebo double dle tvé potřeby). Důvodem je mnohem lepší čitelnost toho s čím aktuálně pracuješ.
Dále pokud očekávám na vstupu zadání dvou hodnot, nebudu chtít, aby mi uživatel zadal hodnoty čtyři. Funkce scanf() vrací počet úspěšně načtených členů a tedy pokud očekávám dva, porovnávám návratovou hodnotu s hodnotou 2. Ukončovat program když není vstup správně zadán je trochu drastická metoda. Mnohem lepší by bylo hodnotu načítat v do-while cyklu a využívat řídící příkaz continue. Když už ukončuješ program při chybě, používej funkci exit() nikoli return.
Jinak testování návratové hodnoty funkce scanf() je chybně, jak už zde bylo řečeno v předchozím příspěvku. Zápis, který máš jsem už viděl ve tvém jiném vláknu a je chybný.To co provádíš je test na 0 nikoli na počet úspěčně vrácených členů. Výraz v tvém případě se vyhodnocuje v pořadí negace následovaná rovností. Pro nerovnost se používá relační operátor !=.
Presne tak už včera riešil inú vec a mal tam presne toto isté a
nepoužil nič z odporúčaní, asi je zbytočné sa snažiť
Jedna drobná odlišnost tam přeci jenom je. Ve vláknu, kde použil obdobný tvar, se "nerovnost" vztahovala k prvku pole do kterého měla být hodnota načtena. Tam to bylo úplně nesmyslné. Zde je to jiné, "nerovnost" se vztahuje k návratové hodnotě funkce scanf(), což už je správnější. To že byla použita hodnota neodpovídajícímu počtu prvků které se načítají a chybně použitý operátor nerovnosti, už je spíše drobnost daná neznalostí funkce scanf(). Zarážející ale na tom je, že když už byla testována návratová hodnota funkce scanf() na 0, muselo trknout, že se program neustále ukončuje po zadání hodnot před tím, než se načte výzva pro zadání bodu B. Ono pokud compiler vysloveně neohlásí chybu, tak to mnoho dotyčných neřeší a neuvědomující si, že něco v kódu není úplně správně. I varování je důvodem k tomu zvýšit pozornost. Na druhou stranu velice oceňuji, že dotyčný vynaložil úsilí návratovou hodnotu otestovat. Beru to rozhodně pozitivněji, i přes to, že tam byla chyba, než kdyby tak neučinil.
Takto:
#include <stdio.h>
#define POINTMAX 3
struct sPoint {
double x;
double y;
};
struct sPoint Points[POINTMAX];
int main(void) {
int i, n;
printf("Zadani souradnic vsech bodu\n\n");
for (i = 0; i < POINTMAX; i++) {
do {
printf("Zadej souradnici [X,Y] %d. bodu: ", i + 1);
n = scanf("%lf %lf", &Points[i].x, &Points[i].y);
fseek(stdin, 0L, SEEK_END);
if (n != 2) {
printf("Chybna souradnice. Zadejte souradnici znovu.\n\n");
continue;
}
} while (n != 2);
}
printf("\nVypis souradnic vsech bodu\n\n");
for (i = 0; i < POINTMAX; i++) {
printf("%d. bod: [%.2f, %.2f]\n", i+1, Points[i].x, Points[i].y);
}
return 0;
}
Zobrazeno 9 zpráv z 9.