Jazyk C - funkce a pole

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

wayerlp
nováček
Příspěvky: 4
Registrován: květen 17
Pohlaví: Nespecifikováno

Jazyk C - funkce a pole

Příspěvekod wayerlp » 15 kvě 2017 11:22

Dobrý den, nevim si rady s tímhle. Poradíte jak to udělat?

Upravte (dokončete) rozpracovaný program "pole1a.c" (níže ke stažení) tak, aby ho řídilo jednoduché barevné menu.

Kromě již hotových funkcí

zadani_pole()
tisk_pole()
nahodne_pole()

bude obsahovat ještě další alespoň 3 funkce pro výpočet, zobrazení, nějakou akci s polem, např.:

aritmetický průměr
minimum nebo maximum
seřazení (uspořádání) metodou bubblesort nebo minimax
modus (nejčetnější prvek)
medián (prostřední prvek)
počet kladných, záporných a nulových prvků
...? - další dostatečně náročná funkce




#include<stdio.h>

// pole je výhodné mít v globální proměnné (většinou)
#define ROZSAH 20

int pole_a[ROZSAH];

void zadani_pole(int pole[], int pocet_prvku)
{
int i; // pomocná proměnná pro cyklus
printf("Zadejte postupně %i celých čísel:\n", pocet_prvku);
for(i=0; i<pocet_prvku; i++)
{
printf("%i. hodnota = ", i+1);
scanf("%i", &pole[i]);
}
}

void tisk_pole(int pole[], int pocet_prvku)
{
int i; // pomocná proměnná pro cyklus
printf("\nKontrolní tisk:\n");
for(i=0; i<pocet_prvku; i++)
printf("%i, ", pole[i]);
printf("\b\b.\n"); // úprava tisku na konci
}

void nahodne_pole(int pole[], int pocet_prvku)
{
int i;
int a, b; // rozsah od...do pro náhodná čísla
printf("Zadejte rozsah náhodných hodnot (např. -50,50): ");
scanf("%i , %i", &a, &b);
if(b<a) // pokud jsou meze obráceně, vyměníme je
{
a+=b;
b=a-b;
a-=b;
}
srand(time(NULL)); // start generátoru náhodných čísel
for(i=0; i<pocet_prvku;i++)
pole[i] = rand()%(b-a+1) + a;
}

void main()
{
printf("Práce s polem celých čísel\n"
"==========================\n\n");
zadani_pole(pole_a, ROZSAH);
tisk_pole(pole_a, ROZSAH);
nahodne_pole(pole_a, ROZSAH);
tisk_pole(pole_a, ROZSAH);
}



Reklama
Uživatelský avatar
satik
Level 5.5
Level 5.5
Příspěvky: 2521
Registrován: leden 15
Bydliště: Praha / Krkonoše
Pohlaví: Muž

Re: Jazyk C - funkce a pole

Příspěvekod satik » 15 kvě 2017 12:00

Na čem přesně ses zasek? Takhle to vypadá, že netušíš vůbec nic...
https://www.facebook.com/peasantsandcastles/
https://www.twitch.tv/satikcz/
https://www.youtube.com/c/SatikCZE
PC: AMD Ryzen 1700 @ 4 GHz+BQ SL 280, ASUS Crosshair VI HERO, 32GB RAM, MSI GTX 1080 Gaming Z, Fractal Define S, Seasonic P860, SSD 2TB celkem
Periferie: ASUS ROG SWIFT, Razer Deathadder+Blackadder Chroma, Steelseries QcK+, Sennheiser PC360, DXRACER OH/KF06/NB

wayerlp
nováček
Příspěvky: 4
Registrován: květen 17
Pohlaví: Nespecifikováno

Re: Jazyk C - funkce a pole

Příspěvekod wayerlp » 15 kvě 2017 12:10

no netuším vubec jak na to

lubo007
Level 2.5
Level 2.5
Příspěvky: 307
Registrován: srpen 14
Pohlaví: Muž

Re: Jazyk C - funkce a pole

Příspěvekod lubo007 » 15 kvě 2017 14:21

No vzdy postupne prechadzas pole pomocou cyklu a bud ho naplnas svojimi hodnotami, alebe nahodnymi hodnotami, alebo ich vypisujes... No a ty urob podobne fukncie ktore budu robit to co maju- priklad s pocitanim kladnych/zapornych/nulovych hodnot.. Pre kazdy pocet si vytvoris premennu, nastavis ju na nulu, budes prechadzat cele pole a pomocou IF testovat ci je hodnota kladna, zaporna alebo nulova,,, tu premennu potom zvysis a na ko ci vypises hlasku o tom kolko akych hodnot sa v poli nachadza... Obdobne budes riesit aj priemer, median atd

Uživatelský avatar
faraon
Master Level 8
Master Level 8
Příspěvky: 5966
Registrován: prosinec 10
Pohlaví: Muž

Re: Jazyk C - funkce a pole

Příspěvekod faraon » 15 kvě 2017 16:28

Netušíš jak na to, ale na co? Na ty funkce, nebo na to menu?

Přidat další funkce je triviální. Podívej se třeba na tuhle, kterou v tom programu už máš:

Kód: Vybrat vše

void tisk_pole(int pole[], int pocet_prvku)
{
   int i;   // pomocná proměnná pro cyklus

   printf("\nKontrolní tisk:\n");
   for(i=0; i<pocet_prvku; i++)
      printf("%i, ", pole[i]);
   printf("\b\b.\n");   // úprava tisku na konci
}

Vidíš jak funguje? Prostě cyklem projdeš pole jeden prvek po druhém, a něco s ním provedeš, jak píše lubo007. V tomhle případě ten prvek vypíšeš na obrazovku. A co když chceš provést něco jiného, třeba najít největší číslo? Tak úplně stejným cyklem projdeš zase celé pole, ale místo výpisu ho porovnáš s minulým největším, které zatím našel:

Kód: Vybrat vše

void max_prvek(int pole[], int pocet_prvku)
{
   int i;   // pomocná proměnná pro cyklus
   int max;   // pomocná proměnná pro maximum

   max=pole[0];   // potřebuješ počáteční hodnotu pro první porovnání
   for(i=1; i<pocet_prvku; i++)   // nultý prvek už máš v max, takže můžeš začít až od prvního
      if (pole[i]>max)
         max=pole[i];   // tohle snad vysvětlovat nemusím
   printf("\nMaximum: %d\n",max);
}

Něco nejasného?

Příště kód dávej do tagu (code), to je páté tlačítko v první řadě nad okénkem editoru, pak zůstane zachované odsazování. A mezi jednotlivými funkcemi je dobré vynechávat tři prázdné řádky, ne jeden, program je pak mnohem přehlednější.

Pokud nevíš jak na to menu, tak nejjednodušší způsob je položky očíslovat, přes scanf() nechat uživatele zadat číslo funkce kterou chce, otestovat jestli nezadal číslo mimo rozsah(!), a potom pomocí if nebo switch zavolat požadovanou funkci.

A jestli nevíš jak na ty barvičky, tak je potřeba nejdřív zjistit co podporuje tvůj terminál. Dnes by měly ANSI kódy fungovat ve všech.
Nejhroznější sen linuxáka: nabootuje počítač, a tam Windows.
Nejhroznější sen windowsáka: nabootuje počítač, a tam Linux.
Nejkrásnější sen linuxáka: nabootuje počítač, a tam Linux.
Nejkrásnější sen windowsáka: nabootuje počítač.

wayerlp
nováček
Příspěvky: 4
Registrován: květen 17
Pohlaví: Nespecifikováno

Re: Jazyk C - funkce a pole

Příspěvekod wayerlp » 29 kvě 2017 11:14

A nemáte někde názornou ukázku jednotlivých funkcí?

Uživatelský avatar
faraon
Master Level 8
Master Level 8
Příspěvky: 5966
Registrován: prosinec 10
Pohlaví: Muž

Re: Jazyk C - funkce a pole

Příspěvekod faraon » 29 kvě 2017 23:46

Ale mám, skoro v každé slušné učebnici programování. Třeba aritmetický průměr je velmi vhodný pro výuku.

Hele, umíš ty v tom Céčku aspoň Hello World? ;-)
Nejhroznější sen linuxáka: nabootuje počítač, a tam Windows.
Nejhroznější sen windowsáka: nabootuje počítač, a tam Linux.
Nejkrásnější sen linuxáka: nabootuje počítač, a tam Linux.
Nejkrásnější sen windowsáka: nabootuje počítač.

wayerlp
nováček
Příspěvky: 4
Registrován: květen 17
Pohlaví: Nespecifikováno

Re: Jazyk C - funkce a pole

Příspěvekod wayerlp » 04 čer 2017 23:17

Je to správně?

Kód: Vybrat vše

#include <stdio.h>
#include <stdlib.h> /* pro funkci rand(), srand90 */
#include <time.h> /* pro funkci time(): */
#include "moje.h"

// pole je výhodné mít v globální proměnné (většinou)
#define ROZSAH 20

int pole_a[ROZSAH];

void zadani_pole(int pole[], int pocet_prvku)
{
   int i;   // pomocná proměnná pro cyklus
   printf("Zadejte postupně %i celých čísel:\n", pocet_prvku);
   for(i=0; i<pocet_prvku; i++)
   {
      printf("%i. hodnota = ", i+1);
      scanf("%i", &pole[i]);
   }
}

void tisk_pole(int pole[], int pocet_prvku)
{
   int i;   // pomocná proměnná pro cyklus
   printf("\nKontrolní tisk:\n");
   for(i=0; i<pocet_prvku; i++)
      printf("%i, ", pole[i]);
   printf("\b\b.\n");   // úprava tisku na konci
}

void nahodne_pole(int pole[], int pocet_prvku)
{
   int i;
   int a, b;   // rozsah od...do pro náhodná čísla
   printf("Zadejte rozsah náhodných hodnot (např. -50,50): ");
   scanf("%i , %i", &a, &b);
   if(b<a) // pokud jsou meze obráceně, vyměníme je
   {
      a+=b;
      b=a-b;
      a-=b;
   }
   srand(time(NULL));   // start generátoru náhodných čísel
   for(i=0; i<pocet_prvku;i++)
      pole[i] = rand()%(b-a+1) + a;
}

void aritmeticky_prumer(int pole[], int pocet_prvku)
{
   float sum = 0;
   int i;

   for(i=0; i<pocet_prvku; i++)
   {
      sum = sum + pole[i];
   }
   sum = sum / pocet_prvku;

   printf("Artimetická průměr je: %f\n", sum);
}

void min_max(int pole[], int pocet_prvku)
{
   int min;
   int max;
   int i;

   for(i=0; i<pocet_prvku; i++)
   {
      if (i != 0)
      {
         if (pole[i] < min)
         {
            min = pole[i];
         }
         else if (pole[i] > max)
         {
            max = pole[i];
         }
      }
      else
      {
         min = pole[i];
         max = pole[i];
      }
   }

   printf("Minimum z daných čísel je: %i\nMaximum z daných čísel je: %i\n", min, max);
}

void zaporne_kladne_nula(int pole[], int pocet_prvku)
{
   int zaporne=0;
   int kladne=0;
   int nula=0;
   int i;

   for(i=0; i<pocet_prvku; i++)
   {
      if (pole[i] > 0)
      {
         kladne++;
      }
      else if (pole[i] < 0)
      {
         zaporne++;
      }
      else
      {
         nula++;
      }
   }
   printf("Počet kladných čisel: %i\n", kladne);
   printf("Počet záporných čisel: %i\n", zaporne);
   printf("Počet nul: %i\n", nula);
}

void main()
{
   int vyber;
   printf("Práce s polem celých čísel\n"
          "==========================\n\n");
   cprintf(GREEN, "1) Zadat pole ručne\n");
   cprintf(GREEN, "2) Generovat pole automaticky\n");
   printf("\n");
   printf("Zadejte prosím číslo Vámi zvolené položky: ");
   scanf("%i", &vyber);
   printf("\n");
   if (vyber == 1)
   {
      zadani_pole(pole_a, ROZSAH);
   }
   else
   {
      nahodne_pole(pole_a, ROZSAH);
   }
   tisk_pole(pole_a, ROZSAH);
   vyber = 0;
   printf("\n");
   while(1)
   {
      cprintf(BLUE, "1) Vypočítat aritmetický průměr\n");
      cprintf(BLUE, "2) Zjistit maximum a minumum\n");
      cprintf(BLUE, "3) Zjistit počet kladných, záporných čísel a nul\n");
      cprintf(BLUE, "4) Konec\n");
      printf("\n");
      printf("Zadejte prosím číslo Vámi zvolené položky: ");
      scanf("%i", &vyber);
      printf("\n");
      if (vyber == 1)
      {
         aritmeticky_prumer(pole_a, ROZSAH);
      }
      else if (vyber == 2)
      {
         min_max(pole_a, ROZSAH);
      }
      else if (vyber == 3)
      {
         zaporne_kladne_nula(pole_a, ROZSAH);
      }
      else
      {
         break;
      }
      printf("\n");
   }
}

Uživatelský avatar
faraon
Master Level 8
Master Level 8
Příspěvky: 5966
Registrován: prosinec 10
Pohlaví: Muž

Re: Jazyk C - funkce a pole

Příspěvekod faraon » 05 čer 2017 18:41

Bez "moje.h" to nevyzkouším, ale od oka by to mohlo být.

Akorát pár drobností - srand() bych použil jenom jednou na úplném začátku programu, pokud bys totiž stihl zavolat danou funkci víckrát během jedné sekundy, vždy by se vygenerovala stejná posloupnost, což by mohlo třeba vytvořit bezpečnostní díru.

To prohození mezí pomocí počítání je zbytečně komplikované a pomalé, vzhledem k tomu že používáš smíšené komentáře, /**/ a //, předpokládám že to kompiluješ jako C99, takže si můžeš v bloku mezi { a } deklarovat lokální proměnnou, která se dá použít jako dočasná pro swapování. Vzhledem k délce jejího života se možná ani nebude alokovat na zásobníku a kompilátor jí zoptimalizuje na pouhý registr, což bude určitě rychlejší než několikeré sčítání a odčítání.
Také v tom momentě nevyužíváš proměnnou i, tu bys mohl pro tuhle činnost použít, ale není to zrovna známka dobrého stylu.
Nakonec, znáš a^=b^=a^=b; ? :lol:

Proč tam máš void main()? S návratovou hodnotou programu se dá běžně pracovat v dávkových souborech už od dob MS-DOSu, sice se nic nestane když nebude, ale je slušnost aby program sdělil jestli skončil normálně nebo nějakou chybou. Ten return 0; na konci není zase tak moc. A funkce bez udaných parametrů už jsou značně "obsolete", pokud bys to dělal v prototypech tak si dokonce koleduješ o malér, je lepší překladači sdělit že opravdu žádné parametry nebudou: int main(void).

Nějaké ty prapopisné chybky, v komentáři to nevadí, ale ve výpisu "Aritmetická průměr" bude vypadat blbě.

A mezi jednotlivými funkcemi udělej tři prázdné řádky místo jednoho, uvidíš jak se zdroják zpřehlední. Jeden prázdný řádek se dává mezi jednotlivé bloky vykonávající různé činnosti uvnitř jedné funkce.
Nejhroznější sen linuxáka: nabootuje počítač, a tam Windows.
Nejhroznější sen windowsáka: nabootuje počítač, a tam Linux.
Nejkrásnější sen linuxáka: nabootuje počítač, a tam Linux.
Nejkrásnější sen windowsáka: nabootuje počítač.

cpp
nováček
Příspěvky: 41
Registrován: červen 17
Pohlaví: Muž

Re: Jazyk C - funkce a pole

Příspěvekod cpp » 06 čer 2017 22:17

takže si můžeš v bloku mezi { a } deklarovat lokální proměnnou, která se dá použít jako dočasná pro swapování


A nebo se dá proměnná rovnou definovat jako registrová. Otázka je, jestli to moderní překladače neignorují. Deklarovat proměnnou v bloku možná ani nebude potřeba, optimalizátory moderních překladačů jsou velmi chytré.

pro tazatele:
Jenom jsem kód zběžně prolétl a mám několik připomínek:

1. Proč myslíš, že pole je vhodné deklarovat jako globální?
2. Je dobré, že tzv. magic numbers nepíšeš přímo do výrazů, ale existuje modernější způsob než #define. Raději používej globální konstatní proměnnou. Budeš pak mít lepší typovou kontrolu než s #define. Výkonu programu to také neuškodí, jelikož optimalizátory jsou chytré a ve skutečnosti žádnou proměnnou nevytvoří, ale přímo vloží hodnotu.

Uživatelský avatar
faraon
Master Level 8
Master Level 8
Příspěvky: 5966
Registrován: prosinec 10
Pohlaví: Muž

Re: Jazyk C - funkce a pole

Příspěvekod faraon » 06 čer 2017 22:20

Ignorují. Udělají si to jak se jim nejvíc hodí.

Protože se pole nemusí předávat jako parametr. Pro začátečníky méně pracné.

Preprocesor ušetří práci optimalizátoru.
Nejhroznější sen linuxáka: nabootuje počítač, a tam Windows.
Nejhroznější sen windowsáka: nabootuje počítač, a tam Linux.
Nejkrásnější sen linuxáka: nabootuje počítač, a tam Linux.
Nejkrásnější sen windowsáka: nabootuje počítač.

cpp
nováček
Příspěvky: 41
Registrován: červen 17
Pohlaví: Muž

Re: Jazyk C - funkce a pole

Příspěvekod cpp » 06 čer 2017 22:56

Méně pracné, ale nevede k vytvoření správných návyků.

Preprocesor ušetří čas optimalizátoru, ale zase přijdeš o výhodu lepší typové kontroly. Pro optimalizátor je to malina, vzhledem k tomu, co jiného musí dělat. Podle mě je důležitější čitelnost zdrojového a komfor programátora kódu, než šetřit čas optimalizátoru. Tím neříkám, že by se neměl psát efektivní kód, ale že je lepší se vyhýbat takovým optimalizacím jako použití bitových posuvů místo dělení/násobení mocninou dvou.


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Jazyk C Cykly
    od syrdava14 » 24 led 2017 13:53 » v Programování a tvorba webu
    1
    284
    od faraon
    24 led 2017 17:08
  • Jazyk C-podmíněné příkazy-pomoc
    od syrdava14 » 23 led 2017 21:46 » v Programování a tvorba webu
    6
    385
    od syrdava14
    24 led 2017 10:23
  • Excel: Pomoc s vyhledáním funkce
    od enterthename » 29 led 2017 23:29 » v Kancelářské balíky
    2
    316
    od xlnc
    30 led 2017 21:57
  • Funkce KDYŽ a rozbalovací seznam
    od Betty80 » 17 srp 2017 16:51 » v Kancelářské balíky
    4
    351
    od Betty80
    23 srp 2017 09:42
  • Obrácená funkce zastrčení konektoru sluchátek
    od Karbanatek » 26 bře 2017 13:40 » v Problémy s hardwarem
    0
    121
    od Karbanatek
    26 bře 2017 13:40

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: CommonCrawl [Bot] a 0 hostů