View Full Version : [C] Come si risolve una cosa del genere?
So che è elementare, ma mi serve con una certa urgenza...
Scrivere e far girare un programma C che:
1. legge un numero n minore di 30
2. legge n interi e li mette in un array int a[]
3. legge un intero m,
4. calcola la somma degli elementi dell’array a maggiori o uguali ad m utilizzando la funzione (che si deve definire)
int somma(int a[], int p, int m)
che restituisce la somma dei primi p elementi dell’array a maggiori di
m
5. stampa:
a. la media degli interi letti maggiori di del numero m letto (cioè la somma diviso per quanti sono).
Ad esempio se
Leggo 5 (dimensione dell’array)
Leggo i numeri 2 7 3 4 10
Leggo 4
Stamperò: La somma dei numeri letti maggiori o uguali a di 4 è 21
thx.
Black imp
16-07-2006, 14:41
senza offesa ma già il titolo è strairritante :rolleyes: poi esordisci con 'mi serve con una certa urgenza' e poi posti una domanda su una cosa così banale? non sarà il caso che studi?
io te lo faccio anche se vuoi, anche con una certa urgenza... se me lo paghi ;)
Boh scusa non mi sembrava di esser stato così sgarbato per meritarmi una risposta del genere... mi serviva sapere come farlo per studiarci un po' sopra, ma non è che obbligo nessuno eh...
Black imp
16-07-2006, 15:06
Boh scusa non mi sembrava di esser stato così sgarbato per meritarmi una risposta del genere... mi serviva sapere come farlo per studiarci un po' sopra, ma non è che obbligo nessuno eh...
no no non sei sgarbato figurati ma è come dire 'io non ho voglia di farlo fatelo voi'. inizia a fare qualcosa. avrai un libro da consultare. prova e posta il tuo codice. poi ti si aiuta volentieri. :)
Inizia a scrivere un po' di codice, altrimenti ti assicuro che non imparerai mai.
Poi quando hai buttato giù qualcosa ti si da una mano volentieri
no no ma tranquillo, se ci paghi te lo facciamo in 2 minuti contati con la massima urgenza... :asd:
no no non sei sgarbato figurati ma è come dire 'io non ho voglia di farlo fatelo voi'. inizia a fare qualcosa. avrai un libro da consultare. prova e posta il tuo codice. poi ti si aiuta volentieri. :)
Ok dai forse hai ragione :) è che proprio non ho capito da dove salta fuori quel "p"... se vuole che sia un input dell'utente o cosa... senza funzioni sono capace a farlo...
allora prova a realizzare la funzione somma senza usare il parametro p: vedrai che ti accorgerai che non ci si riesce ;)
Sì ma non ho ben capito cosa rappresenta quella p... cioè se ci sono 3 elementi >= m p è uguale a 3?
che restituisce la somma dei primi p elementi dell’array a maggiori di
m
P verrà dato dall'utente prima di chiamare somma.
Somma dovrà quindi cercare un numero di elementi <= m, quando ne ha trovati p, li somma e restituisce il valore
Ah ok, quindi devo anche chiedere all'utente di inserire p, oltre ad m e agli elementi dell'array!
no: p è il numero di elementi dell'array. per il futuro quando ti capita una situazione del genere ripeto: prova a scrivere il codice senza usare quei dati che secondo te sono superflui; ti accorgerai durante la scrittura che superflui non sono.
Black imp
16-07-2006, 22:17
Ah ok, quindi devo anche chiedere all'utente di inserire p, oltre ad m e agli elementi dell'array!
mmmh forse no. il testo è un po' astruso: sembra che tu debba calcolare tutti i numeri più grandi di m che ci sono nell'array ma per farlo devi invocare una funzione che crei tu che usa come parametro int p che ti dice di fermarti ai primi p numeri maggiori di m. quindi tu scrivi la funzione usando il parametro p. ovviamente devi scriverla in modo che se ce n'è meno di p la ricerca non si impalla ;) poi la chiamerai passandole per sicurezza il numero di elementi che ha a[] in questo modo se fossero tutti maggiori di m li troverebbe tutti.
mi raccomando il fatto che il testo chiami a[] e m sia le variabili che i parametri della funzione è solo per comodità e farti capire. la funzione puo avere anche 3 parametri che si chiamano in altro modo ma da fuori non conta.
Una cosa che non ho capito è questa (grassetto ;))
Scrivere e far girare un programma C che:
1. legge un numero n minore di 30
2. legge n interi e li mette in un array int a[]
3. legge un intero m,
4. calcola la somma degli elementi dell’array a maggiori o uguali ad m utilizzando la funzione (che si deve definire)
int somma(int a[], int p, int m)
che restituisce la somma dei primi p elementi dell’array a maggiori di
m
5. stampa:
a. la media degli interi letti maggiori del numero m letto (cioè la somma diviso per quanti sono).
Ad esempio se
Leggo 5 (dimensione dell’array)
Leggo i numeri 2 7 3 4 10
Leggo 4
Stamperò: La somma dei numeri letti maggiori o uguali a di 4 è 21
:mbe: :mbe: :mbe:
si, in effetti hai ragione, il punto 4 è impreciso; io considererei come se dicesse sempre "maggiori o uguali"; nella funzione somma, includi nel calcolo anche i numeri uguali ad m.
Non capisco, perché devo usare una funzione? Non posso usare due array, in modo che il secondo contenga gli elementi >=m del primo?
AnonimoVeneziano
17-07-2006, 10:44
Non capisco, perché devo usare una funzione? Non posso usare due array, in modo che il secondo contenga gli elementi >=m del primo?
I testi dei problemi li fanno per verificare se hai capito come funzionano le cose, sicuramente ci saranno infinite soluzioni diverse e magari più eleganti, ma ti chiedono di usare una funzione per imparare a progettare una funzione in C (se è una esercitazione) o per verificare se lo sai fare (se è un esame)
Ciao
Adesso ad esempio perché mi da segmentation fault?
#include <stdio.h>
int main()
{
int n;
printf("Inserisci il numero massimo di elementi dell'array (massimo 30)\n");
scanf("%d", &n);
if (n <= 30){
int i;
int j;
int a[n];
int b[j];
int m;
int total;
int average;
for(i = 0; i < n; i++) {
printf("Inserisci l'elemento in posizione i = %d dell'array:\n", i);
scanf("%d", &a[i]);
}
printf( "%5s%20s", "Pos array", "Elemento array\n");
for(i=0; i < n; i++) {
printf("%5d%20d\n", i, a[i]);
}
}
else printf("La dimensione massima dell'array deve essere 30!\n");
return 0;
}
non riesco ad aprire l'allegato, cmq di solito segmentation fault avviene se andando a leggere gli elementi dell'array sfondi l'array andando a leggere dati nn appartenenti al tuo programma.
controlla di far variare l'indice dell'array da 0 a LUNGHEZZA_ARRAY-1
Black imp
17-07-2006, 13:45
la j non è inizializzata e la usi per allocare un array b di dimensioni ignote quindi.
trallallero
17-07-2006, 13:54
Adesso ad esempio perché mi da segmentation fault?
#include <stdio.h>
int main()
{
int n;
printf("Inserisci il numero massimo di elementi dell'array (massimo 30)\n");
scanf("%d", &n);
if (n <= 30){
int i;
int j;
int a[n];
int b[j];
int m;
int total;
int average;
for(i = 0; i < n; i++) {
printf("Inserisci l'elemento in posizione i = %d dell'array:\n", i);
scanf("%d", &a[i]);
}
printf( "%5s%20s", "Pos array", "Elemento array\n");
for(i=0; i < n; i++) {
printf("%5d%20d\n", i, a[i]);
}
}
else printf("La dimensione massima dell'array deve essere 30!\n");
return 0;
}
non hai inizializzato j ;)
Comunque anche una printf sbagliata puó
dare seg fault.
ti sconsiglio vivamente le allocazioni dinamiche nello stack.
non hai inizializzato j ;)
Comunque anche una printf sbagliata puó
dare seg fault.
Bhe ma la j non viene invocata nella printf... L'errore sta in questo for
for(i = 0; i < n; i++) {
printf("Inserisci l'elemento in posizione i = %d dell'array:\n", i);
scanf("%d", &a[i]);
}
imho perché togliendolo è tutto ok... e inserendo un valore > 30, saltando direttamente all'else, tutto fila liscio. 71104 cosa intendi scusa?
il fatto di non inizializzare j è un errore, in questo modo dai a b una dimensione totalmente casuale
71104 cosa intendi scusa? un array dichiarato nella forma che hai usato tu viene allocato nello stack, ma è un errore concettuale allocare nello stack dati di dimensione non nota a priori: per quelli esiste l'heap (che gestisci con malloc, calloc, realloc e free). quando si dichiara un array come fai tu, tra parentesi quadre deve esserci rigorosamente una costante, non una variabile. oltre all'errore concettuale aggiungici anche che è un obbrobbrio che giustamente quasi nessun compilatore supporta, anzi che io sappia solo il gcc ;)
trallallero
17-07-2006, 14:31
Bhe ma la j non viene invocata nella printf...
si si ma intendevo una cosa del genere
printf( "%s", 1 );
Questa fa seg. fault
Se sbagli tipo di dato é facile che ti faccia seg. fault
Magari pensi che ci sia un errore nell'allocazione dinamica
e invece é una stupida printf che spacca tutto ;)
trallallero
17-07-2006, 14:32
un array dichiarato nella forma che hai usato tu viene allocato nello stack, ma è un errore concettuale allocare nello stack dati di dimensione non nota a priori: per quelli esiste l'heap (che gestisci con malloc, calloc, realloc e free). quando si dichiara un array come fai tu, tra parentesi quadre deve esserci rigorosamente una costante, non una variabile. oltre all'errore concettuale aggiungici anche che è un obbrobbrio che giustamente quasi nessun compilatore supporta, anzi che io sappia solo il gcc ;)
si, infatti il mio non me lo fa fare (cc di Sun Solaris)
Black imp
17-07-2006, 15:20
la j non è inizializzata e la usi per allocare un array b di dimensioni ignote quindi.
mi quoto :D
eh, abbiamo capito... :mbe:
Black imp
17-07-2006, 15:47
eh, abbiamo capito... :mbe:
:asd:
Sto provando a realizzarla senza funzioni, ma sono bloccato: provate a compilare e vedete che problemi da durante l'esecuzione... in pratica non riesco a "fermare" il contatore j, e quando l'elemento a[i] non è >= di m, in b[j] va un numero enorme... io invece vorrei che si fermasse, in quel caso, il contatore... ecco il codice, imho l'errore è nel grassetto, ma non so come risolverlo:
#include <stdio.h>
int main()
{
int n;
printf("Inserisci il numero massimo di elementi dell'array (massimo 30)\n");
scanf("%d", &n);
if (n <= 30){
int i;
int j;
int a[n];
int p=10;
int b[p];
int m;
int total;
int average;
for(i = 0; i < n; i++) {
printf("Inserisci l'elemento in posizione %d: ", i);
scanf("%d", &a[i]);
}
printf("Inserisci il numero m di confronto");
scanf("%d", &m);
for(i = 0; i < n; i++) {
for(j = 0; j < p; j++) {
if(a[i] >= m) {
b[j] = a[i];
}
}
}
for(j=0; j < p; j++) {
total=0;
total += b[j]; }
printf( "%5s%20s", "Pos array", "Elemento array\n");
for(i=0; i < n; i++) {
printf("%5d%20d\n", i, a[i]);
}
printf( "%5s%20s", "Pos array", "Elemento array\n");
for(j=0; j < n; j++) {
printf("%5d%20d\n", j, b[j]);
}
}
else printf("La dimensione massima dell'array deve essere 30!\n");
return 0;
}
Per prima cosa dovresti sistemare quell'orrore all'inizio nella definizione dei vettori. Intanto se scrivi in C, le dichiarazioni vanno fatte all'inizio.
Gli array definiscili come puntatori e una volta che sei a conoscenza del numero di elementi ne allochi memoria con la malloc o cmalloc
Alternativamente puoi definirli con una grandezza fissa.
poi
for(i = 0; i < n; i++)
for(j = 0; j < p; j++)
if(a[i] >= m)
b[j] = a[i];
è decisamente errato
Potresti fare qualcosa del genere:
j = 0;
for(i = 0; i < n && j < p; i++){
if(a[i] >= m){
b[j] = a[i];
j++;
}
}
#include <stdio.h>
int i,n,count,total;
int funz_somma(int a[n], int p, int m){
for(i = 0; i < n; i++) {
if (count <= p) { /*Funzione principale del programma*/
if(a[i] >= m) {
total+ =a [i];
count++;
}
}
}
return total;
}
int main()
{
int n;
printf("Inserisci il numero massimo di elementi dell'array (massimo 30)\n");
scanf("%d", &n);
if (n <= 30){
int i;
int a[n];
int p=10;
int b[p];
int m;
int total=0;
int count=0;
for (i = 0; i < n; i++) { /*Sto inizializzando l'array*/
printf("Inserisci l'elemento in posizione %d: ", i);
scanf("%d", &a[i]);
}
printf("Inserisci il numero m di confronto");
scanf("%d", &m);
total = funz_somma(a[n], p, m);
printf( "%5s%20s", "Pos array", "Elemento array\n");
for(i=0; i < n; i++) {
printf("%5d%20d\n", i, a[i]);
}
printf("La media è %.2f\n", (float)total/count);
}
else printf("La dimensione massima dell'array deve essere 30!\n");
return 0;
}
Allora ho trovato il metodo per evitare di usare due arrays, ma mi restituisce questo errore:
warning: passing argument 1 of ‘funz_somma’ makes pointer from integer without a cast.
Che vuol dire? So che il programma per ora è disordinato, dopo gli darò una sistemata ;)
Ah un'altra cosa... visto quello che ho messo in grassetto? Perché se faccio la printf e la scanf dopo tutte le dichiarazioni, il programma non funziona?
trallallero
18-07-2006, 11:24
int funz_somma(int a[n], int p, int m)
a[n] non piace al 99% dei compilatori (ti é giá stato detto)
O definisci una costante o usi allocazione dinamica.
Con costante il prototipo diventa
int funz_somma(int a[MAX_DIM], int p, int m)
ed "a" é limitato a MAX_DIM elementi.
con allocazione dinamica
int funz_somma(int *a, int p, int m)
e trovi un modo per sapere il numero di elementi in a.
total + = a[i];
ocio c'é uno spazio tra + e =
int a[n];
int b[p];
stesso discorso di prima. Consiglio l'allocazione dinamica.
total = funz_somma( a[n], p, m);
stai passando il primo elemento come valore alla funzione.
La funzione vuole come parametro l'indirizzo dell'array quindi
total = funz_somma( a, p, m);
infatti il compilatore te l'ha detto: warning: passing argument 1 of ‘funz_somma’ makes pointer from integer without a cast.
non so se ci sono errori di logica o altro, non ho controllato.
Ciao
Ho provato a correggere l'errore nella funzione, ora il gcc me lo compila correttamente, ma il risultato non è corretto. In pratica al posto della media somma/count mi visualizza non un numero, ma "nin"... :mbe:
#include <stdio.h>
int i,n,count=0,total=0;
int funz_somma(int a[i], int p, int m){
for(i = 0; i < n; i++) {
if (count <= p) { /*Funzione principale del programma*/
if(a[i] >= m) {
total += a[i];
count++;
}
}
}
return count;
return total;
}
int main()
{
int n;
printf("Inserisci il numero massimo di elementi dell'array (massimo 30)\n");
scanf("%d", &n);
if (n <= 30){
int i;
int a[n];
int p=10;
int m;
for (i = 0; i < n; i++) { /*Sto inizializzando l'array*/
printf("Inserisci l'elemento in posizione %d: ", i);
scanf("%d", &a[i]);
}
printf("Inserisci il numero m di confronto: ");
scanf("%d", &m);
total = funz_somma(a, p, m);
printf( "%5s%20s", "Pos array", "Elemento array\n");
for(i=0; i < n; i++) {
printf("%5d%20d\n", i, a[i]);
}
printf("La media è %.2f\n", (float)total/count);
}
else printf("La dimensione massima dell'array deve essere 30!\n");
return 0;
}
Niente da fare :cry:
trallallero
18-07-2006, 13:28
dai calma ;) piangere non serve (in questo caso)
cos'é sta roba ?
EDIT: ops :D ho premuto invia prima di scrivere tutto ...
hai messo
return count;
return total;
2 return in fila ??? perché ?
int funz_somma(int a[i], int p, int m){
non può essere definito così
o usi un puntatore ad a oppure dichiari a[], se vuoi passare anche la dimensione devi usare una costante(#define COSTANTE valore)
poi considera che lasciando p fisso a 10 se inserisci meno di 10 elementi prendi anche valori non significativi del vettore
nella funzione tu usi due volte return, però il programma una volta che trova il primo return termina la sua esecuzione ed il secondo viene ignorato
per avere più valori di ritorno potresti usare un'array, una struct oppure passare i parametri dove vuoi che siano inseriti i risultati per indirizzo
dai calma ;) piangere non serve (in questo caso)
cos'é sta roba ?
EDIT: ops :D ho premuto invia prima di scrivere tutto ...
hai messo
return count;
return total;
2 return in fila ??? perché ?
Bhe perché deve restituire quei valori no? Provate a visualizzare il count, in quel sorgente... rimane fisso a 11... e il total rimane a zero...
un'altra cosa perchè usi le variabili globali?
è meglio all'interno di una funzione usare variabili locali
trallallero
18-07-2006, 13:41
Bhe perché deve restituire quei valori no? Provate a visualizzare il count, in quel sorgente... rimane fisso a 11... e il total rimane a zero...
non per essere polemico ma non ti conviene studiare prima di iniziare ? ;)
come fa a tornare piú valori una funzione ? una volta che ha fatto return che fa torna indietro
e lo rifá ? se vuoi far tornare piú valori o ritorni l'indirizzo ad una struttura
o passi i parametri per indirizzo.
Comunque siamo in tanti a dirti le stesse cose e se tu continui a fare a modo tuo
non andrai mai avanti.
per esempio: int funz_somma(int a[i], int p, int m)
a[i] non lo puoi fare.
quoto, e non era ne' scherzoso ne' ironico
Lo so ma purtroppo non ho tempo di studiare dato che a brevissimo ho l'esame... vorrei solo capire dove ho sbagliato... nella definizione degli input della funzione funz_somma ho provato a mettere a al posto di a[i] ma non funziona nulla :( abbiate pazienza, so che non ho studiato abbastanza ma credo che l'esercizio d'esame sarà simile a questo, quindi partire da un codice semiesatto potrebbe aiutarmi... grazie infinite.
#include <stdio.h>
int funz_somma(int a[], int p, int m, int n);
int main()
{
int n;
int count;
int total;
printf("Inserisci il numero massimo di elementi dell'array (massimo 30)\n");
scanf("%d", &n);
if (n <= 30){
int i;
int a[n];
int p=10;
int m;
float media;
int counter;
for (i = 0; i < n; i++) { /*Sto inizializzando l'array*/
printf("Inserisci l'elemento in posizione %d: ", i);
scanf("%d", &a[i]);
}
printf("Inserisci il numero m di confronto: ");
scanf("%d", &m);
total = funz_somma(a, p, m, n);
printf( "%5s%20s", "Pos array", "Elemento array\n");
for(i=0; i < n; i++) {
printf("%5d%20d%20d\n", i, a[i], total);
}
printf("La media è %d\n", total/count);
}
else printf("La dimensione massima dell'array deve essere 30!\n");
return 0;
}
int funz_somma(int a[], int p, int m, int n){
int *counter;
int i;
int total=0;
float media;
int count;
counter=&count;
for(i = 0; i < n; i++) {
/*Funzione principale del programma*/
if(a[i] >= m) {
total+=a[i];
count++;
}
}
return total;
}
Non so come far uscire quel count dalla funzione...
trallallero
19-07-2006, 10:16
io adesso ho un pó da fare ma al volo :
int funz_somma( int a[], int p, int m, int n, int *Count )
{
...
(*Count)++;
}
quando chiami la funzione passi l'indirizzo della variabile
int c;
...
x = funz_somma( a, p, m, n, &c )
dopo la chiamata in c trovi il valore. Questo perché hai passato alla
funzione l'indirizzo della variabile e la funzione lavora su quell'indirizzo ;)
Ok grazie adesso provo :)
Nel frattempo ho provato questo, con due funzioni però:
#include <stdio.h>
int main()
{
int n;
int count;
int total;
printf("Inserisci il numero massimo di elementi dell'array (massimo 30) oppure 0 per uscire: \n");
scanf("%d", &n);
if (n <= 30 ){
if (n != 0){
int i;
int a[n];
int p=10;
int m;
for (i = 0; i < n; i++) { /*Sto inizializzando l'array*/
printf("Inserisci l'elemento in posizione %d: ", i);
scanf("%d", &a[i]);
}
printf("Inserisci il numero m di confronto e il valore 'p': ");
scanf("%d %d", &m, &p);
total = funz_somma(a, p, m, n);
count = contatore(a,m,p);
printf( "%5s%20s", "Pos array", "Elemento array\n");
for(i=0; i < n; i++) {
printf("%5d%20d%20d\n", i, a[i], total);
}
if (count != 0){
printf("La media è %.2f\nGrazie per aver utilizzato questo programma!\n", (float)total/count);}
else printf("Non ho trovato alcun valore >= di %d\nGrazie per aver utilizzato questo programma!\n", m);
}
else printf("Non hai inserito alcun valore!\n");
}
else printf("La dimensione massima dell'array deve essere 30!\n");
return 0;
}
int funz_somma(int a[], int p, int m, int n){
int i;
int total=0;
for(i = 0; i < n && i < p; i++) {
/*Funzione principale del programma*/
if(a[i] >= m) {
total+=a[i];
}
}
return total;
}
int contatore(int a[], int m, int p){
/*Funzione che calcola quanti numeri sono >=m*/
int i;
int n;
int count=0;
for (i = 0; i < p ; i++) {
if(a[i]>=m) {
count++;
}
}
return count;
}
trallallero
19-07-2006, 13:10
sempre al volo (oggi ho da fare) ti consiglio di cambiare questo:
if (n <= 30 ){
if (n != 0){
...
...
else printf("Non hai inserito alcun valore!\n");
}
else printf("La dimensione massima dell'array deve essere 30!\n");
con:
if (n <= 0 || n > 30 )
printf("Inserire un valore tra 1 e 30!\n"), exit(1);
... <continua senza if>
eviti di scrivere tutto il main dentro la if, diventa molto piú leggibile ;)
Ok grazie :p scusa ma cosa vuol dire exit(1)?
trallallero
19-07-2006, 13:50
Ok grazie :p scusa ma cosa vuol dire exit(1)?
é uno standard dei programmi C.
La funzione exit fa uscire dal programma e se é tutto ok esci con 0 (exit(0))
altrimenti non zero (appunto exit(1))
Il discorso sarebbe piú lungo ma a parte che non ho molto tempo diciamo che per adesso a te basta questa di spiegazione :)
é uno standard dei programmi C.
La funzione exit fa uscire dal programma e se é tutto ok esci con 0 (exit(0))
altrimenti non zero (appunto exit(1))
Il discorso sarebbe piú lungo ma a parte che non ho molto tempo diciamo che per adesso a te basta questa di spiegazione :)
Ok, un po' come il return 0 alla fine del main no? Ciao grazie
trallallero
19-07-2006, 14:40
Ok, un po' come il return 0 alla fine del main no? Ciao grazie
si, dà un codice all'uscita. Il sistema operativo "sa" che quel programma é uscito con quel codice.
trallallero
20-07-2006, 13:41
Passato l'esametto eh :D
:cincin:
Grazie di tutto, studierò in futuro :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.