Diskuze: C / C++?

C++ C a C++ C / C++?

Avatar
Jakub Jirkal
Člen
Avatar
Jakub Jirkal:

Dobrý den,
nějaký ten pátek už programuji v C#, ale jsem nucen přejít na jiný jazyk z důvodu soutěží (Mo/P, PilsProg..) kde se tento jazyk použít nedá. Proto se chci zeptat zda by jste mi více doporučili C nebo C++. V Pythonu psát nesmím (ve škole povolují pouze Javu, C, C++ a C#). Něco málo jsem koukal na C++, ale přijde mi až moc složité. Co váš názor?

 
Odpovědět 25.1.2015 11:19
Avatar
Jirka Vavřík:

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?…

Editováno 25.1.2015 12:36
Nahoru Odpovědět 25.1.2015 12:36
Inteligentní nemá čas si pamatovat, inteligentní musí vymýšlet.
Avatar
Jakub Jirkal
Člen
Avatar
Jakub Jirkal:

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ý.

 
Nahoru Odpovědět 25.1.2015 12:42
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Jakub Jirkal
David Čápka:

Určitě C++, tam jsou alespoň řetězce a objekty :)

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 25.1.2015 12:47
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Jakub Jirkal
Člen
Avatar
Jakub Jirkal:

Dobře, budu používat C++ :). Dík za rady.

 
Nahoru Odpovědět 25.1.2015 13:01
Avatar
patrik.valkovic
Šéfredaktor
Avatar
patrik.valkovic:

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++.

Editováno 25.1.2015 16:30
Nahoru Odpovědět 25.1.2015 16:30
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Jakub Jirkal
Martin Dráb:

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ší.

Nahoru Odpovědět 25.1.2015 16:33
2 + 2 = 5 for extremely large values of 2
Avatar
Jakub Jirkal
Člen
Avatar
Odpovídá na Martin Dráb
Jakub Jirkal:

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

  • 99

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 :)

 
Nahoru Odpovědět 25.1.2015 16:39
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Jakub Jirkal
Martin Dráb:

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.

Nahoru Odpovědět 25.1.2015 16:51
2 + 2 = 5 for extremely large values of 2
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Jakub Jirkal
Jan Vargovský:

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.

 
Nahoru Odpovědět 25.1.2015 17:59
Avatar
Jakub Jirkal
Člen
Avatar
Jakub Jirkal:

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).

 
Nahoru Odpovědět 25.1.2015 18:28
Avatar
Jakub Jirkal
Člen
Avatar
Odpovídá na Jan Vargovský
Jakub Jirkal:

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í...

 
Nahoru Odpovědět 25.1.2015 18:30
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Jakub Jirkal
Jan Vargovský:

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.

 
Nahoru Odpovědět 25.1.2015 18:33
Avatar
Jakub Jirkal
Člen
Avatar
Jakub Jirkal:

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.

 
Nahoru Odpovědět 25.1.2015 18:49
Avatar
Jakub Jirkal
Člen
Avatar
Odpovídá na Jan Vargovský
Jakub Jirkal:

Vstup
3
2 5
51 21
1 -99

Výstup
10
1071

  • 99
 
Nahoru Odpovědět 25.1.2015 18:50
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Jakub Jirkal
Jan Vargovský:

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.

 
Nahoru Odpovědět 25.1.2015 18:59
Avatar
Jakub Jirkal
Člen
Avatar
Odpovídá na Jan Vargovský
Jakub Jirkal:

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 :D

 
Nahoru Odpovědět 25.1.2015 19:02
Avatar
Odpovídá na Jakub Jirkal
Lukáš Hruda (Luckin):

Pokud chceš jazyk, který je podobný C#, tak se nauč Javu.

 
Nahoru Odpovědět 25.1.2015 19:03
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Jakub Jirkal
Jan Vargovský:
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
 }
 
Nahoru Odpovědět 25.1.2015 19:04
Avatar
Jakub Jirkal
Člen
Avatar
Odpovídá na Lukáš Hruda (Luckin)
Jakub Jirkal:

Javu v soutěžích jen málokdy povolují :/

 
Nahoru Odpovědět 25.1.2015 19:08
Avatar
Jakub Jirkal
Člen
Avatar
Odpovídá na Jan Vargovský
Jakub Jirkal:

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;
 }
 
Nahoru Odpovědět 25.1.2015 19:10
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Jakub Jirkal
Jan Vargovský:
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 :D

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;
}
 
Nahoru Odpovědět 25.1.2015 19:16
Avatar
Jakub Jirkal
Člen
Avatar
Odpovídá na Jan Vargovský
Jakub Jirkal:

Teď jsem dosadil a pochopil. :D Načítání souborů je snad nejlehčí co sem kdy viděl. Máš pravdu, C++ je moc dobrá volba. Díky moc :)

 
Nahoru Odpovědět 25.1.2015 19:24
Avatar
Odpovídá na Jakub Jirkal
Libor Šimo (libcosenior):

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;
}
Nahoru Odpovědět 26.1.2015 10:38
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 24 zpráv z 24.