Presný formát – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Presný formát – C / C++ – Fórum – Programujte.comPresný formát – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
Keyzio0
Newbie
11. 11. 2012   #1
-
0
-

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)
Nahlásit jako SPAM
IP: 78.80.54.–
ingiraxo+15
Grafoman
11. 11. 2012   #2
-
0
-

#1 Keyzio
máš to dobře, jen ve formátu pro čtení není čárka, takže

"%d%d".. vypsat to pak muzes s carkou pres printf("%d, %d", den, castka)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Radek Chalupa
~ Redaktor
+1
Super člen
11. 11. 2012   #3
-
0
-

#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

Nahlásit jako SPAM
IP: 213.220.211.–
Keyzio0
Newbie
11. 11. 2012   #4
-
0
-

#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

Nahlásit jako SPAM
IP: 78.80.54.–
ingiraxo+15
Grafoman
11. 11. 2012   #5
-
0
-

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ášť

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Keyzio0
Newbie
11. 11. 2012   #6
-
0
-

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

Nahlásit jako SPAM
IP: 78.80.54.–
ingiraxo+15
Grafoman
11. 11. 2012   #7
-
0
-

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

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Keyzio0
Newbie
11. 11. 2012   #8
-
0
-

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;
   }
  }
}
}
Nahlásit jako SPAM
IP: 78.80.54.–
ingiraxo+15
Grafoman
11. 11. 2012   #9
-
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)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
KIIV
~ Moderátor
+43
God of flame
11. 11. 2012   #10
-
+1
-
Zajímavé

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

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
metthal
~ Anonymní uživatel
27 příspěvků
11. 11. 2012   #11
-
0
-

Alebo to sprav tak ze daj scanf("%d", &cislo) a potom ked ti tento scanf vrati nulu tak preskocis tie znaky cet scanf("%*s")

Nahlásit jako SPAM
IP: 217.144.18.–
Keyzio0
Newbie
11. 11. 2012   #12
-
0
-

#10 KIIV
u tebe se v konzoli dostanu na dalsi radek hnedka po potvrzeni první cislice a ten formate jak jsi to myslel budu mit akorat,  ze vertikalne pod sebou a ne na radce

Nahlásit jako SPAM
IP: 78.80.54.–
KIIV
~ Moderátor
+43
God of flame
11. 11. 2012   #13
-
0
-

#12 Keyzio
? jestli potvrzujes enterem tak prekvapive te to hodi na dalsi radek ...

jinak scanf nic nevypisuje ani neradkuje a podobne..

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Keyzio0
Newbie
11. 11. 2012   #14
-
0
-

#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;	
			}
		}
		}
	}
Nahlásit jako SPAM
IP: 78.80.54.–
KIIV
~ Moderátor
+43
God of flame
11. 11. 2012   #15
-
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

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Keyzio0
Newbie
11. 11. 2012   #16
-
0
-

#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.
Nahlásit jako SPAM
IP: 78.80.54.–
KIIV
~ Moderátor
+43
God of flame
11. 11. 2012   #17
-
0
-

tak tady se pouziva presmerovani souboru na standardni vstup... evidentne testuji, zda taky testujes EOF (end of file)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
11. 11. 2012   #18
-
0
-

vetsi problem podle me bude s tim zaokrouhlovanim na halire vzdy dolu... %.2f zaokrouhluje normalne

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Keyzio0
Newbie
11. 11. 2012   #19
-
0
-

na zaokrouhleni jsem chtel pouzit floor ale takle mi to prislo nejrychlejsi

Nahlásit jako SPAM
IP: 78.80.54.–
KIIV
~ Moderátor
+43
God of flame
11. 11. 2012   #20
-
0
-

no jak myslis .. me to podle zadani nepripada spravne ..

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 20 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý