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

Člen

Zobrazeno 24 zpráv z 24.
//= 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.
Obecně se dá říct, že až na výjimky je C podmnožinou C++
http://www.linuxsoft.cz/article.php?…
http://www.linuxsoft.cz/article.php?…
http://www.linuxsoft.cz/article.php?…
Co by jste tedy doporučil? V C je o mnoho snažší načtení ze souboru a to později převést na řádky. Co jsem to zkoušel v C++, samotné načtení, uložení do řetězce a pozdější převod na řádky, který se ještě rozdělí na 2 rozměrné pole není tak snadný.
Určitě C++, tam jsou alespoň řetězce a objekty
Dobře, budu používat C++ . Dík za rady.
Cokoliv, co napíšeš v C, funguje i v C++. Kromě toho má C++ objektové nádstavby (takže například nepoužívá printf ale objekt cout a podobně). Chci tím říct, že načtení souboru v C je stejně snadné jako v C++.
Jak tu někdo už napsal, C je až na výjimky podmnožinou C++. To znamená, že i v programu psaném v C++ můžeš používat i Cčkové věci. Příslušné hlavičkové soubory obvykle k dispozici jsou. Takže by neměl být problém načítat data ze souborů Cčkovou metodou a následně je zpracovávat pomocí nástrojů (asi zejména STL, ne?) dostupných pro C++.
Nevím tedy, jak na těchto soutěžích rozlišují, zda píšeš v C či v C++, zda to vůbec řeší.
Na soutěžích většinou dovolují C, C++ nebo Pascal, někdy Javu.
Příklad vypadá například následovně:
Vstup
3
2 5
51 21
1 -99
Výstup
10
1071
Znamená to že každý řádek se vynásobí a výsledek se uloží na
řádek do výstupního souboru. Nevíte někdo o nějakém čtení o vstupech a
výstupech čtených po řádcích a pozdějším ,,nasplitování,, po
mezerách? Dík
S tím jazykem mě zajímá, zda vadí, když řekneš, že budeš programovat v C++ a použiješ tam obrat, který se obvykle dělá v Cčku (nebudeš načítat soubor přes streamy, ale přes fopen/fread/fclose, i třeba proto, že to může být rychlejší).
Nevím, zda na to načítání existuje nějaká rozumná funkce v popsaných jazycích. Ale pokud máš jistotu, že vstuup je vždy platný, tak bych to řešil klidně ručně. V C++ se na hledání mezer dají využít věci jako std::find_if a práce s iterátory. V Pascalu zase funkce Pos a funkce Val na převod řetězce na číslo.
Většinou se vše čte ze standardního vstupu a vypisuje na standardní výstup. Opět většinou máš všude zadáno kolik je na každém řádku čísel, takže si to nemusíš vůbec řešit. C++ se mi líbí v tom, že když načítáš čísla (což v soutěži je velká většina vstupních dat), tak tě to vůbec nezajímá, tvůj vstup by šel napsat takto:
int t;
cin >> t;
while(t-- > 0)
{
int a,b;
cin >> a >> b;
cout << a*b << endl;
}
Kdyby sis chtěl takové věci vyzkoušet, tak si zkus nějaké úlohy z UVY (uva online judge). Na soutěže ti z jazyku stačí fakt velmi málo a nepotřebuješ tam nějaké bláznoviny.
Obecně je asi jedno, jestli v tom C++ kódu použiju prvky z Céčka. Funguje to tak, že je zadán kompiler (přesně https://gcc.gnu.org/) a výsledný program pak spustí v debuggeru (http://www.gnu.org/…gdb/gdb.html).
Jak by mohla vypadat ta část programu, která by dostala název souboru a měla by ho celý převést do pole a to pak rozdělit na 2D? V C# k tomu stačilo několik knihovních funkcí...
Dej mi přesný vstup a výstup. Btw, když se naučíš načítat nebo vypisovat na standardní vstup, tak pro soubor už tam jen přidáš jen 2 řádky a jedním replacem ti funguje celý program. Případně používám freopen.
Přesný vstup a výstup dávám stejný, jako byl nahoře. Má C++ nějaké podobné knihuvní funkce typu
Console.Write(": ");
string nazev = Console.ReadLine();
string[] vRadcich = File.ReadAllLines(nazev);
N = Convert.ToInt32(vRadcich[0]);
pole = Array.ConvertAll(vRadcich[1].Split(' '), int.Parse);
?
Toto přesně načetlo dva řádky (bylo předem řečeno) a poté ten 2.
rozdělilo na pole.
Já tě chápu, ale C++ je v tomto lepší jazyk, protože nemusíš načítat celý vstup, pak ho různě splitovat, ale načteš co potřebuješ a jen s tím pracuješ. Koukni na ten kód, co jsem tam poslal.
Zadání na soutěžích je většinou tak, že máš jednotlivé case, pro ty načteš data, vyhodnotíš a vyplivneš výsledek. Je úplně zbytečné něco držet v paměti (tím narážím na to ukládání do 2d pole), pak z toho dostaneš akorát time limit exceeded.
Dobře tedy. Ale kde se v tom tvém kódu načítá alespoň ta část vstupu
s kterou pracuješ? Ztrácím se v tom
Pokud chceš jazyk, který je podobný C#, tak se nauč Javu.
int t;
cin >> t; // načtu kolik je vstupních dat
while(t-- > 0) // dokud jsou ještě nějaké vstupní data
{
int a,b;
cin >> a >> b; // načtu vstupní data
cout << a*b << endl; // vyplivnu výsledek
}
To bych pochopil, ale mě by zajímalo to, jak by to mělo vypadat přímo. Dám typ:
int t;
stream str(nazev souboru);
t = str(1. řádek);
while(t-- > 0)
{
int a,b;
a = t. řádek před mezerou
b+ = t. řádek za mezerou
cout << a*b << endl;
}
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
int t;
cin >> t;
while (t-- > 0)
{
int a, b;
cin >> a >> b;
cout << a*b << endl;
}
nebo skrz klasické streamy, kde nenačítáš z standardního
vstupu/výstupu, ale z tvého proudu. Teoreticky, když bys ty streamy
pojmenoval cin a cout, tak bys tam taky nemusel nic měnit
ifstream in("in.txt");
ofstream out("out.txt");
int t;
in >> t;
while (t-- > 0)
{
int a, b;
in >> a >> b;
out << a*b << endl;
}
Teď jsem dosadil a pochopil. Načítání souborů je snad nejlehčí co sem kdy viděl. Máš
pravdu, C++ je moc dobrá volba. Díky moc
V čistom C je to tiež jednoduché:
#include <stdio.h>
int main(void)
{
FILE *fr = fopen("in.txt", "r"), *fw = fopen("out.txt", "w");
int t;
fscanf(fr, "%d", &t);
while (t-- > 0) {
int a, b;
fscanf(fr, "%d%d", &a, &b);
fprintf(fw, "%d\n", a * b);
}
fclose(fr);
fclose(fw);
return 0;
}
Zobrazeno 24 zpráv z 24.