
Jazyk C
Dobrý den, narazil jsem na Vaši poradnu a řekl jsem si, že by mě odtud někdo mohl pomoc. Potřeboval bych pomoc s projektem v Jazyku C, který mám na VŠ. Nejsem ještě moc zběhlý v programování a tento projekt je pro mě dost obtížný. Chtěl bych se zeptat jestli je tu někdo ochotný mně s tím trochu pomoc. Děkuji mockrát.
Změna kategorie, původně: Ostatní (Kurt)
Tak projekt na VŠ tu za vás nikdo dělat nebude, ale pokud jste narazil na nějaký konkrétní problém, pak se klidně ptejte.
Narazil jsem na další problém. Máme zadanou tabulku, kde jsou jména a čísla a z nich pak máme dělat ty min, max, row, atd... Myslel jsem, že ten soubor budu načítat pomocí fopen,fscanf atd. ale dnes nám upravili zadání a tyto funkce nesmíme použít. Jak jinak se dají načítat data z textového souboru a dále s nima pracovat? Děkuji
Seš si jistý, že ta informace je přesná a úplná? Nebos to jen slyšel ze třetí ruky tichou poštou, že tam něco říkali? Protože bez otevření souboru se z něj IMHO opravdu číst nedá a jinak než fopen se soubor otevřít nedá. Tak si raději zjisti přesné zadání, bez něj se programovat nedá.
Operace a jejich výstup
Operace select vypíše seznam hodnot z daného výběru. Každá hodnota bude vypsána na jeden řádek. V případě, že hodnota je číslo, bude vypsáno formátem %.10g funkce printf. V případě, že výběr zahrnuje více řádků či sloupců, hodnoty tabulky budou zpracovávány po řádcích, tj. nejprve všechny hodnoty daného řádku zleva doprava, pak hodnoty následujícího řádku.
Operace min, max, sum a avg pracují pouze nad buňkami obsahující číselné údaje. Funkce vypíší výsledek jako jedno číslo formátu %.10g na samostatný řádek.
Je zakázané použít následující funkce:
volání z rodiny malloc a free - práce s dynamickou pamětí není v tomto projektu zapotřebí,
volání z rodiny fopen, fclose, fscanf, ... - práce se soubory (dočasnými) není v tomto projektu žádoucí.
Asi máš číst normálně ze stdin. Obsah souboru se tam může při spuštění programu přesměrovat. Asi nějak takto:
./program <<<"neco.txt"
Pak nemusíš (a asi ani nemáš) řešit čtení ze souboru.
Prosím vás jak mám udělat načítání znaků z toho nějakého souboru a načítat jednotliví znaky(čísla) do 2D tabulky? Děkuji za pomoc
Pokud chceš poradit konkrétněji, tak musíš upřesnit jak vypadá ten soubor.
A máš už jasno, jestli teda budeš pracovat přímo se soubory, nebo se standardním vstupem (na který se soubor přesměruje)?
Budu pracovat se stdin. Ten program musí fungovat tak když dám do příkazové řádky např. ./proj1 select row 4 <tabulka.txt tak mě to musí vypsat 4. řádek. A ten program musí fungovat na kterýkoliv texťák.
Takže žádný předem daný formát ten soubor nemá? Třeba jak jsou definovány řádky, sloupce, přesný počet mezer apod.?
Jestli jde jen o to dostat se na 4. řádek v souboru a ten vypsat, tak můžeš třeba číst vstup po znacích a počítat konce řádku - to je buď \n (používá Linux) nebo \r\n (používá Windows). Můžeš to udělat kompatibilní pro oba způsoby, jde jen o jednoduchou podmínku. Jak napočítáš konec 3. řádku tak víš, že za ním už leží 4. řádek, tak ten normálně načteš a vypíšeš až do dalšího konce řádku (klidně také po znaku, nebo pomocí scanf).
no netreba zabudat ani na osetrenie, ze necitat viac ako po koniec suboru a samozrejme aj to, ze tolko riadkov kolko je zadane na vstupe ani nemusi mat :)
Už mám udělané čtení znaků z toho souboru, teď ty slova a čísla potřebuju dostat do 2D tabulky a pak už by to mělo být v pohodě.
Prosím vás nevíte někdo jak mám napsat aby se mě vypisovali konkrétní řádky? Děkuju za pomoc
Nikdo neví??
Tohle nestačilo?
Z toho zmateného to vypadá na Linux/*nix (./program --parametr), ale proč rovnou "nedá" zdrojový kód toho programu a zadání té jeho seminárky, nebo co to je. Podle datumu to bude úloha na zápočet a pro "připuštění" ke zkoušce.
Musím napsat program na ty funkce co jsem dával nahoru a musí být použitelný na kteroukoli tabulku (txt) a ano pracujem v linuxech a program píšu ve VIM editoru
A co jste dosud napsal? Myšlen pochopitelně zdrojový kód.
Že se ale blbě ptám a dokonce i vysokoškoláčka...
Mám napsaný výběr argumentů, že když zadám např. ./proj1 max < tabulka.txt tak se mě spustí program na vyhledání maxima tabulky (tu funkci na max ještě nemám) a mám udělný čtení znaků z toho souboru.
Ještě si do toho čtení dodělej počítání konců řádků - a máš to v podstatě hotový.
Ještě potřebuju udělat výběr sloupců, to taky nevim jak na to.
Do čtení dodělej počítání oddělovačů. Musíš ale vědět, jakým znakem budou sloupce odděleny (nejčastěji mezera, středník, ...)
Ale zadání neříká nic o tom, že nesmíš načítat zdrojový soubor z disku pomocí fopen atd.
Říká, že je nemáš použít pro ŘEŠENÍ úlohy. Tj. načíst můžeš, ale neměl by sis mezivýsledky zpracovávané ve funkcích (což je předmětem úlohy) ukládat do souboru nebo do dynamické paměti.
Je třeba číst řádně zadání!
Je zakázané použít následující funkce:
volání z rodiny malloc a free - práce s dynamickou pamětí není v tomto projektu zapotřebí,
volání z rodiny fopen, fclose, fscanf, ... - práce se soubory (dočasnými) není v tomto projektu žádoucí.
Já si myslim že tohle je dostatečná odpověď pro tebe.
kdo neumí česky... v apatyce nekoupí..
Mohl byste mě s tím někdo pomoct prosím? Už mě začíná tlačit čas a moc toho nemám. Děkuju
Až se zeptáš, s čím máš konkrétně problém, určitě zde nalezneš spoustu rad. Dotaz typu "Ještě potřebuju udělat výběr sloupců" opravdu není konkrétní problém.
Viz MS:
Tady je můj kód co zatim mám:
No a otázka tedy zní jak? S kterou částí kódu máš problémy?
Jen drobnost - osobně bych testování na zadaný parametr řešil spíše pomocí switch - case, připadá mi to přehlednější než hejno else-if: c12.php
Konkrétní problém je v tom že nevím jak napsat ty podprogramy pro max, min, sum,... a výpis sloupce a řádků.
No a to je přece základ, pak už je to snadné - jak ti už bylo poraděno:
Až budeš tohle mít, budeš schopen zjistit hodnotu v každé přečtené buňce, že?
Pak lze třeba podprogram pro zjištění maxima algoritmizovat následovně:
- MAX = 0
- čti ze souboru, dokud nedojdeš na jeho konec
- je-li přečtená hodnota v buňce větší než MAX => MAX = hodnota
Minimum, suma apod. je podobný.
Já furt nevim jak zprovoznit ten výpis řádků. Nevim prostě jak na to.
Tak řádky mám, teď potřebuju sloupce,ale to už jsem v háji, když jsem viděl kód kámoše jak to má, tak je jasný že tohle nezvládnu :/
Nech si to od kámoše vysvětlit. Nepočítej s tím, že tady uděláme všechno za Tebe!
poradna jak stehno tady :D :D
všichni se ti snaží pomoci, ale ty pomoc evidentně nepotřebuješ, ty chceš pracanta, co ti to napíše za tebe..
Já jsem psal že bych potřeboval poradit s tím jak mám udělat výběr sloupců a na to mě nikdo neodpověděl, ale na urážení je tady každej pohotovej
A to teda máme čmuchat nebo hádat, jak přesně to máš doteď uděláno? Tvůj problém lze vyřešit mnoha způsoby - například já bych to dělal pomocí dvourozměrného pole třeba takto:
Společná část - naplnění pole (provede se vždy)
- načtu řádek
- rozparsuji dle oddělovače
- naplním odpovídající řádek onoho dvourozměrného pole rozparsovanými hodnotami - tj. a[i,j] kde i je zafixováno, j se mění od 1 do počtu prvků v řádku
- opakuji do dosažení konce souboru
Výpis řádku:
- vypíšu prvky a[i,j] kde i je zafixováno (odpovídá požadovanému číslu řádku), j se mění od 1 do počtu prvků v řádku
Výpis sloupce:
- vypíšu prvky a[i,j] kde j je zafixováno (odpovídá požadovanému číslu sloupce), i se mění od 1 do celkového počtu řádků
Ale co když třeba doteď s polem nepracuješ? To se budeš zase ptát, jak to máš skloubit s tím, co už máš?
Zeptej se konkrétně - tj. vlepíš sem kus kódu a napíšeš "na pátým řádku mi to hází tu a tu chybu", "mezi řádky 15 až 16 bych chtěl to rozdělení do sloupců", atd.,
Teď mám zatim udělaný tohle na ty sloupce, ale vypisuje mě to jen prázdnej řádek:
teda takhle to mám
Pokud jsem to správně pochopil, očekáváš jako oddělovač sloupců mezeru?
Pokud ano, tak proč zvušuješ počitadlo sloupců cols i v případě, že načteš jiný znak, než mezeru?
Proč tam vůbec máš tu proměnnou predZnak?
Kde ji plníš před prvním průchodem?
Proč ji v každém průchodu přiřazuješ stále stejnou hodnotu proměnné c (predZnak = c)?
Co vlastně obsahuje ta proměnná c a kde ji plníš?
Jaký má smysl do proměnné znak uložit hodnotu proměnné c (char znak = c), když ji pak okamžitě přpíšeš načtenou hodnotou ze souboru (znak=getchar())?
P.S.: pokud jsem něco pochopil špatně, omlouvám se, Céčko jsem potkal asi tak před 10 lety jen z rychlíku, jinak dělám v Delphi nebo VBA.
tu proměnnou predZnak tam má proto abych mohl porovnávat např. jestli to je mezera nebo znak a porovnávám to s proměnnou znak
Co je mezera nebo znak?
S proměnnou znak ji určitě neporovnáváš, protože první test
značí - když je predZnak mezera a znak není mezera, pak ...
A druhý test
zase - když predZnak není mezera a znak je mezera, pak ...
Pochopil bych, kdyby proměnná predZnak obsahovala dělící znak mezi sloupci (klidně by ses na ten oddělovač mohl zeptat na začátku programu) a měl bys při tom načítání místo těch dvou testů jediný:
Ale s tím nahoře opravdu nevím, jaký máš úmysly.
Zkus ještě odpovědět:
Leze to z Tebe jak z chlupatý deky.
Promiň já teď řeším víc věcí na jednou. Teď jsem si uvědomil že ten predZnak = c je blbost. Já jsem chtěl prostě udělat podmínky a nějak to na kombinovat se sloupcema, ale teď jsem se do toho tak zamotal že už nevím jak to udělat. Možná by to bylo jednodušší to načítat do pole kazdej řádek jako buffer který může mít max 1024 znaků na řádek se a rozdělit ho nějak na sloupce ale nevím jak.
Už to zase zesložiťuješ. Tvůj hlavní problém je ten, že neumíš algoritmizovat, tj. rozložit si logicky úkol na jednodušší části a slovně popsat přesný postup řešení problému. A "vo tom to je", tohle je naprosto nezbytný základ každého programátora!
Myslím tím třeba tohle:
- nastavím počitadlo sloupců na 1
- načtu znak ze souboru (opakuji, dokud není přečten znak EOF)
- je načten konec řádku?
- - pokud ano, vypíšu na výstup znak oddělovače a nastavím počitadlo sloupců na 1
- je načten znak oddělovače sloupců?
- - pokud ano, zvětším počitadlo sloupců o 1
- odpovídá počitadlo sloupců zadanému sloupci?
- - pokud ano, vypíšu načtený znak
- jdu zpět na načtení dalšího znaku
Znak pro oddělovač sloupců si v předchozím programu buď pevně zadáš nebo vypíšeš na obrazovku požadavek, ať jej zadá uživatel a znak pro oddělovač odtud načteš.
Ve výstupu (což má být výpis sloupce) tak budou vypsány všechny prvky daného sloupce, oddělené stejným oddělovačem, jako ve vstupním souboru.
Samozřejmě to jde i jinak - třeba přes ten buffer, nebo přes dvourozměrné pole, nebo dalšími dvaceti pěti způsoby, ale vyšel jsem z toho, co ses pokusil naprogramovat.
Zápis do Céčka už dokáže z toho popisu vyrobit každá lépe vycvičená opice:
Díky moc, trošku jsem to poupravil a už to funguje, ještě bych potřeboval pomoct vypisovat interval od nějakého řádku po nějaký řádek. Měl by jít upravit nějak tenhle kód, ale nevim jak. Děkuju za pomoc.
Stačí přece před výpis přihodit test (napíšu to obecně, Céčko mě minulo široký obloukem, takže ten uvedený kód ani nezkoumám):
Příčemž:
aktuální_řádek - číslo právě zpracovávaného řádku
řádek_start - počáteční řádek, která se má vypsat (zadaná hodnota)
řádek_konec - koncový řádek, která se má vypsat (zadaná hodnota)
Opravdu se prvně nauč algoritmizovat!