Histogram – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Histogram – C / C++ – Fórum – Programujte.comHistogram – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Srna z Brna
~ Anonymní uživatel
4 příspěvky
2. 4. 2016   #1
-
0
-

Dobrý den ve spolek, mám zadání vytvořit histogram ze vstupních hodnot. Kategorie 0-10, 10-100 atd. Počet kategorií má být proměnná. Něco jsem již splácal, ale má to své mouchy. Potřeboval bych poradit jak se jich zbavit.

#include <stdio.h>


int  i, j, p, k;
double a = 0.0 , b = 10.0;
double cislo;
	

int main()
{	
	printf("Zadej pocet cisel v poli: ");
	scanf("%d",&p);
	
	double pole[p];
	
	for(i = 1;i <= p;i++) {
		printf("Zadej cisla: ");
		scanf(" %lf ", &pole[i]);
		}
		
	printf("Vypis pole: \n");
	
	for(i = 1; i <= p; i++) {  
		printf("%.2lf ", pole[i]); }
		
	printf("\n");
	
	printf("Zadej pocet kategorii (0-10,10-100,100-1000,atd.): ");
	scanf(" %d ",&k);
	k++;
	
	printf("Kategorie 0 - 10: \n");
	for(i = 1; i <= p; i++) { 
		if ((pole[i] >= a) && (pole[i] <= b)){
		printf("%.2lf ", pole[i]);} }

	printf("\n");	
	a = 10.0;
	b= 100.0;	
	
	for(j = 2; j < k; j++) {
	printf("Kategorie %.0lf - %.0lf: \n" , a ,b);
		for(i = 1; i <= p; i++) { 
				if ((pole[i] >= a) && (pole[i] <= b)){
					printf("%.2lf ", pole[i]);} 
					} printf("\n");
	a = a * 10.0;
	b = b * 10.0;							
	}
	
	
	
	return 0;			
}
Nahlásit jako SPAM
IP: 77.92.207.–
Reklama
Reklama
BDS+2
Věrný člen
2. 4. 2016   #2
-
0
-

double pole[p]; takto to nelze. Musíš to nahradit dynamickým polem. (A nakonec nezapomeň uvolnit paměť.)

Tohle bije do očí, dál jsem kód nezkoumal.

Nahlásit jako SPAM
IP: 185.69.69.–
Visual Studio C/C#/C++
(pouze samouk)
Srna z Brna
~ Anonymní uživatel
4 příspěvky
2. 4. 2016   #3
-
0
-

#2 BDS
 

#include <stdio.h>


int  i, j, p, k;
double a = 0.0 , b = 10.0;
double cislo;
	

int main()
{	
	printf("Zadej pocet cisel v poli: ");
	scanf("%d",&p);
	
	double* pole = (double*)malloc(p * sizeof(double));
	
	for(i = 1;i <= p;i++) {
		printf("Zadej cisla: ");
		scanf(" %lf ", &(*(pole+i)));
		}
		
	printf("Vypis pole: \n");
	
	for(i = 1; i <= p; i++) {  
		printf("%.2lf ", *(pole+i)); }
		
	printf("\n");
	
	printf("Zadej pocet kategorii (0-10,10-100,100-1000,atd.): ");
	scanf(" %d ", &k);
	k++;
	
	printf("Kategorie 0 - 10: \n");
	for(i = 1; i <= p; i++) { 
		if ((*(pole+i) >= a) && (*(pole+i) <= b)){
		printf("%.2lf ", *(pole+i));} }
		
	a = 10.0;
	b= 100.0;	
	
	for(j = 2; j < k; j++) {
	printf("Kategorie %.0lf - %.0lf: \n" , a ,b);
		for(i = 1; i <= p; i++) { 
				if ((*(pole+i) >= a) && (*(pole+i) <= b)){
					printf("%.2lf ", *(pole+i));} 
				} printf("\n");
	a = a * 10.0;
	b = b * 10.0;							
	}
	
	
	free(pole);
	return 0;			
}

upraveno na dynamické pole(zatím bez ošetření), ale stále mi to vypisuje nekonečný počet kategorií... přitom tohle mám ošetřeno cyklem for.

Nahlásit jako SPAM
IP: 77.92.207.–
BDS+2
Věrný člen
2. 4. 2016   #4
-
0
-

#3 Srna z Brna
víš o tom, že pole jsou indexována v rozmezí 0 až (velikost pole - 1)?!

Nahlásit jako SPAM
IP: 185.69.69.–
Visual Studio C/C#/C++
(pouze samouk)
Srna z Brna
~ Anonymní uživatel
4 příspěvky
3. 4. 2016   #5
-
0
-

#4 BDS
 

ano to vím, nicméně to byla pouze moje snaha vyvarovat se tomuto výstupu:

Připojen obrázek.

Připojen obrázek.

při zadávání čísel musím vždy zadat jedno navíc které se jakoby do pole nezapíše(počet čísel 5 musím zadat 6) a také mám nejspíš nějakou chybu v cyklu for(j = 2; ....) 

Nahlásit jako SPAM
IP: 77.92.207.–
Blaster
~ Anonymní uživatel
1 příspěvek
3. 4. 2016   #6
-
0
-

Přesný původ chyby při zadávání jednoho čísla navíc se mi zkoumat nechtělo, nic méně za to můžou ty cykly for, které projíždějí pole, které neexistuje. Přesněji přetečou mimo rozsah proměnné někam jinam do paměti ( i <= p je špatně, protože rozsah proměnné pole v paměti je 0 <=> (p-1) ). Proto je lepší nedělat nikdy tak základní chybu a potom se třeba vyvaruješ nečekaného výstupu nad kterým zůstává rozum stát.

Tady jsem ti kód trochu zkrátil, spravil a zjednodušil:

#include <stdio.h>

int  i, j, p, k, a = 1;

int main()
{	
	printf("Kolik bys chtel zadat cisel? ");
	scanf("%d",&p);
	putchar('\n');
	
	double pole[p];
	
	for(i = 0; i < p; i++) {
		printf("Zadej %d.cislo: ", i+1);
		scanf("%lf", &pole[i]);
	}
		
	printf("\nVypis zadanych cisel:\n");
	for(i = 0; i < p; i++) printf("%.2lf ", pole[i]);
		
	printf("\n\nKolik kategorii chces zobrazit (0-10,10-100,100-1000,atd.) ? ");
	scanf("%d", &k);
	if(k <= 0 ) k = 1;
	
	for(j = 1; j <= k; j++) {
		printf("\nVypis kategorie %d - %d:\n" , ( a == 1 ? 0 : a ) ,a*10);
		for(i = 0; i < p; i++) if( pole[i] >= ( a == 1 ? 0 : a ) && pole[i] <= a*10 ) printf("%.2lf ", pole[i]);
		a *= 10;
		putchar('\n');
	}
	
	return 0;			
}
Nahlásit jako SPAM
IP: 217.112.167.–
BDS+2
Věrný člen
3. 4. 2016   #7
-
0
-

#5 Srna z Brna
Kolega už Ti tu něco napsal, ale když už jsem to taky udělal, tak to sem dám. 

#include <stdio.h>

int  i, j, p, k;
double a = 0.0, b = 10.0;
double *pole;

int main()
{
	printf("Zadej pocet cisel v poli: ");
	scanf("%d", &p);

	pole = (double*)malloc(p * sizeof(double));

	for (i = 0; i < p; i++) 
	{
		printf("Zadej cislo: ");
		scanf(" %lf", &pole[i]);
	}

	printf("Vypis pole: \n");

	for (i = 0; i < p; i++) printf("%.2lf ", pole[i]);

	printf("\nZadej pocet kategorii (0-10,10-100,100-1000,atd.): ");
	scanf(" %d", &k);
	k++;

	for (j = 0; j < k; j++)
	{
		printf("\nKategorie %.0lf - %.0lf: \n", a, b);
		for (i = 0; i < p; i++)
		{
			if ((pole[i] >= a) && (pole[i] <= b))printf("%.2lf ", pole[i]);
		}
		a = b;
		b *= 10;
	}

	getchar(); //tohle ty tu asi mít nemusíš
	getchar(); // -||-
	free(pole);
	
	return 0;
}

(snažil jsem se tvůj kód co nejméně modifikovat, ať se v tom vyznáš)

samozřejmostí by mělo být i ošetření chyb, ale to si budeš muset udělat sám.

teď čtu, že se Ti nelíbí ten výpis. Tak to můžeme ošetřit: 

for (j = 0; j < k; j++)
	{
		pocet = 0;
		for (i = 0; i < p; i++)
		{
			if ((pole[i] >= a) && (pole[i] <= b))
			{
				pocet++;
				break;
			}
		}
		if (pocet)
		{
			printf("\nKategorie %.0lf - %.0lf: \n", a, b);
			for (i = 0; i < p; i++)
			{
				if ((pole[i] >= a) && (pole[i] <= b))printf("%.2lf ", pole[i]);
			}
		}
		a = b;
		b *= 10;
	}
Nahlásit jako SPAM
IP: 185.69.69.–
Visual Studio C/C#/C++
(pouze samouk)
Srna z Brna
~ Anonymní uživatel
4 příspěvky
3. 4. 2016   #8
-
0
-

Děkuji oběma borcům za pomoc s řešením, nejspíš jsem už i přišel na to v čem jsem měl chybu.    

Nahlásit jako SPAM
IP: 77.92.207.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 66 hostů

Podobná vlákna

Histogram matlab — založil Luk

Histogram Image — založil Mutagen

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý