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

#26 15. 11. 2009 17:25

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

Re: Pole v jazyku C

↑↑ septolet: zrejme preklep

Offline

 

#27 15. 11. 2009 17:33 — Editoval case_fcs (15. 11. 2009 17:36)

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

Re: Pole v jazyku C

↑↑ FailED:

/*
* File:   main.c
* Author: case
*
* Created on 14. listopad 2009, 1:45
*/

#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));
    PoleCetnosti = (int *) malloc(pocet*sizeof(int));

    free(PoleCisel);

   
    RuznychCisel=0;
    NejvyssiCetnost = 0;

    for (i=0; i<pocet ;i++) {


        PoleCetnosti[i]=0;
        test2=scanf("%d", &cislo);

        for (j=0; j<=RuznychCisel; j++){

            if (PoleCisel[j]==test2){
                PoleCetnosti[j]++;
           

                if (PoleCetnosti[j]>NejvyssiCetnost){
                NejvyssiCetnost++;
                }
               
            }
               
           
           
            if(j==RuznychCisel){
                PoleCisel[j]=test2;
                PoleCetnosti[j]++;
                RuznychCisel++;
             }

           
        }
       
        }
     

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


    printf("Nejcasteji se opakujici ");
    for(i = 0; i < pocet; i++)
    {

            //if(pole_cetnosti[i] == max){

                if (PoleCisel>1 && PoleCetnosti[i]==NejvyssiCetnost){
                    printf("cisla se vyskytla %dx a byla to cisla: ",PoleCetnosti[i]);
                    for(i=0;i<RuznychCisel;i++){
                        if (i<RuznychCisel-2 && PoleCetnosti[i]==NejvyssiCetnost)printf("%d, ",PoleCisel[i]);
                        if(i==RuznychCisel-2 && PoleCetnosti[i]==NejvyssiCetnost)printf("%d a ",PoleCisel[i]);
                        if(i==RuznychCisel-1 && PoleCetnosti[i]==NejvyssiCetnost)printf("%d.\n",PoleCisel[i]);

                }

            }

            if(RuznychCisel==1 && PoleCetnosti==NejvyssiCetnost)printf("cislo se vyskytlo %dx a bylo to cislo: %d.\n", PoleCetnosti[i],PoleCisel[i]);
            }
   
  return 0;
}


proč mi takhle ten program padá po zadání prvního čísla? prosím co je v tom kódu ještě špatně?


↑↑ septolet:

u tvého programu sem to přepsala takhle ale stejně mi to pořád nefunguje, která proměnná vlastně v tvém programu počítá kolik je tam různých čísel? nebo jak zjistím kolik je tam čísel která se vyskytují nejvícekrát?

/*
* File:   main.c
* Author: case
*
* Created on 15. listopad 2009, 16:30
*/

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

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

    int i , j , k;

    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( i = 0; i < pocet; i++)
    {
            printf("Zadej %d. cislo: ", (i + 1));
            scanf("%d", &pole_cisel[i]);
            pole_cetnosti[i] = 0;
    }

    float p = 1;
    for( i = 0; i < pocet; i++)
    {
            for( k = i - 1; k > -1; k--) if(pole_cisel[k] == pole_cisel[i]) p = 0;

            for( j = i; j < pocet && p; j++)
            {
                    if(pole_cisel[i] == pole_cisel[j]) pole_cetnosti[i]++;
            }
            p = 1;
    }

    int max = 0;
    for( i = 0; i < pocet; i++)
    {
            if(max < pole_cetnosti[i]) max = pole_cetnosti[i];
    }


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

                }

            }

            if(pole_cisel<1 && pole_cetnosti==max)printf("cislo se vyskytlo %dx a bylo to cislo: %d.\n", pole_cetnosti[i],pole_cisel[i]);
            }
         //       printf("Cislo %d se v posloupnosti vyskytlo %dx\n", pole_cisel[i], pole_cetnosti[i]);
   


    return (EXIT_SUCCESS);
}

Offline

 

#28 15. 11. 2009 17:43 — Editoval FailED (15. 11. 2009 17:44)

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

Re: Pole v jazyku C

↑ case_fcs:
Promiň, když jsem ti psal jak se deklarují dynamická pole, měl jsem zdůraznit, že tu paměť musíš uvolnit až když už ji nepotřebuješ, funkci free musíš volat až když už ta pole nepotřebuješ.
A PoleCetnosti bys měla taky uvolnit.
Ono u takovédleho programu mohlo být jedno, chytřejší systémy paměť programu ukončí při jeho ukončení, ale jestli používáš třeba WinXP, tak to tvoje pole bude překážet v paměti až do restartu.

Offline

 

#29 15. 11. 2009 18:00 — Editoval FailED (15. 11. 2009 18:03)

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

Re: Pole v jazyku C

A ještě jsem našel pár chyb v prvním kódu:

if (PoleCisel>1 && PoleCetnosti[i]==NejvyssiCetnost)
Tady porovnáváš PoleCisel, což je vlastně jen adresa v paměti (to jste asi ještě nebrali), musíš porovnávat hodnotu v poli na nějakém indexu.
a NejvyssiCetnost musíš počátečně nastavit na 1, jinak by to nefungovalo kdyby byla ve vstupu jen různá čísla, ale na to bys určitě přišla :)

Jinak doporučuji uravovat kód od↑↑ septolet:

Na všechno přijdeš, snaž se nedělat velké změny najednou, lepší je když budeš upravovat funkční program a když něco změníš, uvidíš jestli to dělá to, co chceš.

Offline

 

#30 15. 11. 2009 18:02

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

Re: Pole v jazyku C

↑ case_fcs:


#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));
    PoleCetnosti = (int *) malloc(pocet*sizeof(int));

   

   
    RuznychCisel=0;
    NejvyssiCetnost = 0;

    for (i=0; i<pocet ;i++) {

    PoleCetnosti[i]=0;
       
        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);
    }


    printf("Nejcasteji se opakujici ");
    for(i = 0; i < pocet; i++)
    {

            //if(pole_cetnosti[i] == max){

                if (RuznychCisel>1 && PoleCetnosti[i]==NejvyssiCetnost){
                    printf("cisla se vyskytla %dx a byla to cisla: ",PoleCetnosti[i]);
                    for(i=0;i<RuznychCisel;i++){
                        if (i<RuznychCisel-2 && PoleCetnosti[i]==NejvyssiCetnost)printf("%d, ",PoleCisel[i]);
                        if(i==RuznychCisel-2 && PoleCetnosti[i]==NejvyssiCetnost)printf("%d a ",PoleCisel[i]);
                        if(i==RuznychCisel-1 && PoleCetnosti[i]==NejvyssiCetnost)printf("%d.\n",PoleCisel[i]);

                }

            }

            if(RuznychCisel==1 && PoleCetnosti==NejvyssiCetnost)printf("cislo se vyskytlo %dx a bylo to cislo: %d.\n", PoleCetnosti[i],PoleCisel[i]);
            }


    free(PoleCisel);
    free(PoleCetnosti);
  return 0;
}


prosím projdi můj kód a zkus ho přepsat tak aby fungoval a zkopírovat sem, moc prosím, nechápu co tam dělam špatně, ten střed je od tebe a ten konec mam zas od septolet, začátek mam snad dobře, ale kdyžtak ho prosím taky zkontroluj, samozřejmě pochopím pokud na to nemáš chuť nebo čas :)

Offline

 

#31 15. 11. 2009 18:03

septolet
Příspěvky: 334
Reputace:   
 

Re: Pole v jazyku C

↑ case_fcs:

u tvého programu sem to přepsala takhle ale stejně mi to pořád nefunguje, která proměnná vlastně v tvém programu počítá kolik je tam různých čísel?

Počet různých čísel je v tom mém výtvoru uložený v pole_cetnosti (ale nikde jsem to úmyslně nepočítal a nevypisuji to). V podstatě každá nenulová hodnota v tomto poli vyjadřuje, že je tam vyskytlo nové číslo. Ukážu to na příkladu:

pole_cisel:       1 2 2 2 3 5
pole_cetnosti   1 3 0 0 1 1

Takže počet různých čísel je 4 (4 nenulové hodnoty v pole_cetnosti).

nebo jak zjistím kolik je tam čísel která se vyskytují nejvícekrát?

Opět raději příklad:

pole_cisel:      1 2 2 2 3 5
pole_cetnosti   1 3 0 0 1 1

Nejvícekrát se tam vyskytuje číslo 2 a to 3x.

Offline

 

#32 15. 11. 2009 18:09 — Editoval case_fcs (15. 11. 2009 18:38)

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

Re: Pole v jazyku C

↑ septolet:

jasný ale v programu od tebe, tak tam nemam proměnnou která by mi počítala počet různých nejvícekrát se objevujících se čísel viď?

Offline

 

#33 15. 11. 2009 18:48

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

Re: Pole v jazyku C

↑ septolet:

ted používam teda ten program od tebe

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

                }

            }

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


ale pořád mi to vypisuje za každym číslem čárku ikdyž je to číslo už poslední nebo předposlední nebo je uplně samo a taky se chci ještě zeptat co znamená v tvém programu ta proměnná p

Offline

 

#34 15. 11. 2009 19:08

septolet
Příspěvky: 334
Reputace:   
 

Re: Pole v jazyku C

bool p je v tom mém programu jen pomocná proměnná. Je nežádoucí, abych přičítal do pole_cetnosti i v případě, kdy jsem četnost toho daného čísla už jednou počítal.

Offline

 

#35 15. 11. 2009 19:19

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

Re: Pole v jazyku C

↑ septolet:

dobře dík a prosím dokázal bys nějak přepsat ten závěrečnej kód (ten výpis) co sem sem poslala před chvílí, aby vypisoval správně?

Offline

 

#36 15. 11. 2009 19:29 — Editoval FailED (15. 11. 2009 19:39)

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

Re: Pole v jazyku C

Tak jsem ti udělal ten výpis na jeden řádek, pozor, funguje to jen když je těch čísel víc než 1, jinak to vypíše u toho čísla "a", stačí přidat podmínku a vypsat to zvlášť.

max je maximalni pocet vyskytu
ruznych je pocet ruznych cisel
if (pole_cetnosti[i++] == max) tohle porovná pole_cetnosti[i] a potom zvětší i o jedna
while(cisel) probíhá dokud cisel není 0 ale to asi víš

Code:

  //ted spocitame, kolik cisel je tam nejvickrat:
  int cisel=0;
  for (i=0; i<ruznych; i++)
    if (pole_cetnosti[i]==max) cisel++;
  
  // a konecne vypis, posledni 2 cisla se zapisuji jinak
  printf("Nejvic: %dx a to cisla: ", max);
  i=0;
  while (cisel)
  {      
    if (pole_cetnosti[i++] == max)
      if (cisel<3)
      {
        if (cisel==1)
          printf("a %d.", pole_cisel[i-1]);
        else printf ("%d ", pole_cisel[i-1]);
      }
      else printf("%d, ", pole_cisel[i-1]);
    cisel--;
  }

Snad ti to pomůže.

Edit:
Ale co vlastně, tady to máš celé, něco je okopírované z septoletova kódu, zbytek jsem udělal nově, je to jen proto abys viděla jak to může fungovat, nejsou tam ošetřeny žádné výjimky, to už si případně dodělej sama, hlavně to, když je jen jedno číslo s nejvyšším výskytem, ale to zvládneš.

Code:

#include <iostream>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
  int *pole_cisel, *pole_cetnosti, pocet, test, ruznych=0, max=1, i;
  printf("Zadejte pocet cisel:" );
  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(i=0; i<pocet; i++)
  {
    pole_cetnosti[i]=0;
    scanf("%d", &test);
    for (int j=0; j<=ruznych; j++)
      if(pole_cisel[j]==test)
      {
        pole_cetnosti[j]++;
        if (pole_cetnosti[j]>max) max++;
        break;
      }
      else if(j==ruznych)
      {
        pole_cisel[j]=test;
        pole_cetnosti[j]++;
        ruznych++;
        break;
      }
  }
  //ted spocitame, kolik cisel je tam nejvickrat:
  int cisel=0;
  for (i=0; i<ruznych; i++)
    if (pole_cetnosti[i]==max) cisel++;
  
  // a konecne vypis, posledni 2 cisla se zapisuji jinak
  printf("Nejvic: %dx a to cisla: ", max);
  i=0;
  while (cisel)
  {      
    if (pole_cetnosti[i++] == max)
      if (cisel<3)
      {
        if (cisel==1)
          printf("a %d.", pole_cisel[i-1]);
        else printf ("%d ", pole_cisel[i-1]);
      }
      else printf("%d, ", pole_cisel[i-1]);
    cisel--;
  }
  
  free(pole_cisel);
  free(pole_cetnosti);
  
  getchar();
  getchar();    
  return 0;
}

Offline

 

#37 15. 11. 2009 20:43

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

Re: Pole v jazyku C

tak to nějak mam, tak vám všem děkuji mnohokrát, hrozně moc ste mi pomohli :) zatim ahoj

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson