Ahoj, chtěl bych aby uživatel zadal "číslo, číslo" např:
1, 500
nebo
5, -8000
jak mam docílit, aby musel napsat presny format:
jedine co me jako amatera napadlo je:
scanf("%d, %d", &den, &castka)
#1 Keyzio
Přijde na to zda to má být konzolová aplikace nebo běžná okenní se standardním vstupním prvkem "edit control" na dialogu, nebo zda chceš použít nějakou knihovnu která má "maskedit" nebo něco podobného...
Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz
#3 Radek Chalupa
je to konzolová aplikace....
chci aby uživatlel napsal číselnou hodnut za ní čárku a mazeru a další číselnou hodnotu jinak bude vyvolána výjimka,
Nebo uživatel napíše číselnou hodnotu pak pomocí printf zapíši ", " (čárka mezera) a zase nechám uživatele zadat číslo.
U druhého způsobu nevím jak buď to skočit na předchozí řádek v printf nebo jak ve scanf zabránit skoku na nový řádek
pokud chceš, aby uživatel zadal přesně třeba toto
"200, 500", tak to nesmíš načítat jako číslo, ale jako text (char*, string) a to si potom rozpasovat podle čárky a přiřadit do proměnných
mnohem jednodušší je udělat 2 vstupy na každou hodnotu zvlášť
když napíše uživatel: "2, 500", tak bych rád abych se číslo 2 uložilo do prom1 a číslo 500 do prom2, ale když uživatel napíše "2 500" tak to nenapsal ve správném formátu, protože mu tam chybí čárka mezi konstantami a neprojde tak podminkou
však to jsem ti to ted napsal nebo čekáš, až ti sem někdo napíše přesnej kód?
logicky pokud tam nebude existovat čárka a mezera, tak to hodí chybu kterou chceš.. si najdi jak se parsuje text.. poradim, že se k tomu používá funkce strtok(..) .. jde to i regexem, ale to je podle mě zbytečně komplikovaný pro tak jednoduchou věc
Tak úplný zdroják samozřejmě nechci, ale snažím se pochopit proč tak složitě, když o té to funkci nemůžu najít ani zmínku v látce, kterou jsme probírali a to max 3 lekce.
Možná jsem udělal chybu, když jsem vytrhl z kontextu o co vlastně jde, snad se lecos změní:
mám naprogramovat primitivní bankomat s tím, že průběh programu vypadá nějak takto :
Zadejte kreditni urok [%]:
0.02
Zadejte debetni urok [%]:
0.4
Zadejte transakce:
10, 20000
25, -15000
45, -10000
70, 5000
100, 0
Zustatek: -491.27
kde první číslo transakce je den vkladu a druhé číslo vklad/výběr
Zatím jsem vykutil toto:
#include <stdio.h>
int main( int argc, char * argv [] ) {
double k_urok;
double d_urok;
double zustatek = 0;
int castka;
double vklad;
int p_den = 0;
int den = 0;
double p_zustatek;
printf("Zadejte kreditni urok [%%]:\n");
scanf("%lf", &k_urok);
if ( k_urok <= 0 ) {
printf("Nespravny vstup.\n");
return 0;
}
printf("Zadejte debetni urok [%%]:\n");
scanf("%lf", &d_urok);
if ( k_urok <= 0 ) {
printf("Nespravny vstup.\n");
return 0;
}
//-------------------------------------//
printf("Zadejte transakce:\n");
for ( ; ; ){
scanf("%d %d", &den, &castka );
if (den <= p_den){
printf("Nespravny vstup.\n");
return 0;
}
scanf("%d", &castka );
if (castka < 0 || castka > 0)
zustatek += castka;
}
if ( castka == 0 ) {
if ( zustatek >= 0 ){
p_zustatek = zustatek;
printf("Zustatek: %lf\n", (zustatek/100) * k_urok+ p_zustatek);
return 0;
}
else {
printf("Zustatek: %lf\n", (zustatek/100) * d_urok + p_zustatek);
return 0;
}
}
}
}
podle mě ta čárka tam je jen proto, aby se v zadání oddělili ty 2 čísla.. jinak to bude jak to ted máš - zadáš zasebou hned 2 čísla... pokud jste nebrali strtok, tak to bude takto pouze
a místo for(;;) pouzij while(1)
tak tam dej scanf("%d%c%c%d", &a, &znak1, &znak2, &b) a akorat zkontrolujes jestli se nacetly 4 promenne + jestli znak1 a 2 jsou carka a mezera... co se s tim parat
#13 KIIV
no dobře a jak si tedy můžu vyzkoušet jestli mi aplikace funguje s přesným formátem na řádek když jediné co znám je , že potvrzuji v konzoli enterem?
jinak jsem zkompletoval tento kod:
#include <stdio.h>
int main( int argc, char * argv [] ) {
double k_urok;
double d_urok;
double zustatek = 0;
int castka;
double vklad;
int p_den = 0;
int den = 0;
double p_zustatek;
char carka = ',';
char mezera = ' ';
printf("Zadejte kreditni urok [%%]:\n");
scanf("%lf", &k_urok);
if ( k_urok <= 0 ) {
printf("Nespravny vstup.\n");
return 0;
}
printf("Zadejte debetni urok [%%]:\n");
scanf("%lf", &d_urok);
if ( k_urok <= 0 ) {
printf("Nespravny vstup.\n");
return 0;
}
//-------------------------------------//
printf("Zadejte transakce:\n");
while (1){
scanf("%d%c%c%d", &den, &carka, &mezera, &castka);
if (den <= p_den || carka != ',' || mezera != ' '){
printf("Nespravny vstup.\n");
return 0;
}
p_den = den;
if (castka < 0 || castka > 0) {
zustatek += castka;
}
if ( castka == 0 ) {
p_zustatek = zustatek;
if ( zustatek >= 0 ){
printf("Zustatek: %.2f\n", (zustatek/100) * k_urok + p_zustatek);
return 0;
}
else {
printf("Zustatek: %.2f\n", ((zustatek/100) * d_urok) * (-1) + p_zustatek);
return 0;
}
}
}
}
stale nechapu co chces... funguje to presne jak myslim ze ma fungovat:
Zadejte kreditni urok [%]:
3.2
Zadejte debetni urok [%]:
1
Zadejte transakce:
1, 2034
2, -2345
3, 12093
100, 12233
200, 1
599, 0
Zustatek: 24784.51
a pak si to propocitat
#15 KIIV
Já nevím jak to vysvetlit, zkusim sem dat zadani prikladu a snad pochopis co mam udelat
Úkolem je realizovat program, který bude počítat zůstatek na bankovním účtu. Program bude zpracovávat transakce (vklad, výběr) a bude zohledňovat úročení.
Předpokládáme, že banka vede účty v korunách. Svým klientům umožňuje vkládat a vybírat peníze, ale připouští vždy nejvýše jednu operaci za jeden den. Dále, banka je benevolentní a umožňuje neomezený debet. Kreditní zůstatek je úročen kreditní úrokovou mírou, debet je úročen debetní sazbou (která může být odlišná). Úročení probíhá vždy po jednotlivých dnech. Výše zůstatku i výše připsaného/strženého úroku musí být vždy vyjádřena a počítána v korunách a celých haléřích. Všechny částky se zaokrouhlují dolů (tedy připsaný/stržený úrok ve výši 1.3499 bude zpracován jako částka 1.34). V daný den se úročí částka, která byla na účtu v půlnoci, vklad/výběr se v úročení tedy projeví až následující den.
Vstupem programu jsou hodnoty kreditní a debetní úrokové sazby v podobě dvou desetinných čísel. Hodnoty vyjadřují denní úrok v procentech. Následuje seznam transakcí. Každá transakce je tvořena dvěma čísly: dnem provedení transakce a částkou. Transakce jsou na vstupu zadávané seřazené, tedy čísla dne se zvyšují. Kladná částka představuje vklad, záporná částka představuje výběr. Nulová částka znamená zrušení účtu, program na to zareaguje výpisem celkového zůstatku a ukončením.
Výstupem programu je hodnota zůstatku při rušení účtu. Formát výstupu je zřejmý z ukázek níže. Nezapomeňte na odřádkování za výpisem.
Pokud vstup není platný (na vstupu jsou nečíselné nebo nesmyslné hodnoty), program tuto situaci detekuje a vypíše chybové hlášení. Formát chybového hlášení je opět uveden v ukázkách níže. Za chybu je považováno, pokud je na vstupu:
nečíselná hodnota,
pořadí transakcí není správné (čísla dne v transakci netvoří rostoucí posloupnost) nebo
chybějící oddělovač (částka) v zadání transakce.
Pokud program detekuje chybu, přestane se dotazovat na další vstupní hodnoty, vypíše chybové hlášení a ukončí se. Chybu je tedy potřeba detekovat okamžitě po načtení hodnoty (neodkládejte kontrolu vstupních údajů až za načtení celého vstupu). Chybové hlášení vypisujte na standardní výstup (nevypisujte jej na standardní chybový výstup).
Dodržte přesně formát všech výpisů. Výpis Vašeho programu musí přesně odpovídat ukázkám. Testování provádí stroj, který kontroluje výpis na přesnou shodu. Pokud se výpis Vašeho programu liší od referenčního výstupu, je Vaše odpověď považovaná za nesprávnou. Záleží i na mezerách, i na odřádkování. Nezapomeňte na odřádkování za posledním řádkem výstupu (a za případným chybovým hlášením). Využijte přiložený archiv s testovacími vstupy a výstupy a přečtěte si sekci FAQ, jak využít přesměrování vstupů/výstupů k testování Vašeho programu.
Váš program bude spouštěn v omezeném testovacím prostředí. Je omezen dobou běhu (limit je vidět v logu referenčního řešení) a dále je omezena i velikost dostupné paměti (ale tato úloha by ani s jedním omezením neměla mít problém). Testovací prostředí dále zakazuje používat některé "nebezpečné funkce" -- funkce pro spouštění programu, pro práci se sítí, ... Pokud jsou tyto funkce použité, program se nespustí. Možná ve svém programu používáte volání:
int main ( int argc, char * argv [] )
{
...
system ( "pause" ); /* aby se nezavrelo okno programu */
return 0;
}
Toto nebude v testovacím prostředí fungovat - je zakázáno spouštění jiného programu. (I pokud by se program spustil, byl by odmítnut. Nebyl by totiž nikdo, kdo by pauzu "odmáčkl", program by čekal věčně a překročil by tak maximální dobu běhu.) Pokud tedy chcete zachovat pauzu pro testování na Vašem počítači a zároveň chcete mít jistotu, že program poběží správně, použijte následující trik:
int main ( int argc, char * argv [] )
{
...
#ifndef __PROGTEST__
system ( "pause" ); /* toto progtest "nevidi" */
#endif /* __PROGTEST__ */
return 0;
}
Ukázka práce programu:
Zadejte kreditni urok [%]:
0.01
Zadejte debetni urok [%]:
0.1
Zadejte transakce:
0, 20000
45, -5000
100, 10000
120, 0
Zustatek: 25223.27
Zadejte kreditni urok [%]:
0.02
Zadejte debetni urok [%]:
0.4
Zadejte transakce:
10, 20000
25, -15000
45, -10000
70, 5000
100, 0
Zustatek: -491.27
Zadejte kreditni urok [%]:
abcd
Nespravny vstup.
Zadejte kreditni urok [%]:
0.02
Zadejte debetni urok [%]:
0.3
Zadejte transakce:
5, 2000
0, 3000
Nespravny vstup.
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku