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 07. 01. 2011 21:48 — Editoval oggy (07. 01. 2011 21:48)

oggy
Zelenáč
Příspěvky: 4
Reputace:   
 

C-Vypis cisel ktera se nachazi prave 2x

dobry den, mam problem s programem, ktery ma vygenerovat pole 20 nahodnych cisel a pak z tohoto pole vybrat cisla která se v danem poli nachazi prave 2x

napr: mam cisla 1 1 1 2 2 3 4 4 4 5 5 6 7 7 8 8 8
a po to vyberu budu mit v druhem poli cisla 2 5 7

s ceckem teprve zacinam

prosim o pomoc :-)

tady je ten program:

Code:

#include <stdio.h>
#include <stdlib.h>
#define PPRVKU 20
#define TRIDEN 10

int main() {


    int pole[PPRVKU];
    int dvoj_pole[TRIDEN];
  
    
/*generovani cisel v intervalu 0-10*/

    for(int i=0;i<PPRVKU;i++){
        pole[i]=rand()/(RAND_MAX/10);
              }

/*trideni cisel podle velikosti, od 1 do 10*/

    for(int j=0;j<PPRVKU-1;j++){
        for(int i=1;i<PPRVKU;i++){
            if (pole[i-1]>pole[i]){
                int change;
                change=pole[i];
                pole[i]=pole[i-1];
                pole[i-1]=change;
                }
        }
    }
/*vypis serazenych cisel*/

    for(int i=0;i<PPRVKU;i++){
        printf("%d ",pole[i]);
        }

    printf ("\nVyber cisel ktere se v poli nachazi prave dvakrat:\n");

  
    int p=1;
    int pred=1;
    int ppred=0;
  
/*zapis prave 2 stejnych cisel do druheho pole*/

    for(int i=0;i<PPRVKU;i++){
        if ((pole[i]= pred) && (pred = ppred)){
            ppred=pred;
            pred=pole[i];
        }
        else if((pole[i] = pole[i-1]) && (pole[i] != ppred)){
            dvoj_pole[p]=pole[i];
            ppred=pred;
            pred=pole[i];
            p=p+1;
        }
        else if (pole[i]!=pred){
            ppred=pred;
            pred=pole[i];
        }
    }     
    
    
/*vypis dvojic*/

    for(p=0;p<TRIDEN;p++){
        printf("%d ",dvoj_pole[p]);

    }


    return 0;
}

Offline

 

#2 07. 01. 2011 22:06 — Editoval TomDlask (07. 01. 2011 22:06)

Dioxid
Příspěvky: 416
Reputace:   13 
 

Re: C-Vypis cisel ktera se nachazi prave 2x

Jestli tomu kódu rozumím (v C nedělám), tak to děláš takto:
1) vygenerování čísel
2) seřazení čísel
3) projití čísel a zaznamenání těch, když jsou právě 2 stejné za sebou

Já bych na to šel takto: Zavedl bych si ještě jedno pole tak, že když se zeptám na pole2[a], tak tam bude uloženo kolikrát je v těch dvaceti číslech číslo a. Poté bych toto pole prošel a podíval se, kolikrát je tedy jaké číslo obsaženo. Takže postup:

1) vygenerování čísel
2) projdeme čísla po jednom - když dostaneme číslo N, tak provedeme pole2[N]=pole2[N]+1 - dostali jsme o jedno číslo N víc
3) projdeme celé pole pole2[] a vybereme ty čísla i, u kterých je pole2[i]=2 - jsou tam tato čísla obsažena přesně dvakrát

Je to pochopitelné nebo bych to měl rozepsat?


Jsem omylný, proto ne vše, co jsem napsal, je zaručeně správně.
468

Offline

 

#3 07. 01. 2011 22:37

vojta01
Příspěvky: 63
Reputace:   
 

Re: C-Vypis cisel ktera se nachazi prave 2x

Ahoj, zkus na třídění použít funkci qsort, která pracuje mnohem rychleji než ta tvoje.

Offline

 

#4 07. 01. 2011 22:47 — Editoval oggy (07. 01. 2011 22:48)

oggy
Zelenáč
Příspěvky: 4
Reputace:   
 

Re: C-Vypis cisel ktera se nachazi prave 2x

myslim ze je to dosti pochopitelne tomdlasku, zkusim to podle toho udelat, a co se tyce te fce qsort, muzes mi pls vojto poslat nejakej kratkej program kde je qsort aplikovan?

Offline

 

#5 09. 01. 2011 17:00 — Editoval oggy (09. 01. 2011 17:04)

