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
Stav:
Offline

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 6
Level 6
Příspěvky: 3509
Registrován: leden 15
Bydliště: Krkonoše
Pohlaví: Muž
Stav:
Offline
Kontakt:

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...
PC: MSI RTX 4090 Suprim X, AMD Ryzen 9 7950x3D, ASUS Crosshair HERO X6670E, 64GB RAM@6000CL30, Fractal Define Torrent, Seasonic PRIME TX 1600W, SSD Seagate Firecuda 530 M2 2TB +
4TB + 4TB SATA Micron 5200 ECO
Periferie: Samsung Odyssey G9 Neo + 2x AOC AG271QG, Razer Deathadder, Ducky Shine7, Steelseries QcK+, Beyerdynamic MMX300, Valve Index

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

Re: Jazyk C - funkce a pole

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

no netuším vubec jak na to

lubo007
Level 3
Level 3
Příspěvky: 510
Registrován: srpen 14
Pohlaví: Muž
Stav:
Offline

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.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

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.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

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

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.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

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? ;-)
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

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

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.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

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.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

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

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.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

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.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

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

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
  • ErP - ,,nebezpečná" funkce? Příloha(y)
    od DifiCZ » 05 lis 2023 12:26 » v Vše ostatní (sw)
    11
    2292
    od WolfGunCZ Zobrazit poslední příspěvek
    09 lis 2023 13:16
  • Excel - funkce když
    od Martyn20 » 13 črc 2023 11:56 » v Kancelářské balíky
    5
    2321
    od mmmartin Zobrazit poslední příspěvek
    13 črc 2023 18:44

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

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti