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
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:
#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
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?
Offline
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
#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
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]
Offline
↑ 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