View Full Version : Programma in C
MetalMassacre
22-10-2002, 09:16
Ciao a tutti,
sono alle prime armi con la programmazzione in C.
Devo fare un esercizio che compili e vada perfettamente..
Il testo dice: chiedere all' utente (al massimo) 13 voti che ha registrato in quest'anno accademico, e di calcolarne la media, dire quale fra i voti è il massimo e quale il minimo.
Tenendo presente che abbaimo fatto solo cicli e procedure ricorsive, avete qualche idea da suggerirmi?
ciao e grazie
#include <stdio.h>
#define NMAX 13 /*numero massimo dei voti*/
#define VMAX 10.0 /*voto massimo*/
int main()
{
int n, i;
float somma, max, min, voto;
do {
printf("\nNumero dei voti da inserire : ");
scanf("%d",&n);
if(n > NMAX || n < 1)
printf("Inserire un numero compreso fra 1 e %d\n", NMAX);
} while(n > NMAX || n < 1);
somma = 0.0;
max = 0.0;
min = VMAX+1.0;
printf("\n");
for(i = 0; i < n; i++) {
do {
printf("Voto numero %d : ", i+1);
scanf("%f",&voto);
if(voto > VMAX || voto < 0.0)
printf("Inserire un voto compreso fra 1 e %.2f\n", VMAX);
} while(voto > VMAX || voto < 0.0);
if(voto > max) max = voto;
if(voto < min) min = voto;
somma += voto;
}
printf("\n\nInseriti %d voti"
"\nLa media è %.2f"
"\nIl voto minimo è %.2f"
"\nIl voto massimo è %.2f\n",
n, somma/n, min, max);
/*le due istruzioni che seguono servono
solo per permettere di leggere l'output
del programma*/
printf("\n\nPremere un tasto per terminare...");
getch();
return 0;
}
MetalMassacre
22-10-2002, 11:43
Cacchio,
ma lo avevi gi afatto o ti sei messo apposta???
grassie mille !
Ho preso un po paura...cakkio non ci arrivero mai io!!
Vabbè sono 2 minuti ;)
Dai dai...impegnati...
Se c'è qualcosa che non capisci dimmi pure...
Si poteva emttere anche qualche funzioncina...
Ad esempio quella che legge il voto...ma è solo una questione di leggibilità in questo caso....
MetalMassacre
22-10-2002, 12:52
Originariamente inviato da cionci
[B]Vabbè sono 2 minuti ;)
Dai dai...impegnati...
Se c'è qualcosa che non capisci dimmi pure...
Si poteva emttere anche qualche funzioncina...
Ad esempio quella che legge il voto...ma è solo una questione di leggibilità in questo caso....
Avevo pensato pure io di chiedere quanti voti sono stati registrati per creare un ciclo in modo da uscinre quando il numero di voti fosse stato quello dichiarato ma non riuscivo ad "accumulare" i vari voti perche con un semplice ciclo si sarebbero sovrascritti prima che li potessi analizzare calcolandone la meia il max e il min...forse mi spiego male...anzi sicuro...
cmq grazie ancora della disponibilità....
ah i voti doveveno andare da minimo 18 a 30 perche sono voti universitari...ma no problema...almeno a modificarlo ci riesco!!! hehehe...
Grazie ancora...mi sa che ci riseniremo :D
Nono...non ti sei spiegato male...
Comunque se i voti sono in 30esimi allora puoi benissimo rendere max, min e voto interi..
MetalMassacre
22-10-2002, 14:53
Scusami nuovamente, su una dispensa c'era questo esempio di procedure ricorsive per il quale ho dovuto inventarmi un main per vedere se compilava giusto....perche ho i miei dubbi riguardo all' output...dovrebbe dare un triangolo di n righe composto da spazi e * del tipo
---*
--***
*****
e via dicendo in base ad il valore n che immetto.....
secondo me non viene cosi ma così:
---*
--**
***
scusa ma non si reffa bene a fare sti schifo di disegni... ho messo le --- perche altrimenti non veniva incolonnato per bene...ci andrebbero spazi vuoti..
il fatto e che sto robo compila giusto ma se lo eseguo la pseudo shell mi si chiude nonostante il comando che ho aggiunto alla fine system pause...
E'solo un problema del mio compilatore? Ciao
-------------------------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
void scrivicarattere (char c, int n)
{ if (n>0) {
printf ("%c",c);
scrivicarattere (c,n-1);
}
}
void aux (int spazi, int stelle)
{if (stelle>0){
aux (spazi+1, stelle-1);
scrivicarattere (' ',spazi);
scrivicarattere ('*',stelle);
printf ("\n");
}
}
void stelle (int n)
{aux (0,n);
}
int main()
{ int x=0;
printf ("scrivi numero righe");
scanf ("%d\n",x);
stelle (x);
system("PAUSE");
}
Metti un getch(); in fondo invece del system("pause")...
PS: creeping death....mitici Metallica !!!
Comunque se deve essere così :
Ha ragione il testo...devi aggiungere 2 * per ogni livello...
i = indice del livello (parte da zero e arriva a n)
n = numero di livelli
Devi stampare n-i-1 spazi e (2*i)+1 asterischi...
OOOA
OOAAA
OAAAAA
AAAAAAA
MetalMassacre
22-10-2002, 19:24
Originariamente inviato da cionci
[B]Metti un getch(); in fondo invece del system("pause")...
PS: creeping death....mitici Metallica !!!
Comunque se deve essere così :
Ha ragione il testo...devi aggiungere 2 * per ogni livello...
i = indice del livello (parte da zero e arriva a n)
n = numero di livelli
Devi stampare n-i-1 spazi e (2*i)+1 asterischi...
OOOA
OOAAA
OAAAAA
AAAAAAA
True metal never die!!
Ho cambiato e messo getch(); ma si chiude lo stesso!!
Che compilatore usi ? ah lo usi su win o su linux?
Bho mi va in balla solo con questo progetto....uso dev-c++
Cmq dici che è giusto....lo provero di nuovo domani in unive...grazie intanto!:p
Dipende...il codice che ti ho postato prima l'ho scritto in Dev-C++, mentre altre cose le scrivo in Visual C++ o Borland C++ Builder...
MetalMassacre
25-10-2002, 19:55
Originariamente inviato da cionci
[B]Metti un getch(); in fondo invece del system("pause")...
PS: creeping death....mitici Metallica !!!
Comunque se deve essere così :
Ha ragione il testo...devi aggiungere 2 * per ogni livello...
i = indice del livello (parte da zero e arriva a n)
n = numero di livelli
Devi stampare n-i-1 spazi e (2*i)+1 asterischi...
OOOA
OOAAA
OAAAAA
AAAAAAA
ciao,
scusa ma non l'ho piu provato sto programma....
allora dovrebbe andare codi come te l'ho trascritto?
Ma se io assegno a x nel main 5, la proc. aux inizia con i pareametri formali spazi=0 e stelle=5....
essendo stelle>o
ottengo
spazi=1 e stelle=4
essendo ancora stelle>0
ottengo
.......
......
.......
spazi=5 e stelle=0 -----> cosi esco dalla condizione
e passo alla proc scrivistelle 4 spazi, che la procedura stampa e va a capo, dopo passo alla stessa 1stella che viene stampata e vado a capo.....
successivamente alla proc aux ritorna spazi 4 e 2 asterischi...
e via dicendo ....
ma cosi facendo stamperebbe veramente quello che sostengo!!!
che passaggio ricorsivo salto?
ti ripeto che a me viene da pensare che stampa così:
ooooA
oooAA
ooAAA
oAAAA
AAAAA
non mi capisco piu!!!!
No...avevo capito male...il codice non l'ho provato...
Se vuoi lo provo, ci sono 3 mila modi per fare una cosa del genere...
Nel programma manca una & nella scanf...
Comunque hai ragione...fa quello che dici te... In ogni caso è un triangolo anche quello...
MetalMassacre
26-10-2002, 10:00
Originariamente inviato da cionci
[B]No...avevo capito male...il codice non l'ho provato...
Se vuoi lo provo, ci sono 3 mila modi per fare una cosa del genere...
Nel programma manca una & nella scanf...
Comunque hai ragione...fa quello che dici te... In ogni caso è un triangolo anche quello...
volevo compilarlo così come era scritto nella dispensa...e mi sono inventatoo un main...adesso compila giusto ma una volta inseriti i numeri di righe non fa nulla...
sto facendo un altro programma che calcola la potenza di un numero passando ad un aprocedura base ed esponente.....ma mi sono sorti dei dubbi matematici.....:
0 alla 0 non esiste vero?
1 alla 0 = 1
-1 alla 0 =+1 o -1 ?
la calcolatrice da -1 ma sapevo che ogni numero positivo o negativo alla 0 da 1 ???
-1 alla 2 =+1 o -1 ??? la calcolatrice da -1 ma dai miei conti è come dire -1*-1= +1 !!!
Ps : non dite niente al mio proff di analisi
:D :D :D
Immetti un altro invio...non capisco perchè però se non lo immetti non parte...
Ah ecco...hai messo lo \n nello scanf...è per quello...
Comunque -1 ^ 0 è -1...perchè puoi fare -(1^0) = -1...
Il segno del risultato di un numero negativo elevato ad una potenza pari è sempre +...mentre se lo si eleva ad una potenza dispari il segno è sempre meno :)
Ahi ahi ahi...non si studia...
MetalMassacre
26-10-2002, 11:02
Originariamente inviato da cionci
[B]Immetti un altro invio...non capisco perchè però se non lo immetti non parte...
Ah ecco...hai messo lo \n nello scanf...è per quello...
Comunque -1 ^ 0 è -1...perchè puoi fare -(1^0) = -1...
Il segno del risultato di un numero negativo elevato ad una potenza pari è sempre +...mentre se lo si eleva ad una potenza dispari il segno è sempre meno :)
Ahi ahi ahi...non si studia...
allora:
-ho tolto il \n e adesso si richiude la shell....come un tempo....
-la storia dei segni...bhe ci sono arrivato...ho dovuto ....concentrarmi un po e riflettere sulle ca@@ate che stavo dicendo....
-nel frattempo ho scritto sto programma, ma con valori del tipo -x alla esponente dispari mi da valore positivo e non negativo....
il problema sta nella valutazione b>0 ...ma non riesco asistemarlo....
qualche suggerimento?
#include <stdio.h>
double potenza (double b, int e)
{
int i,pot,pot0;
pot=1;
pot0=0;
if (b==0 && e==0) /* caso in cui base ed esponente sono entrambi 0 */
return printf ("ERROR\n");
if (b==0 && e!=0) /*caso in cui base è 0 ed esponente qualsiasi*/
return 0;
for (i=0;i<e;i++)
pot=pot*b;
if (b>0) /* caso in cui la base sia positiva */
return pot;
else
return -pot; /* caso in cui la base sia negativa */
}
int main()
{
double base,risultato;
int esponente;
printf ("Scrivi base\n");
scanf ("%lf", &base);
do
{printf ("Scrivi esponente\n");
scanf ("%d", &esponente);
if (esponente<0)
printf ("L'esponente deve essere un intero positivo!\n");}
while (esponente<0);
printf ("Risultato= %.1lf\n",potenza(base,esponente));
printf ("\n");
system("PAUSE");
}
Non importa che tu faccia la distinzione fra base positiva e base negativa...
b è già negativo...quindi se faccio b^3 e b è negativo mi ritornerà da solo un numero negativo...senza bisogno di cambiare segno...
Come fai te torna sempre un nuemro positivo...
MetalMassacre
26-10-2002, 11:52
Originariamente inviato da cionci
[B]Non importa che tu faccia la distinzione fra base positiva e base negativa...
b è già negativo...quindi se faccio b^3 e b è negativo mi ritornerà da solo un numero negativo...senza bisogno di cambiare segno...
Come fai te torna sempre un nuemro positivo...
l'ho modificato così.....
#include <stdio.h>
double potenza (double b, int e)
{
int i,pot,pot1;
pot=1;
pot1=-1;
if (b==0 && e==0) /* caso in cui base ed esponente sono entrambi 0 */
return printf ("ERROR\n");
if (b<0 && e==0) /* caso di base negativa ed esponente 0 */
return pot1;
for (i=0;i<e;i++) /* casi qualsiasi*/
pot=pot*b;
return pot;
}
int main()
{
double base,risultato;
int esponente;
printf ("Scrivi base\n");
scanf ("%lf", &base);
do
{printf ("Scrivi esponente\n");
scanf ("%d", &esponente);
if (esponente<0)
printf ("L'esponente deve essere un intero positivo!\n");}
while (esponente<0);
printf ("Risultato= %.1lf\n",potenza(base,esponente));
printf ("\n");
system("PAUSE");
}
un numero negativo alla 0 da sempre ......?
MetalMassacre
26-10-2002, 12:24
.
Originariamente inviato da MetalMassacre
[B]un numero negativo alla 0 da sempre ......?
Boh...mi sa che ho scazzato...mi sa 1...
MetalMassacre
26-10-2002, 18:24
Originariamente inviato da cionci
[B]
Boh...mi sa che ho scazzato...mi sa 1...
no dai ormai ho fatto che da -1!!!
MetalMassacre
28-10-2002, 12:27
Ciao, ho un'altro esercizietto...
devo scrivere una funzione ricorsiva int mcd(m, n) che calcoli il massimo comune divisore tra i due numeri m ed n....
Ho fatto una roba del genere che compila giusto ma non gira....
#include <stdlib.h>
#include <stdio.h>
int mcd (m,n)
{if (m%n==0)
return (n);
else mcd(n,m%n);}
int main()
{int a,b,c=0;
printf ("Inserisci due numeri\n");
scanf ("%d %d", &a,&b);
c=mcd (a,b);
printf ("Il MCD tra %d e %d è: %d", &a,&b,&c);
system("PAUSE");
return 0;
}
credo che tu lo sappia già calcolare il mcd cmq lo scrivo ugualmente:
Es.: M.C.D.(1320,252)
Si divide il maggiore per il minore:
1320:252=5 con resto 60
poiché il resto non è zero si divide 252 per 60
252:60=4 con resto 12
poiché il resto non è zero si divide 60 per 12
60:12=5 con resto zero
poiché il resto è zero, l'ultimo divisore, il 12 è il M.C.D., quindi:
M.C.D.(1320,252)=12
Consigli accettasi .... ciao grazie
Prova a togliere la & dalla printf ;)
come ti dice cionci via quelle & dalla printf.
è importante capire subito certi concetti, la & messa prima della variabile sta a significare che si fa riferimento all'indirizzo di memoria di quella variabile e non al suo contenuto.
nella scanf tu metti la & davanti a ciascuna variabile perché devi dire alla funzione dove mettere i valori letti (serve quindi un indirizzo) ma quando tu con la printf stampi un valore numerico come in questo caso la funzione si aspetta che tu gli passi quel valore, non l'indirizzo dove andare a prenderlo.
Già...
Ma l'hai fatto apposta a far funzionare il metodo di calcolo anche se m < n o ti è venuto per caso ?
MetalMassacre
29-10-2002, 08:42
Originariamente inviato da recoil
[B]come ti dice cionci via quelle & dalla printf.
è importante capire subito certi concetti, la & messa prima della variabile sta a significare che si fa riferimento all'indirizzo di memoria di quella variabile e non al suo contenuto.
nella scanf tu metti la & davanti a ciascuna variabile perché devi dire alla funzione dove mettere i valori letti (serve quindi un indirizzo) ma quando tu con la printf stampi un valore numerico come in questo caso la funzione si aspetta che tu gli passi quel valore, non l'indirizzo dove andare a prenderlo.
Avete perfettamente ragione....!! Grazie 1000
Avevo progettato tenendo conto che di m>n ma anche che fosse m<n....ma alla fine me lo sono scordato nel senso che tale confronto non l'ho piu messo nel programma...da come si vede..., ma allora perche funzia ugualmente???
bho adesso faccio delle altr prove...
Perchè se m < n... m%n = m...e dopo richiami mcd(n, m%n)...quindi mcd(n,m)... In pratica li scambi e a questo punto funziona :)
Se invece di richiamare mcd(n,m%n) richiamavi mcd(m%n, n) andava in ciclo e non si fermava più ;)
MetalMassacre
07-11-2002, 10:41
Ohhh eccomi qua nuovamente....
ho una nuova discussione da proporvi.....
devo scrivere una procedura che dato un array di caratteri di lunghezza n, modifichi l'array sostituendo alle vocali la lettera V e alle consonanti la lettera C
E...sèmpio: cicciolina
cvccvvcvcv
ma in cosa sballlio?
#include <stdlib.h>
#include <stdio.h>
#define DIM 5
void modifica_array(char arr[],int n)
{
int j;
for (j=0; j<n; j++)
switch (arr[j]);
{
case 'a' :
case 'e' :
case 'i' :
case 'o' :
case 'u' : printf ("v\n"); break;
default : printf ("c\n");
}
}
int main(void)
{
int j;
char arr[DIM];
printf ("Scrivi una serie di %d lettere\n", DIM);
for (j=0; j<DIM; j++)
scanf ("%c", &arr[j]);
modifica_array (arr, DIM);
system("PAUSE");
}
ciao atutti!!!
SCUSATE....HO RISOLTO DOVEVO LEVARE UN ;
MetalMassacre
07-11-2002, 12:41
In compenso ho un problema nuovo....dovrei
scrivere una procedura void pari_dispari (int arr[], int n, int*p, int*d) che dato un array di interi di lunghezza n calcoli il numero di elementi pari e quelllo di elementi dispari usando le variabili puntatori p e d per memorizzare l'output....
avete qualche suggerimento....non è del tutto giusto così come l'ho fatto....o meglio il calcolo dei numeri dispari è giusto ma i pari no....boh!!!!
#include <stdlib.h>
#include <stdio.h>
#define DIM 5
void pari_dispari (int arr[],int n,int*p,int*d)
{int i;
for (i=0; i<n; i++)
{if (arr[i]%2==0)
*p=*p+1;
else
*d=*d+1;}
printf ("Il numero di elementi pari è: %d\n",*p);
printf ("Il numero di elementi dispari è: %d\n",*d);
}
int main()
{
int i,pari,dispari=0;
int a[DIM];
printf ("Digita una serie di %d numeri\n", DIM);
for (i=0; i<DIM; i++)
scanf ("%d", &a[i]);
pari_dispari (a,DIM,&pari,&dispari);
system("PAUSE");
return 0;
}
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.