Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 14. 11. 2009 15:28

case_fcs
Příspěvky: 101
Reputace:   -1 
 

Pole v jazyku C

ahoj prosím o radu, potřebuju napsat program, do kterého uživatel zadá kolik bude zadávat čísel a následně tato čísla zadá a úkolem programu je zjistit, která čísla se tam vyskytla nejčastěji a vypsat jaká čísla to jsou a kolikrát se tam vyskytla

příklad:

chci zadat 8 čísel

zadam čísla: 2 2 1 3 5 4 3 1

a program mi musí vypsat že se nejčastěji vyskytla čísla 1, 2 a 3 a vyskytla se 2x

program mi jen vypisuje kolikrát se které číslo vyskytlo, takže u příkladu který sem uváděla by mi vypsal

číslo 2 se vyskytlo 2x
číslo 1 se vyskytlo 2x
číslo 3 se vyskytlo 2x
číslo 4 se vyskytlo 1x
číslo 5 se vyskytlo 1x

ale nevim jestli mi to vlastně k něčemu je, tak bych se chtěla zeptat jestli by byla možná rada, jak takový program napsat, předem díky

Offline

 

#2 14. 11. 2009 15:31

plisna
Místo: Brno
Příspěvky: 1503
Reputace:   
 

Re: Pole v jazyku C

↑ case_fcs: dej sem svuj kod

Offline

 

#3 14. 11. 2009 15:56

FailED
Příspěvky: 1255
Reputace:   42 
 

Re: Pole v jazyku C

Musíš použít pole? Jestli ano, asi bude nejlepší udělat 2rozměrné pole, jeden rozměr pro ta čísla ze vstupu, druhý pro jejich četnosti, k tomu dvě proměnné, v jedné budeš mít největší výskyt a ve druhé počet různých čísel. Při načítání čísel u každého projdeš pole jestli už tam je, když ano, změníš u něj četnost, jinak ho zapíšeš na konec. Po načtení všech čísel vypíšeš ta, která mají maximální četnost.

Offline

 

#4 14. 11. 2009 15:59 — Editoval case_fcs (14. 11. 2009 16:01)

case_fcs
Příspěvky: 101
Reputace:   -1 
 

Re: Pole v jazyku C

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

#define MIN -200000000
#define MAX  200000000

/*
*
*/
int pole[MAX-MIN];

int main(void) {
  int cislo,test,pocet,i,test2,pom;
 
    printf("Zadejte pocet cisel:\n");
    test = scanf("%d",&pocet);

    if(test<1) {
        printf("Nespravny vstup.\n");
        return(0);
    }

    if (pocet<=0 || pocet>=10000) {
        printf("Nespravny vstup.\n");
        return(0);
    }

    printf("Zadejte cisla:\n");

    for (i=0; i<pocet ;i++) {
       
        test2=scanf("%d", &cislo);

        if (cislo>=MIN && cislo<=MAX)
            pole[cislo-MIN]++;
    }

    if (test2<1){
        printf("Nespravny vstup.\n");
        return(0);
    }


    for (i=MIN; i<=MAX; i++){

        /*if(pole[i-MIN]>pole[i]){
            pom=pole[i];
            pole[i]=pole[i-MIN];
            pole[i-MIN]=pom;
        */
        if (pole[i-MIN]){
            printf("Nejcasteji se opakujici cislo se vyskytlo %dx a bylo to cislo: %d.\n",pole[i-MIN],i);
   
        }
       
        }
   
  return 0;
}



to FailED: ano musím použít pole a to co píšeš, tak myslím že přesně tak nějak by ten postup i měl být, akorát v tom je ten problém, že já moc programování neovládam, takže nemam moc představu jak to napsat, jindy mam aspoň nějaký nápad, teď bohužel jen temno

Offline

 

#5 14. 11. 2009 16:09

FailED
Příspěvky: 1255
Reputace:   42 
 

Re: Pole v jazyku C

↑ case_fcs:
Brali jste dynamické pole?
Podle mě je velikost pole 1,5GB trochu moc pro vstup z konzole, opravdu Ti to funguje?
Pole musíš po deklaraci inicializovat když ho chceš procházet celé a porovnávat hodnoty.

Offline

 

#6 14. 11. 2009 16:13

case_fcs
Příspěvky: 101
Reputace:   -1 
 

Re: Pole v jazyku C

jo jo dynamické pole sme brali, ale neumim ho použít, to 1.5gb to je asi kvuli tomu min a max jak sem zadefinovala co? myslela sem že tim zadam která čísla(odkud kam) je možné použít, chtěla sem aby tam byla všechna čísla co jsou v integeru, ale to mi ňák nešlo, ale asi to chápu špatně, jinak uživatel smí zadat maximálně 10000 čísel, ale čísla mohou být i záporná

Offline

 

#7 14. 11. 2009 16:46

FailED
Příspěvky: 1255
Reputace:   42 
 

Re: Pole v jazyku C

↑ case_fcs:
No tys deklarovala pole jako

Code:

int pole[MAX-MIN];
//to je stejné jako 
int pole[200000000--200000000];

Indexování podle očekávaných hodnot je dobrý nápad, ale v tomhle případě je to nejspíš opravdu moc paměťově náročné.

Pro jednoduchost, a protože potřebujeme jen 2 hodnoty ke každému indexu si asi vytvoř 2 pole, jedno pro čísla, druhé pro četnosti. Pozor, pole četností musíš vynulovat!

Code:

int * PoleCisel;
PoleCisel = (int *) malloc(pocet*sizeof(int));
/* Nesmíš nakonec zapomenout vrátit paměť: */
free(PoleCisel);

Potom ve smyčce     
for (i=0; i<pocet ;i++) {}
Musíš projet pole (doporučuji proměnnou pro počet různých čísel v poli s čísly a projíždět jen nastavené indexy, abys nemusela pole procházet celé, a nemusela počátečně inicializovat pole s čísly)
a jestli tam číslo už je, zvětšíš hodnotu jeho četnosti v poli s četnostmi na stejném indexu.

Nakonec vypíšeš všechna čísla z pole s čísly, která jsou na indexech jako největší četnost v poli s četnostmi.

Offline

 

#8 14. 11. 2009 19:03 — Editoval case_fcs (14. 11. 2009 19:03)

case_fcs
Příspěvky: 101
Reputace:   -1 
 

Re: Pole v jazyku C

jo tak to sme přesně brali, to sem viděla někde v materiálech to malloc a free, akorát já teď právě nevim vůbec jak to používat a napsat

zrovna tohle "a jestli tam číslo už je, zvětšíš hodnotu jeho četnosti v poli s četnostmi na stejném indexu." tak tam nemam žádnou představu pro kód

jo a třeba tohle teda  if (cislo>=MIN && cislo<=MAX)
                             pole[cislo-MIN]++;

a taky tohle for (i=MIN; i<=MAX; i++)
                             if (pole[i-MIN])

co mam v tom programu nebudu potřebovat? to mam totiž z přednášky,nerozumim tomu přesně jak to funguje, ale každopádně, aspoň mi to už vypisovalo který číslo se kolikrát objevilo

nevim teda jak to přepsat, omlouvam se za mou nechápavost, ale tenhle program mi moc do hlavy nejde, tak jestli by bylo prosim možný ještě ňáký bližší přiblížení

Offline

 

#9 14. 11. 2009 19:25 — Editoval FailED (14. 11. 2009 19:31)

FailED
Příspěvky: 1255
Reputace:   42 
 

Re: Pole v jazyku C

↑ case_fcs:

To MIN a MAX jsou konstanty (ještě předtím, než se program přeloží se všude v kódu nahradí svými hodnotami).

Samozřejmě že by ti to fungovalo tvým způsobem, jen bys musela jednou to pole projít a najít největší číslo výskytu a potom vypsat všechna čísla s takovým výskytem.

Já jsem to myslel takhle:
pokud bys měla navíc
dvě pole (celych cisel):
PoleCisel, PoleCetnosti
a dvě další proměnné (cela cisla) pro počet různých čísel a největší četnost
RuznychCisel, NejvyssiCetnost

potom by ten cyklus mohl vypadat třeba takto:

Code:

  for (i=0; i<pocet ;i++) {
        
        test2=scanf("%d", &cislo);

        for (int j=0; j<=RuznychCisel; j++){
             if (PoleCisel[j]==test2){
                PoleCetnosti[j]++;
                if (PoleCetnosti[j]>NejvyssiCetnost){
                   NejvyssiCetnost++;  
                 }
                break;
             }
             else if (j==RuznychCisel){
                PoleCisel[j]=test2;
                PoleCetnosti[j]++;
                RuznychCisel++;
             }
        }
    }

Doufám že jsem to někde nezkopal.

Edit: PoleCetnosti, RuznychCisel a NejvyssiCetnost musíš na začátku nastavit na 0.

Offline

 

#10 14. 11. 2009 19:31

plisna
Místo: Brno
Příspěvky: 1503
Reputace:   
 

Re: Pole v jazyku C

↑ case_fcs: zkus si projit nasledujici kod, ktery dela to, co potrebujes, treba bude pro tebe lepe pochopitelny. prvni cyklus nacte zadany pocet cisel, druhy cyklus mezi nimi nalezne nejvetsi a treti cyklus spocita, kolikrat se tam toto nejvetsi cislo vyskytuje

Code:

#include <iostream>
#include <cstdlib>

int main(int argc, char** argv)
{
    int pocet;
    int * zasobnik;
    
    printf("Kolik cisel budes nacitat? ");
    scanf("%d", &pocet);
    
    zasobnik = (int*) calloc(pocet, sizeof(int));
    
    for (int i = 0; i < pocet; i++) 
    {
        printf("Zadej %d. cislo: ", i + 1);
        scanf("%d", &zasobnik[i]);
    }
    
    int maximum = zasobnik[0];
    
    for (int i = 1; i < pocet; i++)
    {
        if (zasobnik[i] > maximum)
            maximum = zasobnik[i];
    }
    
    int vyskytu = 0;
    
    for (int i = 0; i < pocet; i++)
    {
        if (zasobnik[i] == maximum)
            vyskytu++;
    } 
    
    printf("Maximalni zadana hodnota je %d, vyskytla se %d.\n", maximum, vyskytu);
    
    return 0;
}

Offline

 

#11 14. 11. 2009 19:58

case_fcs
Příspěvky: 101
Reputace:   -1 
 

Re: Pole v jazyku C

to plisna:

já bych právě potřebovala aby mi ten program vypsal nejvyskytovanější číslo popřípadě čísla (pokud se tam některá vyskytnou stejněkrát), tvůj program vypíše největší číslo, každopádně ale děkuji, prozkoumám to a zkusím to trochu přepsat jestli bych na to nějak nepříšla


to FailED:

a tobě taky děkuji zkusim využít tvého kódu, snad už bych to mohla dát dohromady s tak velkou nápovědou :) ale asi stejně ještě budu psát o radu, tak tohle téma prosím ještě sledujte :)

Offline

 

#12 14. 11. 2009 22:09

plisna
Místo: Brno
Příspěvky: 1503
Reputace:   
 

Re: Pole v jazyku C

↑ case_fcs: umis vytvaret struktury a pracovat s nimi?

Offline

 

#13 15. 11. 2009 00:09

case_fcs
Příspěvky: 101
Reputace:   -1 
 

Re: Pole v jazyku C

struktury asi ne, nic mi to neřiká

Offline

 

#14 15. 11. 2009 02:15

case_fcs
Příspěvky: 101
Reputace:   -1 
 

Re: Pole v jazyku C

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

int main(void) {
    int cislo,test,pocet,i,test2,j,RuznychCisel,NejvyssiCetnost;
    int PoleCetnosti[j];
    int *PoleCisel;

    PoleCisel = (int *) malloc(pocet*sizeof(int));

    printf("Zadejte pocet cisel:\n");
    test = scanf("%d",&pocet);

    PoleCetnosti=0;
    RuznychCisel=0;
    NejvyssiCetnost = 0;
   
    if(test<1) {
        printf("Nespravny vstup.\n");
        return(0);
    }

    if (pocet<=0 || pocet>=10000) {
        printf("Nespravny vstup.\n");
        return(0);
    }

    printf("Zadejte cisla:\n");


   
    for (i=0; i<pocet ;i++) {
       
        test2=scanf("%d", &cislo);

        for (j=0; j<=RuznychCisel; j++){
             if (PoleCisel[j]==test2){
                PoleCetnosti[j]++;
                if (PoleCetnosti[j]>NejvyssiCetnost){
                   NejvyssiCetnost++;
                 }
                break;
             }
             else if (j==RuznychCisel){
                PoleCisel[j]=test2;
                PoleCetnosti[j]++;
                RuznychCisel++;
             }
        }
     }

    if (test2<1){
        printf("Nespravny vstup.\n");
        return(0);
    }

    for (j=0;j<RuznychCisel;j++){
    printf("Nejcasteji se opakujici ");

    if(RuznychCisel>1){
        printf("cisla se vyskytla %dx a byla to cisla: ");
        if(RuznychCisel>2 && RuznychCisel<3)
            printf("%d a %d.\n",j,j);
        else if (RuznychCisel>3){
            printf("%d",j);
            printf(",");
            printf("%d");
        }

    }
    else
        printf("cislo se vyskytlo %dx a bylo to cislo: %d.\n",PoleCisel[j],j)
     
    }
free(PoleCisel);
   
  return 0;
}


to FailED:

tak jo už nemůžu, nemam šanci na to přijít, ale potřebovala bych to, tak prosím asi o úplnou radu, je-li to možné, nevim jak to napsat a hlavně na konci toho kódu už mam zmatek, protože pokud se vyskytne více čísel která jsou nejvícekrát zapsaná tak je to potřeba napsat v jedné řádce, ukážu na příkladu

zadám 7 čísel

2 2 1 3 3 5 1

a výpis musí  vypadat takto: Nejcasteji se opakujici cisla se vyskytla 2x a byla to cisla: 1, 2 a 3.

nevim jak tam vepsat tu čárku a to áčko, ikdyž nevim ani co s tim programem celkově, vim že si mi napsal uplně přesnej postup ale stejně tam někde musim dělat chybu protože mi program dovolí napsat jenom jedno číslo a pak vyskočí chyba, tak prosím o detailní radu jak to napsat, moc moc děkuji

Offline

 

#15 15. 11. 2009 12:06

septolet
Příspěvky: 334
Reputace:   
 

Re: Pole v jazyku C

Code:

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

int main()
{
    int pocet = 0, *pole_cisel, *pole_cetnosti;
    printf("Kolik cisel chces zadavat? ");
    scanf("%d", &pocet);
    
    if((pole_cisel = (int *) malloc(pocet * sizeof(int))) == NULL)
    {
                   printf("Chyba pri alokaci pameti\n");
    }
    
    if((pole_cetnosti = (int *) malloc(pocet * sizeof(int))) == NULL)
    {
                   printf("Chyba pri alokaci pameti\n");
    }
    
    for(int i = 0; i < pocet; i++)
    {
            printf("Zadej %d. cislo: ", (i + 1));
            scanf("%d", &pole_cisel[i]);
            pole_cetnosti[i] = 0;
    }
    
    bool p = true;
    for(int i = 0; i < pocet; i++)
    {
            for(int k = i - 1; k > -1; k--) if(pole_cisel[k] == pole_cisel[i]) p = false;
            
            for(int j = i; j < pocet && p; j++)
            {
                    if(pole_cisel[i] == pole_cisel[j]) pole_cetnosti[i]++;                                                        
            }
            p = true;
    }
    
    int max = 0;
    for(int i = 0; i < pocet; i++)
    {
            if(max < pole_cetnosti[i]) max = pole_cetnosti[i];            
    }
    
    for(int i = 0; i < pocet; i++)
    {
            if(pole_cetnosti[i] == max) printf("Cislo %d se v posloupnosti vyskytlo %dx\n", pole_cisel[i], pole_cetnosti[i]);
    } 
    
    return 0;
}

Offline

 

#16 15. 11. 2009 13:06

plisna
Místo: Brno
Příspěvky: 1503
Reputace:   
 

Re: Pole v jazyku C

↑ case_fcs: nize uvadim moznou implementaci tveho programu, ve kterem je pouzita struktura. neni to vubec nic sloziteho a naopak to prinasi mnohe vyhody. strukturu si muzes predstavit jako promennou, ktera v sobe obsahuje dalsi promenne. ja jsem vytvoril strukturu POLOZKA, ktera obsahuje dve vnitrni slozky - integer 'hodnota' pro ulozeni nactene hodnoty a integer 'vyskytu' pro ulozeni cetnosti vyskytu. k vnitrnim slozkam se pristupuje pomoci teckove notace, napr. POLOZKA p, pak lze pouzit p.hodnota nebo p.vyskytu. pri nacitani cisel postupuje program nasledovne: nacte cislo od uzivatele a podiva se, jestli uz takove cislo uzivatel nezadal v predchozich vstupech. pokud ano, tak jej do seznamu neprida, pouze zvysi cetnost u nalezeneho cisla v seznamu. pokud se dane cislo v seznamu nevyskytuje, tak jej prida do seznamu a nastavi cetnost na jednicku. po nacteni vsech cisel program nalezne v cyklu maximalni pocet vyskytu a v dalsim cyklu vypise hodnoty, ktere odpovidaji temto maximalnim vyskytum. pokud je neco nejasneho, tak se ptej, myslim si, ze je to celkem pruhledne.

Code:

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

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

    typedef struct {
        int hodnota;
        int vyskytu;
    } POLOZKA;

    int pocetZadanych;
    int pocetVseznamu = 0;
    int nacteneCislo;
    bool jizUlozene;
    POLOZKA * zasobnik = NULL;

    printf("Kolik cisel budes nacitat? ");
    scanf("%d", &pocetZadanych);

    for (int i = 0; i < pocetZadanych; i++)
    {
        jizUlozene = false;
        printf("Zadej %d. cislo: ", i + 1);
        scanf("%d", &nacteneCislo);

        for (int j = 0; j < pocetVseznamu; j++)
        {
            if (zasobnik[j].hodnota == nacteneCislo)
            {
                zasobnik[j].vyskytu++;
                jizUlozene = true;
            }
        }

        if (jizUlozene == false)
        {
            pocetVseznamu++;
            zasobnik = (POLOZKA*) realloc(zasobnik, pocetVseznamu * sizeof(POLOZKA));
            zasobnik[pocetVseznamu - 1].hodnota = nacteneCislo;
            zasobnik[pocetVseznamu - 1].vyskytu = 1;
        }
    }

    int maximalnichVyskytu = zasobnik[0].vyskytu;

    for (int i = 1; i < pocetVseznamu; i++)
    {
        if (zasobnik[i].vyskytu > maximalnichVyskytu)
            maximalnichVyskytu = zasobnik[i].vyskytu;
    }

    printf("Nejvice - a to %dx se vyskytuji tyto cisla: ", maximalnichVyskytu);

    for (int i = 0; i < pocetVseznamu; i++)
    {
        if (zasobnik[i].vyskytu == maximalnichVyskytu)
            printf("%d  ", zasobnik[i].hodnota);
    }

        printf("\n");

    return (EXIT_SUCCESS);
}

Offline

 

#17 15. 11. 2009 15:44 — Editoval case_fcs (15. 11. 2009 15:56)

case_fcs
Příspěvky: 101
Reputace:   -1 
 

Re: Pole v jazyku C

to plisna:

děkuji ti, akorát já právě asi strukturu nesmim použít, musim použít ty pole, vlastně ten program co sem sem kopírovala naposledy, tak tak by to mělo nějak vypadat, akorát já to neumim ani upravit do tý konečný fáze aby mi to fungovalo, tak u toho bych potřebovala nějak poradit co s tim a doupravit to, ale každopádně stejně ti děkuji, kdybych směla použít struktury (kdyby sme se je už učili a já je uměla :) tak bych tvůj program jistě použila

to septolet:

tobě taky děkuji taky si zkusim něco z tvého programu vzít :)

Offline

 

#18 15. 11. 2009 16:14 — Editoval case_fcs (15. 11. 2009 16:29)

case_fcs
Příspěvky: 101
Reputace:   -1 
 

Re: Pole v jazyku C

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

/*
*
*/

int main(void) {
    int cislo,test,pocet,i,test2,j,RuznychCisel,NejvyssiCetnost;
    //j=0;
    int *PoleCetnosti;
    int *PoleCisel;

   

    printf("Zadejte pocet cisel:\n");
    test = scanf("%d",&pocet);

   
   
    if(test<1) {
        printf("Nespravny vstup.\n");
        return(0);
    }

    if (pocet<=0 || pocet>=10000) {
        printf("Nespravny vstup.\n");
        return(0);
    }

    printf("Zadejte cisla:\n");


    PoleCisel = (int *) malloc(pocet*sizeof(int));

    free(PoleCisel);

    PoleCetnosti=0;
    RuznychCisel=0;
    NejvyssiCetnost = 0;

    for (i=0; i<pocet ;i++) {
       
        test2=scanf("%d", &cislo);

        for (j=0; j<=RuznychCisel; j++){
             if (PoleCisel[j]==test2){
                PoleCetnosti[j]++;
                if (PoleCetnosti[j]>NejvyssiCetnost){
                   NejvyssiCetnost++;
                 }
                //break;
             }
             else if (j==RuznychCisel){
                PoleCisel[j]=test2;
                PoleCetnosti[j]++;
                RuznychCisel++;
             }
        }
     }

    if (test2<1){
        printf("Nespravny vstup.\n");
        return(0);
    }
/*
    for (j=0;j<RuznychCisel;j++){
    printf("Nejcasteji se opakujici ");

    if(RuznychCisel>1){
        printf("cisla se vyskytla %dx a byla to cisla: ");
        if(RuznychCisel>2 && RuznychCisel<3)
            printf("%d a %d.\n",j,j);
        else if (RuznychCisel>3){
            printf("%d",j);
            printf(",");
            printf("%d");
        }

    }
    else
        printf("cislo se vyskytlo %dx a bylo to cislo: %d.\n",PoleCisel[j],j)
     
    }*/

    for (j=0; j<=RuznychCisel;j++)
    {
        if (PoleCetnosti[j]==NejvyssiCetnost)printf("kolikrat: %d cislo: %d\n",PoleCetnosti[j],PoleCisel[j]);
    }

   
  return 0;
}



tak jo prosim co tam dělam pořád špatně že mi to dovolí zadat jenom jedno číslo a pak vyskočí chyba?

jinak prosim někoho kdo by byl schopen tohle teda doupravit tak, aby to fungovalo a dokázalo to i ten výpis jak potřebuji, to jest ukáži na příkladu, který sem tu již uváděla

zadám 7 čísel

2 2 1 3 3 5 1

a výpis musí  vypadat takto: Nejcasteji se opakujici cisla se vyskytla 2x a byla to cisla: 1, 2 a 3.

nevim jak tam vepsat tu čárku a to áčko jo a taky když tam napíšu 5 různých čísel a všechna jen jednou tak se všechna musí taky vypsat že se vyskytla nejvícekrát

tak moc moc prosim, jestli by mi sem někdo neposlal upravenej funkční tenhle muj program

Offline

 

#19 15. 11. 2009 16:36

case_fcs
Příspěvky: 101
Reputace:   -1 
 

Re: Pole v jazyku C

to septolet:

tak teď sem vyzkoušela tvuj program a zjistila sem že dělá vlastně to co potřebuji, jen ještě zkusim upravit ten výstup do té jedné řádky a mělo by to fungovat, tak prosím jestli máte někdo nápad jak udělat ten výstup do jedné řádky, tak se s tím prosím podělte, příklad sem uvedla v příspěvku výše

Offline

 

#20 15. 11. 2009 16:46 — Editoval septolet (15. 11. 2009 18:43)

septolet
Příspěvky: 334
Reputace:   
 

Re: Pole v jazyku C

Tak pokud má být výpis na jedné řádce, tak pak třeba takto:

Code:

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

int main()
{
    int pocet = 0, *pole_cisel, *pole_cetnosti;
    printf("Kolik cisel chces zadavat? ");
    scanf("%d", &pocet);
    
    if((pole_cisel = (int *) malloc(pocet * sizeof(int))) == NULL)
    {
                   printf("Chyba pri alokaci pameti\n");
    }
    
    if((pole_cetnosti = (int *) malloc(pocet * sizeof(int))) == NULL)
    {
                   printf("Chyba pri alokaci pameti\n");
    }
    
    for(int i = 0; i < pocet; i++)
    {
            printf("Zadej %d. cislo: ", (i + 1));
            scanf("%d", &pole_cisel[i]);
            pole_cetnosti[i] = 0;
    }
    
    bool p = true;
    for(int i = 0; i < pocet; i++)
    {
            for(int k = i - 1; k > -1 && p; k--) if(pole_cisel[k] == pole_cisel[i]) p = false;
            
            for(int j = i; j < pocet && p; j++)
            {
                    if(pole_cisel[i] == pole_cisel[j]) pole_cetnosti[i]++;                                                        
            }
            p = true;
    }
    
    int max = 0;
    for(int i = 0; i < pocet; i++)
    {
            if(max < pole_cetnosti[i]) max = pole_cetnosti[i];            
    }
    
    
    printf("Nejvice - a to %dx se v zadane posloupnosti vyskytuji tyto cisla: ", max);
    for(int i = 0; i < pocet; i++)
    {
            if(pole_cetnosti[i] == max) printf("%d, ", pole_cisel[i]);
    } 
    
    free((void *) pole_cisel);
    free((void *) pole_cetnosti);
    return 0;
}

EDIT: + jsem tam ještě dodělal malou změnu, a to v tomto:

Code:

for(int k = i - 1; k > -1 && p; k--) if(pole_cisel[k] == pole_cisel[i]) p = false;

konkrétně tu podmínku. Není třeba procházet celé pole i v případě, že jsme stejné číslo už nalezli. Také jsem doplnil dealokaci paměti.

Offline

 

#21 15. 11. 2009 16:55

FailED
Příspěvky: 1255
Reputace:   42 
 

Re: Pole v jazyku C

↑ case_fcs:
Problém jak vypsat 1, 2 a 3 vyřešíš cyklem, musíš mít spočítáno kolik těch čísel je a potom budeš tisknout "%d, " do předposledního čísla, a poslední vytiskneš jako "a %d."
Pokud ovšem nemusí být seřazené podle velikosti...

Offline

 

#22 15. 11. 2009 17:00

case_fcs
Příspěvky: 101
Reputace:   -1 
 

Re: Pole v jazyku C

to septolet:

já to tam mam takhle vim že je to špatně protože mi to vypisuje všechna čísla, ale nevim jak to sepsat, každopádně je potřeba aby byl výpis tak, že (příklad)

zadejte počet čísel: 5
zadejte čísla: 1 2 3 4 1
nejčastěji se opakující číslo se vyskytlo 1x a bylo to číslo 1. (věta v jednotném čísle)

zadejte počet čísel: 5
zadejte čísla: 1 2 3 4 5
nejčastěji se opakující čísla se vyskytla 5x a byla to čísla 1, 2, 3, 4 a 5. (věta v množném čísle, za každým číslem čárka a před posledním čísel je áčko)


