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
↑↑ 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
↑ 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
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
↑ 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
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
↑ 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
↑ 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
↑ 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
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íš
//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