Calcolo medie

Stato
Discussione chiusa ad ulteriori risposte.

FreakTux

Utente Silver
16 Dicembre 2008
36
11
0
66
Ricevuto in input un certo numero di interi POSITIVI calcolare la media dei numeri pari inseriti, dei dispari e di tutti i numeri inseriti.
Ecco il mio in C...indentato male lo so...ma è quel pazzo di Dev C/C++...lo odio, ma ma mi sono trovato a scrivere ste linee di codice su win...XD

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

int main(int argc, char *argv[]) {

   int max; 
    
   do {
	printf("Quanti numeri di interi da inserire? \n>");                       
        scanf("%d", &max);
	if(max <= 0) printf("Hai inserito un valore non valido. Reinserisci. ");
   }while(max <= 0);	
   
   int i, numeri[max], numPari = 0, numDispari = 0, x = 0, somma = 0;       
   float media = 0, mediaPari = 0, mediaDispari = 0;                       
   float sommaPari = 0, sommaDispari = 0;



   for(i = 0; i < max; i++) {									
        printf(" \nInserisci intero positivo da salvare n. %d  : \n > ", (i + 1));
        scanf("%d", &x);
        if(x < 0) { 
           printf("\n Non puoi inserire numeri negativi! \n ");
           i--;
           continue;
	}
        if (x%2 == 0) { 
	   sommaPari += x;					
           numPari++; 						
	}
        else {
	   sommaDispari += x;
	   numDispari++;
	}
                      
     } 

   if(numPari != 0 && numDispari != 0) {                            
        mediaPari = sommaPari/numPari;
        mediaDispari = sommaDispari/numDispari;					
        media = (sommaDispari + sommaPari)/max;                                
        printf("\nMedia = %f \nMedia Pari = %f \nMedia Dispari = %f \n\n ", media, mediaPari, mediaDispari);
   }
   else {
	  if(numDispari == 0) {
	       mediaPari = sommaPari/numPari;					
	       media = sommaPari/max;
	       printf("\nMedia = %f \nMedia Pari = %f \nNon e' stato possibile calcolare la media dei dispari.\n", media, mediaPari);
	  }
	  else {
		media = sommaDispari/max;         
	        mediaDispari = sommaDispari/numDispari;
	        printf("\nMedia = %f \nMedia dispari = %f \nNon e' stato possibile calcolare la media dei pari.\n", media, mediaDispari);
	  }
   }


  system("PAUSE");	
  return 0;
}
 
Ti sei complicato la vita
Codice:
#include <iostream>

using namespace std;

int main()
{
    int sp=0,sd=0,np=0,nd=0,app=0;
    cin.exceptions(ios::badbit|ios::failbit);
    try {
        cout<<"Inserisci i numeri in sequenza, digita una lettera per uscire\n";
        while(1) {
            cin>>app;
            if(app%2) {
                sd+=app;
                nd++;
            }else {
                sp+=app;
                np++;
            }
        }
    }catch(...) {
        cout<<"Media pari: "<<(float)sp/np<<endl
            <<"Media dispari: "<<(float)sd/nd<<endl
            <<"Media totale: "<<(float)(sd+sp)/(nd+np);
    }
    return 0;
}
 
stoner ha detto:
Ti sei complicato la vita
Codice:
#include <iostream>

using namespace std;

int main()
{
    int sp=0,sd=0,np=0,nd=0,app=0;
    cin.exceptions(ios::badbit|ios::failbit);
    try {
        cout<<"Inserisci i numeri in sequenza, digita una lettera per uscire\n";
        while(1) {
            cin>>app;
            if(app%2) {
                sd+=app;
                nd++;
            }else {
                sp+=app;
                np++;
            }
        }
    }catch(...) {
        cout<<"Media pari: "<<(float)sp/np<<endl
            <<"Media dispari: "<<(float)sd/nd<<endl
            <<"Media totale: "<<(float)(sd+sp)/(nd+np);
    }
    return 0;
}