tvůj upravený kód ve výpisu, teď mi to vypisuje dobře ty čárky a áčko ale špatně to vypisuje čísla, podívej se mi prosím na to
printf("Nejcasteji se opakujici ");

    for(i = 0; i < pocet; i++)
    {
            if(pole_cetnosti[i] == max){
               
                if (pocet>1){
                    printf("cisla se vyskytla %dx a byla to cisla: ",pole_cetnosti[i]);
                    for(j=0;j<pocet;j++){
                        if (j<pocet-2)printf("%d, ",pole_cisel[j]);
                        if(j==pocet-2)printf("%d a ",pole_cisel[j]);
                        if(j==pocet-1)printf("%d.\n",pole_cisel[j]);

                }

            }

            if(pocet==1)printf("cislo se vyskytlo %dx a bylo to cislo: %d.\n", pole_cetnosti[i],pole_cisel[i]);
            }

Offline

 

#23 15. 11. 2009 17:06

case_fcs
Příspěvky: 101
Reputace:   -1 
 

Re: Pole v jazyku C

↑ FailED: podle velikosti nemusí být seřazené, akorát na to jako obvykle nemůžu pořád přijít jak to sepsat

Offline

 

#24 15. 11. 2009 17:17 — Editoval septolet (15. 11. 2009 17:25)

septolet
Příspěvky: 334
Reputace:   
 

Re: Pole v jazyku C

zadejte počet čísel: 5
zadejte čísla: 1 2 3 4 1
nejčastěji se opakující číslo se vyskytlo 1x a bylo to číslo 1. (věta v jednotném čísle)

To ale přeci není pravda. Nejčastěji se vyskytující číslo je sice 1, ale vyskytlo se v té posloupnosti 2x.

Jestli to tedy myslíš takto (výpis si uprav dle zadání, to už zvládneš):

Code:

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

#define VELIKOST 1000000

int main()
{
    int pocet = 0, *pole_cisel, *pole_cetnosti;
    printf("Kolik cisel chces zadavat? ");
    scanf("%d", &pocet);
    
    if((pole_cisel = (int *) malloc(pocet * sizeof(int))) == NULL)
    {
                   printf("Chyba pri alokaci pameti\n");
    }
    
    if((pole_cetnosti = (int *) malloc(pocet * sizeof(int))) == NULL)
    {
                   printf("Chyba pri alokaci pameti\n");
    }
    
    for(int i = 0; i < pocet; i++)
    {
            printf("Zadej %d. cislo: ", (i + 1));
            scanf("%d", &pole_cisel[i]);
            // pole_cisel[i] = rand() % 100 + 0;
            pole_cetnosti[i] = 0;
    }
    
    bool p = true;
    for(int i = 0; i < pocet; i++)
    {
            for(int k = i - 1; k > -1 && p; k--) if(pole_cisel[k] == pole_cisel[i]) p = false;
            
            for(int j = i; j < pocet && p; j++)
            {
                    if(pole_cisel[i] == pole_cisel[j]) pole_cetnosti[i]++;                                                        
            }
            p = true;
    }
    
    int max = 0, cetnost = 0;
    for(int i = 0; i < pocet; i++)
    {
            if(max < pole_cetnosti[i])
            {
                          max = pole_cetnosti[i];
                          cetnost = 0;
            } 
            if(max == pole_cetnosti[i]) cetnost++;            
    }
    
    
    printf("Pocet cisel, ktera se v posloupnosti vyskytla ve stejnem poctu je %d a jsou to cisla: ", cetnost);
    for(int i = 0; i < pocet; i++)
    {
            if(pole_cetnosti[i] == max) printf("%d, ", pole_cisel[i]);
    } 
    
    return 0;
}

Offline

 

#25 15. 11. 2009 17:25

case_fcs
Příspěvky: 101
Reputace:   -1 
 

Re: Pole v jazyku C

↑ septolet: moc se omlouvam překlep, ano vyskytne se 2x

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson