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


Zobrazeno 9 zpráv z 9.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.