vabbè...non posso gestire eccezioni con C...e un'altra differenza è che chiedo il numero di interi che saranno inseriti prima dell'inserimento stesso...XD...
 
in java:
Codice:
import java.io.*;
public class Medie{
    public static void main(String[] args){
        int m_p=0,m_d=0,m_t=0,c_p=0,c_d=0;
        try{
            BufferedReader tastiera=new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Inserisci i numeri in sequenza, digita una lettera per uscire:");
            while(true){
                int num=Integer.parseInt(tastiera.readLine());
                if(num%2==0){
                    m_p+=num;
                    c_p++;
                }else{
                    m_d+=num;
                    c_d++;
                }
            }
        }catch(Exception e){
            if(m_p!=0 && c_p!=0){System.out.println("La media dei numeri pari è:"+(double)(m_p/c_p));}
            else{System.out.println("Non ci sono numeri pari");}
            if(m_d!=0 && c_d!=0){System.out.println("La media dei numeri dispari è:"+(double)(m_d/c_d));}
            else{System.out.println("Non ci sono numeri dispari");}
            if(c_p!=0 && c_d!=0){System.out.println("La media totale è:"+(double)((m_p+m_d)/(c_p+c_d)));}
            else{System.out.println("Non c'è media.");}
        }
    }
}

provate sui vostri codici ad inserire solo numeri pari o dispari...le divisioni per zero non sono ammesse. ;)
 
Codice:
#! /usr/bin/env ljs

total = {
    all : 0,
    even: 0,
    odd : 0,
};

arguments.each(function (arg) {
    var n                                 = arg.toNumber();
    total.all                            += n;
    total[(n.isEven() ? "even" : "odd")] += n
});

print("Total avg: "+total.all/arguments.length);
print("Even  avg: "+total.even/([n for each (n in arguments) if (n.toNumber().isEven())]).length);
print("Odd   avg: "+total.odd/([n for each (n in arguments) if (n.toNumber().isOdd())]).length);
 
R4z0r_Cr4$H ha detto:
in java:
Codice:
import java.io.*;
public class Medie{
    public static void main(String[] args){
        int m_p=0,m_d=0,m_t=0,c_p=0,c_d=0;
        try{
            BufferedReader tastiera=new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Inserisci i numeri in sequenza, digita una lettera per uscire:");
            while(true){
                int num=Integer.parseInt(tastiera.readLine());
                if(num%2==0){
                    m_p+=num;
                    c_p++;
                }else{
                    m_d+=num;
                    c_d++;
                }
            }
        }catch(Exception e){
            if(m_p!=0 && c_p!=0){System.out.println("La media dei numeri pari è:"+(double)(m_p/c_p));}
            else{System.out.println("Non ci sono numeri pari");}
            if(m_d!=0 && c_d!=0){System.out.println("La media dei numeri dispari è:"+(double)(m_d/c_d));}
            else{System.out.println("Non ci sono numeri dispari");}
            if(c_p!=0 && c_d!=0){System.out.println("La media totale è:"+(double)((m_p+m_d)/(c_p+c_d)));}
            else{System.out.println("Non c'è media.");}
        }
    }
}

provate sui vostri codici ad inserire solo numeri pari o dispari...le divisioni per zero non sono ammesse. ;)

lo so che non sono ammesse...infatti ho ovviato con i due if finali...XD...comunque lo so, mi vergogno come un cane per aver usato win per scrivere sto codice, ma non avevo il mio linux a portata di mano...XD
 
anche io sto usando win...non vuol dire niente alla fine...
P.s:questo vale per tutto:gradirei che invece di quotare ogni volta (anche del testo molto grande) scriveste semplicemente @aChiTiRiferisci :D
 
@razor: hai ragione...scusa per io continui quotoni...comunque scherzavo parlando di win in quel modo...oddio, io lo odio, ma è semplicemente una cosa soggettiva...XD
 
io non è che lo odio,è chiaro che su certi versi preferisco linux ma...molte cose mi portano ad usare spesso windows...io ho entrambi installati sul pc!
 
FreakTux ha detto:
vabbè...non posso gestire eccezioni con C...e un'altra differenza è che chiedo il numero di interi che saranno inseriti prima dell'inserimento stesso...XD...

Ovviamente non mi riferivo a questo, ma al modo in cui hai fatto il resto.
 
Il vettore è inutile, o meglio, uno spreco. Potresti usare semplicemente una sola variabile e incrementare le somme. Guarda il codice che ho scritto io.
 
ecco il mio in C

Codice:
include <stdio.h>
main ()
{
char scelta;
double n, somma, media;
int count ;
count = media = n = somma = 0;
printf("MEDIA IN C\n");
go:
do
{
printf("Inserisci un numero: ");
scanf("%lf" , &n);
printf("Vuoi inserire un altro dato? rispondi [S] o [N]");
scanf("%c" , &scelta);
scanf("%c" , &scelta);
somma = n + somma;
count++;
}
while ((scelta == 's') || (scelta == 'S'));
media = somma / count;
printf("La media dei numeri è: %lf Vuoi fare un'altra media? rispondi [S] o [N]" , media);
scanf("%c" , &scelta);
scanf("%c" , &scelta);
if (scelta == 's'){
goto go;
}
 
Codice:
# codice ruby fatto al momento
pari = []
dispari = []
somtot = 0
x = 1
while x != 0
      print "Inserisci un numero: "
      x = gets.chomp.to_i
      if (x%2)==0
            pari.push x
      else
            dispari.push x
      end
      somtot += x 
end
puts "========================="
puts " i numeri pari da te inseriti sono:                "
print pari
puts "I numeri dispari da te inseriti sono:            "
print dispari
if pari.size == 0
            pari.push 0
end
if dispari.size == 0
           dispari.push 0
end
puts "========================="
print "Si vuole proseguire?[s/n] "
inp = gets.chomp.lowercase
if inp=="s"
     puts "La media totale e': #{somtot/(pari.size + dispari.size)}"
     media = 0
     y = 0
     while y <= pari.size
        media += pari[y]
        y += 1
     end
     puts "La media dei numeri pari #{media/(pari.size)}"
     media = 0
     y = 0
     while y <= dispari.size
        media += dispari[y]
        y += 1
     end
     puts "La media dei numeri dispari: #{media/(dispari.size)}"
else
     puts "Ok... hai scelto #{inp}"
end
fatto di fretta durante religione
Attenzioni;
  • finche il numero inserito e' diverso da zero continua a chiedere un numero
  • in caso sia inserita una lettera la sostituisce con 0
  • se non ci sono numeri pari e/o dispari ne aggiunge uno (0) cosi 0/1 = 0 e si evita ?/0
  • Utilizza tecniche degli array


Dark Flash ha detto:
ecco il mio in C

Codice:
include <stdio.h>
main ()
{
     char scelta;
     double n, somma, media;
     int count ;
     count = media = n = somma = 0;
     printf("MEDIA IN C\n");
go:
     do
    {
          printf("Inserisci un numero: ");
          scanf("%lf" , &n);
          printf("Vuoi inserire un altro dato? rispondi [S] o [N]");
          scanf("%c" , &scelta);
          // Perche ne hai messi 2
         somma += n; // meglio cosi
         count++;
    } 
    while ((scelta == 's') || (scelta == 'S'));
    media = somma / count;
    printf("La media dei numeri è: %lf Vuoi fare un'altra media? rispondi [S] o [N]" , media);
    scanf("%c" , &scelta);
    scanf("%c" , &scelta);
    if (scelta == 's'){
    goto go;
}
usare goto in questa maniera mina la leggibilità del codice...
P.s:: te lo un po' sistemato, perdonami...
 
[Python]
Codice:
#!/usr/bin/python
num=1
global pari
pari=0
global pari_num
pari_num=0
global dispari
dispari=0
global dispari_num
dispari_num=0
while num!=0:
	num=int(raw_input("Inserisci il numero (0 per uscire): "))
	if num%2==0:
		pari+=num
		pari_num+=1
	elif num%2==1:
		dispari+=num
		dispari_num+=1
	else:
		print "Numero non valido"
print "Media pari: "+str(pari/pari_num)
print "Media dispari: "+str(dispari/dispari_num)
print "Media totale: "+str((pari+dispari)/(pari_num+dispari_num))
 
Ecco il mio in C:
Codice:
#include <stdio.h>

int main(void)
{
	int ip=0,id=0,num;
	float mediap=0,mediad=0;
	printf("Inserisci ogni cifra separata da un invio a capo e terminala con un invio\n");
	while((num=getchar())!='\n'){
		getchar();
		num-=48;
		if(num%2==0){
			mediap+=num;
			ip++;
		} else {
			mediad+=num;
			id++;
		}
	}
	mediap/=ip;
	mediad/=id;
	printf("La media dei numeri pari e' %.2f\n",mediap);
	printf("La media dei numeri dispari e' %.2f\n",mediad);
	#if defined(win32)
		system("pause");
	#endif
	return 0;
}

Si vede che l'ho developato sotto linux? XD
@FreakTux: le variabili è bene dichiararle tutte all'inizio e non in fase di runtime, windows è imprevedibile attento XD
P.S.:In C ci sono sistemi meno arcaici del goto...che non è neanche corretto a volte...e poi si sanno troppo di basic XD
 
@kr1pn0$
figurati! Ho messo due scanf perchè... BOH?! XD [errore di copiatura o digitazione suppongo asd]
nota di precisione: mi sa che i commenti con // vanno in C++ mentre con ci mi sa che vengono accettati solo quelli /*racchiusi così*/
 
[OT]probabilmente hai ragione pechè è da tanto che non metto le mani come si deve con C e C++ ma guarda queste righe di html.it sui miglioramente fatti da C++:
http://programmazione.html.it/guide/lezione/1152/miglioramenti-rispetto-al-c/[/OT]
 
[ot]Boh, non so se prima era così, ma da quando programmo in C e in C++ o sempre utilizzato indistintamente entrambi i tipi di commenti e ne gcc ne g++ mi hanno mai dato problemi. Quindi gli ultimi standard C e C++ ammettono entrambi.
p.s. Hai ragione, http://gcc.gnu.org/c99status.html infatti prima non era così, è stato aggiunto con la nuova versione dello standard c99.
[/ot]
 
Dark Flash ha detto:
@kr1pn0$
figurati! Ho messo due scanf perchè... BOH?! XD [errore di copiatura o digitazione suppongo asd]
nota di precisione: mi sa che i commenti con // vanno in C++ mentre con ci mi sa che vengono accettati solo quelli /*racchiusi così*/
da un po sono stati inclusi pure nel ansi-C
 
Ho provato a afarlo in python ma non mi calcola le medie. Sono alle prime armi con questo linguaggio, mi correggete lo script please? Thanks.
Codice:
#!/usr/bin/perl
def Sum(self,list):
	s = 0;
	for i in range(0, len(list)):
		s += list[i];
	return s;
p,d,mp,md,m = [],[],0,0,0;
a = input("Insert a number (negative for exit) >");
while a > 0:
	if a % 2 == 0:
		p.append(a);
	else:
		d.append(a);
	md = sum(d) / (len(d) + 1);
	mp = sum(p) / (len(p) + 1);
	m = (sum(d) + sum(p)) / ((len(d) + 1) + (len(p) + 1));
	print "The averange of even numbers is",md;
	print "The averange of odd numbers is",mp;
	print "The total average is ",m;
	a = input("Insert a number (negative for exit) >");
 
Stato
Discussione chiusa ad ulteriori risposte.