oggy
Zelenáč
Příspěvky: 4
Reputace:   
 

Re: C-Vypis cisel ktera se nachazi prave 2x

tak tady uz mam ten vysledny program, ktery funguje, jen se chci zeptat jestli jsou tam nejake nesvary(prasarny) ktere by tam nemely byt, jestli by mi nekdo mohl udelat korekci

a jeste by me zajimalo co mam udelat aby ta vygenerovana cisla byla po kazdem spusteni jina

Code:

#include <stdio.h>
#include <stdlib.h>
#define POCCIS 20
#define TRIDEN 11
#define KOLIKCHCI 2

int main() {


    int pole[POCCIS];
    int pocetcis[TRIDEN];
 
    
/*generovani cisel v intervalu 0-10*/
    for(int i=0;i<POCCIS;i++){
        pole[i]=rand()/(RAND_MAX/TRIDEN);
    }
  
/*vypis vygenerovanych cisel*/
    printf("Nahodne vygenerovana cisla:\n");
    for(int i=0;i<POCCIS;i++){
        printf("%d, ",pole[i]);
    }

  printf("\n\n");
  
/*pocet jednotlivych cisel*/
    for(int j=-1, mnoz=1;j<TRIDEN;){
        pocetcis[j]=mnoz;
            mnoz=0;
        j++;
        for(int i=0;i<POCCIS;i++){
            if (pole[i] == j){
            mnoz++;
            }
        }
    }
    
/*vypis poctu jednotlivych cisel*/
    printf("Kolikrat se ktere cislo v poli nachazi:\n");
    for(int i=0;i<TRIDEN;i++){
        printf("%d: %dx\n",i,pocetcis[i]);
    }
       
/*vypis cisel ktera jsou v poli prave 2x*/
    printf("\nCisla ktera se v poli nachazi prave 2x jsou:");
    for(int i=0;i<TRIDEN;i++){
            if (pocetcis[i]==KOLIKCHCI){
            printf("%d, ",i);
        }
      
    }



    return 0;
}

Offline

 

#6 09. 01. 2011 17:32 — Editoval TomDlask (09. 01. 2011 17:32)

Dioxid
Příspěvky: 416
Reputace:   13 
 

Re: C-Vypis cisel ktera se nachazi prave 2x

Trochu tam nerozumím, proč jsou u toho /*pocet jednotlivych cisel*/ 2 cykly v sobě...
Ty to děláš tak, že si řekneš "hledám všechny jedničky", projdeš celé pole všech čísel (dvaceti) a hledáš, kdy je to rovné jedničce. Potom si řekneš "hledám všechny dvojky", projdeš celé pole všech čísel (dvaceti) a hledáš, kdy je to rovné dvojce atd.?
Toto by mělo až kvadratickou časovou složitost, ale dá se to udělat i lineárně: (napíšu v pseudokódu - v C neumím)

Projíždíš celé pole vygenerovaných čísel od i=1 do 20 {

narazíš na i-té číslo s hodnotou uloženou v pole[i]
k počtu čísel (stejných jako pole[i]) přičteš 1 - dostali jsme o jedno víc, a to takto: pocetcisel[pole[i]]:=pocetcisel[pole[i]]+1

}
jsme na konci cyklu a počet čísel N v těch dvaceti je uložen v pocetcisel[N]


Jsem omylný, proto ne vše, co jsem napsal, je zaručeně správně.
468

Offline

 

#7 09. 01. 2011 20:27

oggy
Zelenáč
Příspěvky: 4
Reputace:   
 

Re: C-Vypis cisel ktera se nachazi prave 2x

rozumis tomu spravne, no ale uz to asi necham tak jak to je dekuji za vsechny rady

Offline

 

#8 09. 01. 2011 22:17

Dioxid
Příspěvky: 416
Reputace:   13 
 

Re: C-Vypis cisel ktera se nachazi prave 2x

↑ oggy: Tak jestli ti to tedy stačí v O(N^2), tak to nech tak. Jestli to ale budeš chtít rychlejší (O(N)), tak k tomu byl ten můj návod...


Jsem omylný, proto ne vše, co jsem napsal, je zaručeně správně.
468

Offline

 

#9 16. 01. 2011 13:59

VojtechSejkora
Příspěvky: 176
Reputace:   
 

Re: C-Vypis cisel ktera se nachazi prave 2x

↑ TomDlask:

ještě bych připomněl že na začátku si ty pole musí vynulovat jinak mu tam budou skákat až astronomická čísla a vůbec nebude vědět proč:D

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson