Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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)

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
Tak projekt na VŠ tu za vás nikdo dělat nebude, ale pokud jste narazil na nějaký konkrétní problém,…
Kurt 17.10.2014 14:08
Kurt
Narazil jsem na další problém. Máme zadanou tabulku, kde jsou jména a čísla a z nich pak máme dělat…
Ces666 20.10.2014 10:05
Ces666
Seš si jistý, že ta informace je přesná a úplná? Nebos to jen slyšel ze třetí ruky tichou poštou, že…
JoDiK 20.10.2014 10:26
JoDiK
Operace a jejich výstup Operace select vypíše seznam hodnot z daného výběru. Každá hodnota bude vyp… nový
Ces666 20.10.2014 10:43
Ces666
Asi máš číst normálně ze stdin. Obsah souboru se tam může při spuštění programu přesměrovat. Asi něj… nový
Niko Bellic 20.10.2014 15:19
Niko Bellic
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) d… nový
Ces666 24.10.2014 12:41
Ces666
Pokud chceš poradit konkrétněji, tak musíš upřesnit jak vypadá ten soubor. A máš už jasno, jestli te… nový
Niko Bellic 24.10.2014 13:55
Niko Bellic
Budu pracovat se stdin. Ten program musí fungovat tak když dám do příkazové řádky např. ./proj1 sele… nový
Ces666 24.10.2014 14:05
Ces666
program musí fungovat na kterýkoliv texťák Takže žádný předem daný formát ten soubor nemá? Třeba ja… nový
Niko Bellic 24.10.2014 14:28
Niko Bellic
no netreba zabudat ani na osetrenie, ze necitat viac ako po koniec suboru a samozrejme aj to, ze tol… nový
wam_Spider007 24.10.2014 15:27
wam_Spider007
Už mám udělané čtení znaků z toho souboru, teď ty slova a čísla potřebuju dostat do 2D tabulky a pak… nový
Ces666 24.10.2014 16:31
Ces666
Prosím vás nevíte někdo jak mám napsat aby se mě vypisovali konkrétní řádky? Děkuju za pomoc nový
Ces666 26.10.2014 20:08
Ces666
Nikdo neví?? nový
Ces666 27.10.2014 19:38
Ces666
Tohle nestačilo? Jestli jde jen o to dostat se na 4. řádek v souboru a ten vypsat, tak můžeš třeba… nový
Zdenál 27.10.2014 19:46
Zdenál
./proj1 --help Z toho zmateného to vypadá na Linux/*nix (./program --parametr), ale proč rovnou "ne… nový
ms 27.10.2014 19:54
ms
Musím napsat program na ty funkce co jsem dával nahoru a musí být použitelný na kteroukoli tabulku (… nový
Ces666 27.10.2014 20:03
Ces666
A co jste dosud napsal? Myšlen pochopitelně zdrojový kód. Že se ale blbě ptám a dokonce i vysokoškol… nový
ms 27.10.2014 20:15
ms
Mám napsaný výběr argumentů, že když zadám např. ./proj1 max < tabulka.txt tak se mě spustí program… nový
Ces666 28.10.2014 09:58
Ces666
Ještě si do toho čtení dodělej počítání konců řádků - a máš to v podstatě hotový. ;-) nový
MachR55 30.10.2014 08:27
MachR55
Ještě potřebuju udělat výběr sloupců, to taky nevim jak na to. nový
Ces666 30.10.2014 09:42
Ces666
Do čtení dodělej počítání oddělovačů. Musíš ale vědět, jakým znakem budou sloupce odděleny (nejčastě… nový
MachR55 30.10.2014 10:10
MachR55
Ale zadání neříká nic o tom, že nesmíš načítat zdrojový soubor z disku pomocí fopen atd. Říká, že j… nový
touchwood 30.10.2014 10:23
touchwood
Je zakázané použít následující funkce: volání z rodiny malloc a free - práce s dynamickou pamětí nen… nový
Ces666 31.10.2014 11:35
Ces666
práce se soubory (dočasnými) není v tomto projektu žádoucí. kdo neumí česky... v apatyce nekoupí.. nový
touchwood 03.11.2014 11:35
touchwood
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 nový
Ces666 31.10.2014 13:11
Ces666
Až se zeptáš, s čím máš konkrétně problém, určitě zde nalezneš spoustu rad. Dotaz typu "Ještě potřeb… nový
MachR55 31.10.2014 14:41
MachR55
Tady je můj kód co zatim mám: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <… nový
Ces666 01.11.2014 10:28
Ces666
No a otázka tedy zní jak? S kterou částí kódu máš problémy? Jen drobnost - osobně bych testování na… nový
Zdenál 01.11.2014 16:55
Zdenál
Konkrétní problém je v tom že nevím jak napsat ty podprogramy pro max, min, sum,... a výpis sloupce… nový
Ces666 01.11.2014 17:50
Ces666
... mám udělný čtení znaků z toho souboru. No a to je přece základ, pak už je to snadné - jak ti už… nový
Zdenál 01.11.2014 18:04
Zdenál
Já furt nevim jak zprovoznit ten výpis řádků. Nevim prostě jak na to. nový
Ces666 01.11.2014 20:08
Ces666
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á, ta… nový
Ces666 01.11.2014 21:05
Ces666
Nech si to od kámoše vysvětlit. Nepočítej s tím, že tady uděláme všechno za Tebe! nový
Zdenál 02.11.2014 11:50
Zdenál
poradna jak stehno tady :D :D nový
Ces666 03.11.2014 10:34
Ces666
všichni se ti snaží pomoci, ale ty pomoc evidentně nepotřebuješ, ty chceš pracanta, co ti to napíše… nový
touchwood 03.11.2014 11:37
touchwood
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ě… nový
Ces666 03.11.2014 12:06
Ces666
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 z… nový
MachR55 03.11.2014 12:35
MachR55
Teď mám zatim udělaný tohle na ty sloupce, ale vypisuje mě to jen prázdnej řádek: if(strcmp(argv[2]… nový
Ces666 03.11.2014 13:42
Ces666
teda takhle to mám if(strcmp(argv[2],"cols") == 0) { char znak = c; while((znak=getchar()) != EOF)… nový
Ces666 03.11.2014 13:44
Ces666
Pokud jsem to správně pochopil, očekáváš jako oddělovač sloupců mezeru? Pokud ano, tak proč zvušuješ… nový
MachR55 03.11.2014 14:19
MachR55
P.S.: pokud jsem něco pochopil špatně, omlouvám se, Céčko jsem potkal asi tak před 10 lety jen z ryc… nový
MachR55 03.11.2014 14:20
MachR55
tu proměnnou predZnak tam má proto abych mohl porovnávat např. jestli to je mezera nebo znak a porov… nový
Ces666 03.11.2014 14:34
Ces666
Co je mezera nebo znak? S proměnnou znak ji určitě neporovnáváš, protože první test if(predZnak ==… nový
MachR55 03.11.2014 15:10
MachR55
Promiň já teď řeším víc věcí na jednou. Teď jsem si uvědomil že ten predZnak = c je blbost. Já jsem… nový
Ces666 04.11.2014 21:50
Ces666
Už to zase zesložiťuješ. Tvůj hlavní problém je ten, že neumíš algoritmizovat, tj. rozložit si logic… nový
MachR55 05.11.2014 11:41
MachR55
Díky moc, trošku jsem to poupravil a už to funguje, ještě bych potřeboval pomoct vypisovat interval… nový
Ces666 08.11.2014 13:33
Ces666
Stačí přece před výpis přihodit test (napíšu to obecně, Céčko mě minulo široký obloukem, takže ten u… poslední
Zdenál 09.11.2014 15:28
Zdenál

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

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

Tohle nestačilo?

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

./proj1 --help

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.

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.

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:

A co jste dosud napsal? Myšlen pochopitelně zdrojový kód.

Tady je můj kód co zatim mám:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>



void select(int rows)
{	
	int  c;
	int counter = 0;

	while ((c=getchar()) != EOF)
	{
		
	//	printf("%c",c);
		if (c == '\n')
		counter++;
	//	if (counter+1 == (int)argv[1][0])
		if ((counter + 1) == rows)
			{
  			printf("%c", c);
			}
	}		
	printf("\n");
}

int main (int argc, char *argv[])
{

int rows = strtol(argv[2],NULL,10);

/* test poctu argumentu 1*/
  if (argc == 1)
    {
    printf("\nChybi argumenty programu.\n");
    return EXIT_FAILURE;
    }

/* test poctu argumentu */
    if (argc > 7)
        {
        printf("\nNespravny pocet argumentu programu.\n");
        return EXIT_FAILURE;
        }

        if (strcmp(argv[1],"--help") == 0)
          {
         printf("\nNápověda\n");
          }

        else if (strcmp(argv[1],"max") == 0)
          {
         printf("\nProgram na max.\n");
          }

        else  if (strcmp(argv[1],"min") == 0)
          {
         printf("\nProgram na min.\n");
          }

        else if (strcmp(argv[1],"sum") == 0)
          {
         printf("\nProgram na sum.\n");
          }

         else if (strcmp(argv[1],"avg") == 0)
          {
         printf("\nProgram na avg.\n");
          }

        else if (strcmp(argv[1],"select") == 0)
	  {
	   if(strcmp(argv[2],"rows") == 0)
	   {


	   }
	  }
       	else printf("Ĺ patnĂ˝ prvnĂ­ argument, trololo!\n"); 

return 0;
}

... mám udělný čtení znaků z toho souboru.

No a to je přece základ, pak už je to snadné - jak ti už bylo poraděno:

Ještě si do toho čtení dodělej počítání konců řádků - a máš to v podstatě hotový. ;-)
...
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, ...)

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

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:

if(strcmp(argv[2],"cols") == 0)
{
    char znak = c;

    while((znak=getchar()) != EOF)
    {
        if(predZnak == ' ' && znak != ' ')
        {
            cols++;
        }
        if(predZnak != ' ' && znak == ' ')
        {
            cols++;
        }
        if(znak == '\n')
        {
            rows++;
            cols = 0;
        }
        predZnak = c;
    }
    printf("\n");
}
}

teda takhle to mám

if(strcmp(argv[2],"cols") == 0)
{
    char znak = c;

    while((znak=getchar()) != EOF)
    {
        if(predZnak == ' ' && znak != ' ')
        {
            cols++;
        }
        if(predZnak != ' ' && znak == ' ')
        {
            cols++;
        }
        if(znak == '\n')
        {
            rows++;
            cols = 0;
        }
        predZnak = c;
    }
    if(cols == strtol(argv[3],NULL,10))
    {
        printf("%c",znak);
    }
    printf("\n");
}
}

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())?

Co je mezera nebo znak?
S proměnnou znak ji určitě neporovnáváš, protože první test

if(predZnak == ' ' && znak != ' ')

značí - když je predZnak mezera a znak není mezera, pak ...
A druhý test

if(predZnak != ' ' && znak == ' ')

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

if(znak == predZnak)
  {
  cols++;
  }

Ale s tím nahoře opravdu nevím, jaký máš úmysly.

Zkus ještě odpovědět:

Kde ji plníš před prvním průchodem (myslím tím ten predZnak)?
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íš?

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:

cols = 1;
while((znak=getchar()) != EOF)
  {
  if(znak == '\n')
    {
      printf("%c",oddelovac);
      cols = 1;
    }
  if(znak == oddelovac)
    {
      cols++;
    }
  if(cols == zadanysloupec)
    {
      printf("%c",znak);
    }
  printf("\n");
}

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.

        char znak;
        int counter;
        double hodnota = 0;
        double pomProm = 0;
        double vysledek = 0;
        char predZnak = 'a';
        int pocitadlo = 0;
 
        while((znak = getchar()) != EOF)
        {
                if(znak == '\n')
                {
                        counter++;
                        vypocty(hodnota,&vysledek,operace,&pocitadlo);
                        hodnota = 0;
                }
 
 
                if((counter + 1) == row)
                {
                        if((znak == ' ' && predZnak != ' '))
                        {
                        vypocty(hodnota,&vysledek,operace,&pocitadlo);
                        hodnota = 0;
                        }
 			
			if(predZnak != ' ' && znak == ' ')
			printf("\n");
			
                        if(znak != ' ' && znak != '\n')
                        {		
	
                        if (operace == 0)
                        printf("%c",znak);
 
                        else
                        {
                        hodnota *= 10;
                        pomProm = znak - '0';
 
                        if(pomProm >= 0 && pomProm <= 9)
                        hodnota += pomProm;
 
                        else
                         {
                        printf("\nNečíselné hodnoty\n");
                          exit(EXIT_FAILURE);
                         }
 
                        }
		
                        }
                }
	predZnak = znak;
	}
	
	printf("\n")
}

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

když (aktuální_řádek >= řádek_start) a (aktuální_řádek <= řádek_konec) pak
  <výpis_řádku>

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!

Zpět do poradny Odpovědět na původní otázku Nahoru