Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: C / C++?

Aktivity
Avatar
Jakub Jirkal
Člen
Avatar
Jakub Jirkal:25.1.2015 11:19

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:25.1.2015 12:36

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
Avatar
Jakub Jirkal
Člen
Avatar
Jakub Jirkal:25.1.2015 12:42

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 Hartinger
Vlastník
Avatar
Odpovídá na Jakub Jirkal
David Hartinger:25.1.2015 12:47

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

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
25.1.2015 12:47
You are the greatest project you will ever work on.
Avatar
Jakub Jirkal
Člen
Avatar
Jakub Jirkal:25.1.2015 13:01

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

 
Nahoru Odpovědět
25.1.2015 13:01
Avatar
Patrik Valkovič:25.1.2015 16:30

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
Tvůrce
Avatar
Odpovídá na Jakub Jirkal
Martin Dráb:25.1.2015 16:33

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:25.1.2015 16:39

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
Tvůrce
Avatar
Odpovídá na Jakub Jirkal
Martin Dráb:25.1.2015 16:51

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ý
Tvůrce
Avatar
Odpovídá na Jakub Jirkal
Jan Vargovský:25.1.2015 17:59

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:25.1.2015 18:28

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:25.1.2015 18:30

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ý
Tvůrce
Avatar
Odpovídá na Jakub Jirkal
Jan Vargovský:25.1.2015 18:33

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:25.1.2015 18:49

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:25.1.2015 18:50

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ý
Tvůrce
Avatar
Odpovídá na Jakub Jirkal
Jan Vargovský:25.1.2015 18:59

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:25.1.2015 19:02

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
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na Jakub Jirkal
Lukáš Hruda:25.1.2015 19:03

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

 
Nahoru Odpovědět
25.1.2015 19:03
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Jakub Jirkal
Jan Vargovský:25.1.2015 19:04
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
Jakub Jirkal:25.1.2015 19:08

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:25.1.2015 19:10

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ý
Tvůrce
Avatar
Odpovídá na Jakub Jirkal
Jan Vargovský:25.1.2015 19:16
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:25.1.2015 19:24

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):26.1.2015 10:38

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.