Načítání čísel ze vstupu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Načítání čísel ze vstupu – C / C++ – Fórum – Programujte.comNačítání čísel ze vstupu – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Olda
~ Anonymní uživatel
15 příspěvků
5. 12. 2012   #1
-
0
-

Zdravím,

řeším takový problém, a to čtení čísel ze st. vstupu. Čísla potřebuji uložit do dynamicky alokovaného pole a dle potřeby ho i reallocovat, pokud čísel bude zadáno hodně. Počet čísel není předem dán, ani se nezadává.

Příklad

Zadejte čísla:

50 658 9745 1 2 6544 8 9 6 4478

Pole obsahuje tato čísla: 50 658 9745 1 2 6544 8 9 6 4478

Ale vůbec netuším, jak udělat algoritmus na to načítání do pole, když nevím kolik těch čísel bude (sekvence se ukončuje EOF)

Nahlásit jako SPAM
IP: 86.49.114.–
Reklama
Reklama
RePRO0
Super člen
5. 12. 2012   #2
-
0
-

Zdravím,

jestli používáš C, tak použiješ f-ci realloc/memcpy, pokud C++ tak operátor new.

Ukážu jak to jde s tím memcpy (kopírování paměťi).

Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
RePRO0
Super člen
5. 12. 2012   #3
-
0
-

   

int size = 1;
int* arr = new int[1];

void resize() 
{
    size_t newSize = size * 2;
    int* newArr = new int[newSize];

    memcpy( newArr, arr, size * sizeof(int) );

    size = newSize;
    delete [] arr;
    arr = newArr;
}

Klasická funkce pro kopírování paměti - memcpy (je to v C). Trošku zaměňuji C a C++, ale to snad nevadí (viz. nahoře operátor new). V metodě main po každém načtení čísla zavoláš metodu resize.

Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
Olda
~ Anonymní uživatel
15 příspěvků
5. 12. 2012   #4
-
0
-

Moc děkuji za pohotovou odpověď, to zvětšení pole už jsem měl cca dodělané, používal jsem to už u jiného programu, ale jak jsem psal, spíše si nevím rady s tím načítáním. Kdyby se načítalo po řádku, tak to je jednoduché, ale vůbec netuším, jak to načíst pro více čísel na jednom řádku:

1 2 3 5 6 744 6 78954 4 8 69 411 10 15 48  452 31 např, jak jednotlivé čísla uložit do toho pole.

Ale MOC děkuji za tvůj příspěvek, takhle mě to vůbec nenapadlo zvětšovat a určitě to je lepší řešení než to mé :-)

Nahlásit jako SPAM
IP: 86.49.114.–
Olda
~ Anonymní uživatel
15 příspěvků
5. 12. 2012   #5
-
0
-

A jedná se o C

Nahlásit jako SPAM
IP: 86.49.114.–
RePRO0
Super člen
5. 12. 2012   #6
-
0
-

Jasně, tak nějak už vím, jak na to... Spíš se zeptám, jestli to budeme načítat ze souboru nebo z konzole? Protože mě zatrhlo, jak píšeš o zakončení sekvence EOF (End Of File), což je u souboru, díky.

Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
zlz
~ Anonymní uživatel
634 příspěvků
5. 12. 2012   #7
-
0
-

Která standardní funkce pro čtení vstupu řeší, jestli je ten vstup z konzole nebo souboru?

FILE *f = stdin; // treba
int *pole = NULL, velikostpole = 0, vyuzitipole = 0, hodnota;
while (fscanf(f, "%d", &hodnota) == 1)
{
	if (vyuzitipole == velikostpole)
	{
		int novavelikostpole = velikostpole + 10; // treba
		int *novepole = (int*) realloc(pole, novavelikostpole * sizeof(int));
		if (!novepole) Oops();
		pole = novepole;
		velikostpole = novavelikostpole;
	}
	pole[vyuzitipole++] = hodnota;
}
if (!feof(f))
{
	fprintf(stderr, "chyba pri cteni\n");
}
Nahlásit jako SPAM
IP: 78.156.159.–
RePRO0
Super člen
5. 12. 2012   #8
-
0
-

To je sice hezký, ale řeší se tu vstup, jako třeba: 25 55 68 41 5 8 9. To tvé bere int po intu. ;-)

Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
zlz
~ Anonymní uživatel
634 příspěvků
5. 12. 2012   #9
-
-1
-
Mimo téma

   

Nahlásit jako SPAM
IP: 80.188.216.–
Olda
~ Anonymní uživatel
15 příspěvků
8. 12. 2012   #10
-
0
-

Zdravím,

jedná se o zadávání čísel z konzole, ale ukončí se to EOF, tedy tuším CTRL+Z - if( getchar() == EOF ) then blabla

Stále jsem na to nepřišel :)

Nahlásit jako SPAM
IP: 86.49.114.–
zlz
~ Anonymní uživatel
634 příspěvků
8. 12. 2012   #11
-
0
-

To, co jsem napsal, podle mě, dělá přesně to, co potřebuješ. Jestli ne, tak dotaz upřesni.

Nahlásit jako SPAM
IP: 80.188.216.–
Olda
~ Anonymní uživatel
15 příspěvků
9. 12. 2012   #12
-
0
-

Díky moc, už mi to konečně funguje :-)

Jenom ještě poslední dotaz, ten tvůj kod funguje tak, že za koncem čísel musím dát nový řádek a potom EOF (ctrl+z), šlo by to udělat nějak, aby ten EOF byl na konci těch čísel?

Příklad:

10 20 30 40 50^Z

Protože jinak mi to píše chybu při čtení... díky moc :)

Nahlásit jako SPAM
IP: 86.49.114.–
zlz
~ Anonymní uživatel
634 příspěvků
9. 12. 2012   #13
-
0
-

To je vpořádku. ^Z funguje jako konec vstupu jen na začátku řádku, jinak je součástí vstupu.

Pokud to nutně chceš, tak to stačí přidat do toho testu důvodu přerušení načítání:

if (!feof(f) && fgetc(f) != 26/*^Z*/)
Nahlásit jako SPAM
IP: 80.188.216.–
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, 141 hostů

Podobná vlákna

Postupne nacitani cisel — založil Proxymus

Postupne nacitani cisel — založil Proxymus

Moderátoři diskuze

 

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