Esercizio in c++

GigiBurubbu
ciao a chi avrà pazienza di aiutarmi, devo fare l'esame di informatica in c++ da autodidatta; il programma mi esce tuttavia non so perché, ma nel secondo punto se io scrivo in input 4 numeri compresi tra 20 e 25 il programma mi dice che i numeri sono 5, se ne metto 6 mi dice che sono 7 :evil: non capisco quel +1 da dove lo prende.
la parte in che contiene l'istruzione è quella dove c'è scritto: // QUESTA :-D

Scrivere un programma C che:
legge da standard input 20 numeri interi e li inserisce nel vettore A
per ogni numero compreso fra 20 e 25 inclusi stampa quante volte occorre nel vettore A
per ogni numero in A inserisce in un array B di 20 double la sua distanza in valore assoluto dalla media dei numeri di A
visualizza il contenuto di B

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

#define d 10

int main(){
	int A[d], i;
	int conta;
	double B[d];
	double media;
	int distanza, somma;

for (i=0; i<d; i++){
	printf("inserisci valore vettore %d: ", i);
	scanf("%d", &A[i]);
	somma =somma+A[i];
}

 // QUESTA
  for (i=0; i<d; i++){
      if ( A[i]>=20 && A[i]<=25){
           conta++;
           }
           }
  printf("I numeri compresi tra 20 e 25 sono: %d\n", conta);

media = somma / d;

for (i=0; i<d; i++){
	distanza = A[i] - media; B[i]= distanza;
	if(distanza<0){distanza = distanza * (-1); B[i]=distanza;
	}
}

printf("\n ARRAY \n");
for(i=0; i<d; i++){
	printf("%f\t", B[i]);
}

system ("PAUSE");
return 0;
}

Risposte
GigiBurubbu
credo di aver risolto: se all'inizio dove c'è "int conta" metto "int conta =0" va :-D

in ogni caso sapete dirmi quando si deve mettere quel =0 e cosa significa? e dovrei metterlo anche a somma e distanza?

P.S: un'ora e mezza per sta cosa :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil: :evil:

apatriarca
Quell'uguale a zero serve per inizializzare il valore della variabile. Se non scegli un valore iniziale di una variabile questa potrebbe essere potenzialmente casuale. Per cui direi che, a meno di settare subito dopo il valore della variabile in altro modo, sarebbe meglio inizializzare SEMPRE il valore delle variabili (non necessariamente settando il valore a zero però*).

* A volte potrebbe essere più corretto usare valori diversi. Se per esempio usassi una variabile per trovare il minimo in un insieme di valori interi potrebbe essere corretto usare un numero molto grande (più grande di qualsiasi valore intero nell'insieme di valori).

vict85
Se quello è il testo allora il tuo codice è sbagliato indipendentemente da quel conta=0. Il testo dice “per ogni numero compreso fra 20 e 25 inclusi stampa quante volte occorre nel vettore A” e non “stampa quanti dei numeri sono compresi tra 20 e 25”. Le due cose sono diverse, in un caso hai un solo printf, nell'altro ne hai \(\displaystyle 6 = 25 - 20 + 1 \).

A parte questo mancano molte inizializzazioni e probabilmente altri piccoli errori qua e là (come per esempio calcolare la media dividendo tra di loro due interi).

vict85
In ogni caso, il codice che hai scritto non è C++ ma C. Seppur tu abbia usato delle parti del C che sono valide anche in C++, il tuo modo di scrivere il programma è ritenuto obsoleto e sconsigliato. Ancora di più dopo tutte le nuove features introdotte a partire dal 2011 che hanno rivoluzionato il modo di scrivere programmi in C++.

Un codice come il tuo in C++ pre-2011, evitando funzioni e librerie standard non obbligatorie, è qualcosa del genere
#include <iostream> // Libreria C++ di input e output

int main(void)
{
	// Questo sostituisce il define.
	int const Num = 10;

	int A[Num];

	// Inserimento dei valori
	for (int i = 0; i != Num; ++i) 
	{
		std::cout << "A[" << i << "] = ";
		std::cin >> A[i];
	}

	// Calcolo media
	double somma = 0.; // somma e' un double ed e' inizializzato a 0!
	for (int i = 0; i != Num; ++i)
	{
		somma += A[i];
	}

	double const media = somma / Num;

	double B[Num];
	for (int i = 0; i != Num; ++i)
	{
		double const dist = A[i] - media;
		B[i] = (dist > 0) ? dist : -dist;
	}

	std::cout << "B = {" << B[0];
	for (int i = 1; i != Num; ++i)
	{
		std::cout << ", " << B[i];
	}
	std::cout << "}" << std::endl;
}
Non ho scritto la parte sui valori compresi tra 20 e 25 per non darti la soluzione della parte che avevi sbagliato.

Nota che per somma ho usato un double. Nelle architetture che userai per il tuo corso, un double contiene senza approssimazione ogni intero di circa 48bit mentre un int sarà di 32bit. Questo fa si che tu possa memorizzare la somma senza aver paura di approssimazioni o overflow (al costo ovviamente di 10 cast).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.