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
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
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…
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 <…
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…
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…
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ž…
Zdenál 01.11.2014 18:04
Zdenál
Já furt nevim jak zprovoznit ten výpis řádků. Nevim prostě jak na to.
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…
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!
Zdenál 02.11.2014 11:50
Zdenál
poradna jak stehno tady :D :D
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…
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ě…
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…
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]…
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)…
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

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