View Full Version : [C]Le basi
Ho inziato a programmare qualcosa in C ma sto veramente sclerando. Mi sembra di perdermi in un bicchiere d'acqua.
Dopo diverse ore di elaborazione mentale, mi sono arreso e ho deciso di chiedere a voi alcune delucidazioni.
Sto tentando di fare un programma che risolva equazioni di secondo grado, dati in input i valori di a, b e c.
Per ora ho proceduto solo con l'inserire i valori e stampare a schermo ciò che ho inserito, ma mi sono già bloccato...
Questo è il codice:
#include <stdio.h>
#include <math.h>
main ()
{
float a, b, c, delta;
printf("Inserisci il valore di a:\t");
scanf("%f\n", &a );
printf("Inserisci il valore di b:\t");
scanf("%f\n", &b );
printf("Inserisci il valore di c:\t");
scanf("%f\n", &c );
printf("I valori da te inseriti sono:\t %f\t%f\t%f\n", a b c); // verifichiamo i valori inseriti
}
Ora le domande: l'ultimo printf da errore, non capisco come faccio a far visualizzare 3 variabili nella stessa riga in un unico printf...
Inserito il primo valore in input ( in questo caso "a" ), il programma attende che io gli dia un secondo valore ( da me mai definito ) per poi passare a chiedermi "b". Perchè fa sta cosa?
Stessa cosa dell'ultimo printf, con lo scanf come faccio a chiedere contemporaneamente più valori in input?
Grazie
Kwb
wingman87
26-10-2009, 12:51
printf("I valori da te inseriti sono:\t %f\t%f\t%f\n", a b c); // verifichiamo i valori inseriti
La printf prende un parametro obbligatorio (la stringa di formattazione) piu' tanti altri quante sono le variabili da stampare, quindi nel tuo caso un totale di 4 parametri. I parametri devono essere separati da una virgola, quindi il codice corretto e':
printf("I valori da te inseriti sono:\t %f\t%f\t%f\n", a, b, c); // verifichiamo i valori inseriti
EDIT: dimenticavo, per la scanf e' la stessa cosa
cruyffissimo
26-10-2009, 13:41
è normale che ti chieda valori perchè la funzione scanf richiede un'input da tastiera :ciapet:
e inoltre non mi risulta che si possono mettere più valori in una sola istruzione scanf....
ma puoi mettere in serie una cs del genere:
printf(" inserire valori a,b,c);
scanf("%f\n", &a );
scanf("%f\n", &b );
scanf("%f\n", &c );
buon lavoro!
La printf prende un parametro obbligatorio (la stringa di formattazione) piu' tanti altri quante sono le variabili da stampare, quindi nel tuo caso un totale di 4 parametri. I parametri devono essere separati da una virgola, quindi il codice corretto e':
printf("I valori da te inseriti sono:\t %f\t%f\t%f\n", a, b, c); // verifichiamo i valori inseriti
Ok, ora sembra andare meglio, però rimane il problema che mi chiede sempre 2 input su "a", cosa che non capisco perchè avvenga.
Ecco a voi, questo è l'output generato:
Inserisci il valore di a: 5.0
4.0
Inserisci il valore di b: 3.0
Inserisci il valore di c: 5
I valori da te inseriti sono: 5.000000 4.000000 3.000000
Come vedete, non so perchè dopo il primo 5.0 mi chiede ( nella seconda riga ) di inserire un altro valore ( 4.0 ), perchè?
EDIT: dimenticavo, per la scanf e' la stessa cosa
è normale che ti chieda valori perchè la funzione scanf richiede un'input da tastiera :ciapet:
e inoltre non mi risulta che si possono mettere più valori in una sola istruzione scanf....
ma puoi mettere in serie una cs del genere:
printf(" inserire valori a,b,c);
scanf("%f\n", &a );
scanf("%f\n", &b );
scanf("%f\n", &c );
buon lavoro!
Quindi, si può fare o no? Non state dicendo due cose opposte? :stordita:
cruyffissimo
26-10-2009, 15:53
non saprei perchè ti mette due volte la richiesta di input, però come ti ho detto prima, non si possono prendere più valori in un solo scanf...è lo scanf che determina il numero di input, non la quantità di printf
:sperem:
non saprei perchè ti mette due volte la richiesta di input, però come ti ho detto prima, non si possono prendere più valori in un solo scanf...è lo scanf che determina il numero di input, non la quantità di printf
:sperem:
Ok, cmq il codice che ho scritto è questo:
#include <stdio.h>
#include <math.h>
main ()
{
float a, b, c, delta;
printf("Inserisci il valore di a:\t");
scanf("%f\n", &a );
printf("Inserisci il valore di b:\t");
scanf("%f\n", &b );
printf("Inserisci il valore di c:\t");
scanf("%f\n", &c );
printf("I valori da te inseriti sono:\t%f\t%f\t%f\n", a, b, c); // verifichiamo i valori inseriti
}
Vorrei proprio capire perchè spunta so doppio input. Lo fa anche a voi?
euphyllia87
26-10-2009, 18:57
Io mettere il New Line al di fuori dello scanf, ma dentro le printf e basta
wingman87
26-10-2009, 19:01
Quindi, si può fare o no? Non state dicendo due cose opposte? :stordita:
Si può fare, esempio:
#include <stdio.h>
#include <math.h>
main ()
{
float a, b, c, delta;
printf("Inserisci il valore di a, b e c:\t");
scanf("%f%f%f", &a, &b, &c );
printf("I valori da te inseriti sono:\t%f\t%f\t%f\n", a, b, c); // verifichiamo i valori inseriti
}
Il tuo codice non funzionava bene, come ti stava dicendo euphyllia, per via dei '\n' negli scanf
euphyllia87
26-10-2009, 19:18
Si può fare, esempio:
#include <stdio.h>
#include <math.h>
main ()
{
float a, b, c, delta;
printf("Inserisci il valore di a, b e c:\t");
scanf("%f%f%f", &a, &b, &c );
printf("I valori da te inseriti sono:\t%f\t%f\t%f\n", a, b, c); // verifichiamo i valori inseriti
}
Il tuo codice non funzionava bene, come ti stava dicendo euphyllia, per via dei '\n' negli scanf
Già... teoricamente perché sullo scanf prende anche il codice ASCII del New Line (però non vorrei ricordare male... con l'assembly MIPS era cosi :Prrr: )
Ok, il programma dal punto di vista sintattico sembra andare. Il guaio è che essendo sotto linux e facendo tutto da editor di testo + riga di comando, non so come fare un debug.
Questo è il codice quasi finito:
#include <stdio.h>
#include <math.h>
main ()
{
float a, b, c, x1, x2, delta;
printf("Inserisci il valore di a:\n");
scanf("%f", &a );
printf("Inserisci il valore di b:\n");
scanf("%f", &b );
printf("Inserisci il valore di c:\n");
scanf("%f", &c );
printf("I valori da te inseriti sono:\t%f\t%f\t%f\n", a, b, c); // verifichiamo i valori inseriti
if ( a == 0 )
{
if ( b != 0 )
{
x1 = -c/b;
printf("Il risultato di quest'equazione di primo grado è:%f\t", x1 );
}
else
{
if ( c == 0 )
{
printf("L'equazione esiste per qualunque x uguale a 0\n");
}
else
{
printf("L'equazione non ha soluzioni\n");
}
}
}
else
{
delta = (b * b) - (4.0 * a * c );
x1 = (-b + delta)/(2.0 * a);
x2 = (-b - delta)/(2.0 * a);
printf("Il primo risultato dell'equazione è: %f\n", x1);
printf("Il secondo risultato dell'equazione è: %f\n", x2);
}
}
La prima parte, riguardante l'equazione di primo grado funziona, è la seconda parte ( equazione di secondo grado, quella in grassetto ) che non ritorna i risultati giusti, e non capisco dove sta l'errore visto che non c'è un debug.
Ho usato i valori 2, 6 e 1 rispettivamente per a, b e c .
Mi manca da implementare i casi in cui il delta sia = e < di 0.
Ma non va fatta la radice quadrata del delta qui?
x1 = (-b + delta)/(2.0 * a);
x2 = (-b - delta)/(2.0 * a);
:)
e' per questo che non ti torna?
wingman87
26-10-2009, 20:28
Ma non va fatta la radice quadrata del delta qui?
x1 = (-b + delta)/(2.0 * a);
x2 = (-b - delta)/(2.0 * a);
:)
e' per questo che non ti torna?
quoto
Comunque per fare il debugging puoi compilare con l'opzione -g e poi lanciare "dbg nomefile".
Cerca su google i comandi di dbg
Cosi' va.. :)
#include <stdio.h>
#include <math.h>
int main ()
{
float a, b, c, x1, x2, delta;
printf("Inserisci il valore di a:\n");
scanf("%f", &a );
printf("Inserisci il valore di b:\n");
scanf("%f", &b );
printf("Inserisci il valore di c:\n");
scanf("%f", &c );
printf("I valori da te inseriti sono:\t%f\t%f\t%f\n", a, b, c); // verifichiamo i valori inseriti
if ( a == 0 )
{
if ( b != 0 )
{
x1 = -c/b;
printf("Il risultato di quest'equazione di primo grado è:%f\t", x1 );
}
else
{
if ( c == 0 )
{
printf("L'equazione esiste per qualunque x uguale a 0\n");
}
else
{
printf("L'equazione non ha soluzioni\n");
}
}
}
else
{
delta = ((b * b) - (4.0 * a * c ));
printf("Il delta e': %f\n",delta);
delta= sqrt(delta);
printf("La radice del delta e': %f\n",delta);
x1 = (-b + delta)/(2.0 * a);
x2 = (-b - delta)/(2.0 * a);
printf("Il primo risultato dell'equazione è: %f\n", x1);
printf("Il secondo risultato dell'equazione è: %f\n", x2);
}
return 0;
}
Ma non va fatta la radice quadrata del delta qui?
x1 = (-b + delta)/(2.0 * a);
x2 = (-b - delta)/(2.0 * a);
:)
e' per questo che non ti torna?
Si scusate... Aver pensato tutto il giorno a come far sparire l'input inesistente porta a questi risultati... :muro:
Ikon O'Cluster
26-10-2009, 23:12
Prova Nemiver è un debugger con interfaccia grafica...
aReYoUnUtS??
27-10-2009, 10:28
Ciao, ho provato a scrivere il codice, cercando di includere anche il caso di equazione di primo grado.
Ho dato una occhiata veloce e dovrebbe funzionare.
Posto il codice qui sotto:
#include <stdio.h>
#include <math.h>
int main ()
{
double a, b, c; // eq: ax^2 + bx + c
double r1, r2; // risultato 1 e risultato 2
double delta;
printf("\nInserisci coeffic. x^2:\t\t");
scanf("%lf", &a);
printf("\n\nInserisci coeffic. x : \t\t");
scanf("%lf", &b);
printf("\n\nInserisci term. noto :\t\t");
scanf("%lf", &c);
// calcolo il delta se l'equazione e' di secondo grado
if(a!=0){
printf("\n\nL'eq. e': %.2lfx^2 ", a);
if(b>=0)
printf("+");
printf("%5.2lfx ", b);
if(c>=0)
printf("+");
printf("%5.2lf = 0",c);
delta = b*b - 4*a*c;
if(delta>0){
printf("\n\nIl delta e' positivo\n");
r1 = (-b + sqrt(delta))/(2*a);
r2 = (-b - sqrt(delta))/(2*a);
printf("\nLe due soluzioni sono: %.2lf e %.2lf\n", r1, r2);
}
if(delta<0){
printf("\n\nIl delta e' minore di zero\n");
delta = -delta;
r1 = sqrt(delta)/(2*a);
printf("\nLa prima soluzione e': %.2lf + %.2lf i\n", -b/(2*a), r1);
printf("\nLa seconda soluzione e': %.2lf - %.2lf i\n", -b/(2*a), r1);
}
if(delta==0){
printf("\n\nIl delta e' uguale a zero\n");
r1 = (-b/(2*a));
printf("\nLe due soluzioni coincidono e sono: %.2lf\n", r1);
}
}
// se invece l'equazione è di primo grado
if(a==0){
printf("\nL'equazione e' di primo grado: %.2lfx", b);
if(c>=0)
printf(" + ");
printf(" %.2lf = 0", c);
if(b<0){ // Invertiamo i segni sia del coeff di x che del termine noto
b = -b;
c = -c;
}
r1 = -c/b;
printf("\nIl risultato dell'equazione di primo grado e': %.2lf\n", r1);
}
printf("\n\nArrivederci e grazie\n\n");
getchar();
getchar();
return 0;
}
Ma nel mio prog c'è già l'equazione di primo grado :p
Perchè rompe il cacchio sulla riga della radice?
#include <stdio.h>
#include <math.h>
main ()
{
float a, b, c, x1, x2, delta;
printf("Inserisci il valore di a:\n");
scanf("%f", &a );
printf("Inserisci il valore di b:\n");
scanf("%f", &b );
printf("Inserisci il valore di c:\n");
scanf("%f", &c );
printf("I valori da te inseriti sono:\t%f\t%f\t%f\n", a, b, c); // verifichiamo i valori inseriti
if ( a == 0 )
{
if ( b != 0 )
{
x1 = -c/b;
printf("Il risultato di quest'equazione di primo grado è:%f\t", x1 );
}
else
{
if ( c == 0 )
{
printf("L'equazione esiste per qualunque x uguale a 0\n");
}
else
{
printf("L'equazione non ha soluzioni\n");
}
}
}
else
{
delta = sqrt((b * b) - (4.0 * a * c ));
x1 = (-b + delta)/(2.0 * a);
x2 = (-b - delta)/(2.0 * a);
printf("Il primo risultato dell'equazione è: %f\n", x1);
printf("Il secondo risultato dell'equazione è: %f\n", x2);
}
}
wingman87
27-10-2009, 18:56
Forse hai passato dei valori di a, b e c tale che il delta è negativo e quindi la radice non può restituirti un valore corretto (non so cosa fa in questo caso)
Forse hai passato dei valori di a, b e c tale che il delta è negativo e quindi la radice non può restituirti un valore corretto (non so cosa fa in questo caso)
No, l'errore lo da in fase di compilazione
A me lo compila perfettamente, puoi scrivere che errore ti da?
A me lo compila perfettamente, puoi scrivere che errore ti da?
Ti compila il mio codice sorgente?
Cmq a me da questa cosa qua:
/tmp/ccNcl3ea.o: In function `main':
merda.c:(.text+0x140): undefined reference to `sqrt'
collect2: ld returned 1 exit status
Non so nemmeno cosa voglia dire...
wingman87
27-10-2009, 22:38
Anche a me compila, il messaggio di errore significa che non trova la definizione di sqrt, ma dovrebbe farlo visto che hai incluso math.h
Come compili? Sei su windows o su linux (o altro...)?
Anche a me compila, il messaggio di errore significa che non trova la definizione di sqrt, ma dovrebbe farlo visto che hai incluso math.h
Come compili? Sei su windows o su linux (o altro...)?
Si, compilo da linux :)
è su linux o almeno sta usando gcc o qualche suo porting (dato che ld è il linker del progetto GNU). l'errore te lo da non il compilatore ma il linker, cioè il programma che si occupa di collegare fra loro tutti i moduli oggetto "risolvendo" i simboli... in questo caso non riesce a risolvere il simbolo sqrt, ovvero non trova nessun modulo (di libreria) da associare alla funzione sqrt, ovvero in pratica non trova l'implementazione compilata della funzione di libreria sqrt... sqrt è in math.h, ovvero devi linkare la libreria dinamica libm.so, che si fa semplicemente fornendo il parametro -lm in compilazione. :D (su linux, su MinGW non ho mai provato) :D
Ok, ho dato un:
gcc nomefile.c -lm -o nomefile E ha funzionato
Ma perchè succede questa cosa? Perchè si verifica questo problema?
non è un "problema"... semplicemente devi fornire al compilatore esplicitamente il nome della libreria in cui andare a cercare le implementazioni delle funzioni che hai usato ma che non hai implementato tu (in questo caso, la sqrt). in particolare tale implementazione si trova in libm.so, per cui tu devi fornire esplicitamente al compilatore tramite il parametro -l di andare a linkare anche la libreria libm.so: devi togliere il prefisso lib e il suffisso .so, ti rimae solo m che vai ad aggiungere a -l : -lm :D
Si ma se non è un problema perchè su windows non da errori e va senza problemi?
wingman87
28-10-2009, 15:28
In teoria dovrebbe compilare senza opzioni dappertutto perché math è una libreria standard. gcc su linux linka senza problemi tutte le librerie standard ad eccezione di math, ma non so dirti perché
In teoria dovrebbe compilare senza opzioni dappertutto perché math è una libreria standard. gcc su linux linka senza problemi tutte le librerie standard ad eccezione di math, ma non so dirti perché
Ah bene :muro:
ma su windows linki da linea di comando? perchè se intendi che va bene su windows su visual studio, visual studio deve comunque essere configurato per bene con gli include path e i path delle librerie... non è che è magico...
Ma altri utenti che seguono questo thread mi han detto che il mio codice sorgente, compilato su win, funziona perfettamente, non so se abbiano fatto truschini strani o cosa...
tra l'altro credo che si possa configurare gcc in modo da fargli linkare automaticamente anche libm.so... come di preciso non lo so... :D Ah ecco... Bho, se quando rompe le scatole basta mettere -lm per me non c'è problema!
wingman87
28-10-2009, 19:01
Ma altri utenti che seguono questo thread mi han detto che il mio codice sorgente, compilato su win, funziona perfettamente, non so se abbiano fatto truschini strani o cosa...
Su windows ho compilato e linkato da linea di comando semplicemente con
gcc -c prova.c
gcc prova.o
Su windows ho compilato e linkato da linea di comando semplicemente con
gcc -c prova.c
gcc prova.o
Ecco appunto!
Qualcuno mi spiega come si usa Nemiver?
Sto facendo un nuovo programma, nel quale, dato un vettore con dei numeri, devo farci varie operazioni sopra, tra cui ordinare i numeri in modo crescente.
Avevo intenzione di usare il metodo di ordinamento a bolle ( Bubble Sort ) che già avevo usato per VB, ma non riesco più a capirne il funzionamento e come trasferire il tutto in C... È un'ora che studio come farlo senza risultati :fagiano:
wingman87
08-11-2009, 17:37
Hai già scritto qualcosa? Sapresti descrivere l'algoritmo a parole?
Hai già scritto qualcosa? Sapresti descrivere l'algoritmo a parole?
Il funzionamento so com è, ovvero: l'algoritmo si preoccupa di confrontare i numeri a coppie. Supponiamo di voler ordinare un vettore in ordine crescente ( posizione 1 del vettore = numero più basso ).
Il bubble sorting inzia il confronto a coppie, controlla se il primo è maggiore del secondo, se si esegue uno scambio di posizioni. Il controllo a coppie sarà:
primo - secondo
secondo - terzo
terzo - quarto
...
...
penultimo - ultimo
Chiaramente, il valore che continua ad essere scambiato ( quello maggiore ) va a finire sempre più in fondo al vettore finchè non trova un numero più grande. Li il numero si ferma. Il ciclo riparte da 0 escludendo i valori già spostati ( che sono sicuramente già ordinati tra loro, in fondo al vettore e maggiori degli altri ).
Credo di dover usare 3 variabili, un indice primario ( che è quello che uso per tutte le altre operazioni - somma, media, massimo, minimo ecc... ), un indice secondario ( che devo capire ancora come usarlo ) e un'altra variabile in cui tenere temporaneamnete il valore da scambiare.
Credo di dover usare anche 2 for, uno dentro l'altro, ma non sono riuscito a capire quali sono le condizioni da dare al for ( la i da dove deve partire e dove si deve fermare? E la j [ secondo indice ]? )...
wingman87
08-11-2009, 18:35
Ok, una volta descritto l'algoritmo a parole puoi concentrarti sull'implementazione seguendo ciò che hai scritto:
- devi fare il confronto a coppie tra un valore e il successivo:
if(array[i]>array[i+1]){
...scambia...
}
- il ciclo parte sempre da zero, ma ogni volta si ferma un elemento prima:
for(i=0;i<fine;i++){
...effettui i confronti...
}
fine--;
...rifai il ciclo...
- quanto vale inizialmente fine? E quando ti devi fermare?
Ok, una volta descritto l'algoritmo a parole puoi concentrarti sull'implementazione seguendo ciò che hai scritto:
- devi fare il confronto a coppie tra un valore e il successivo:
if(array[i]>array[i+1]){
...scambia...
}
- il ciclo parte sempre da zero, ma ogni volta si ferma un elemento prima:
for(i=0;i<fine;i++){
...effettui i confronti...
}
fine--;
...rifai il ciclo...
- quanto vale inizialmente fine? E quando ti devi fermare?
Bhe fine dovrebbe valere quanto la grandezza del vettore ( nel mio caso è un vettore a 10, quindi fine dovrebbe essere inizialmente 10 ). Si dovrebbe fermare quando i è uguale a fine, o no?
wingman87
08-11-2009, 19:01
L'inizializzazione va bene, la condizione di terminazione non proprio, prova a pensarci ancora su.
Fatto questo scrivere il ciclo più esterno è semplice no? Hai l'inizializzazione, la condizione di fine... non manca nulla
L'inizializzazione va bene, la condizione di terminazione non proprio, prova a pensarci ancora su.
Fatto questo scrivere il ciclo più esterno è semplice no? Hai l'inizializzazione, la condizione di fine... non manca nulla
Non capisco cosa c'è che non quadra... Il ciclo deve andare avanti finchè "fine" non è più maggiore di i . Diminure "fine" fuori dal ciclo che senso ha? Se già aumento i di uno ad ogni passaggio
wingman87
09-11-2009, 13:00
fine viene decrementato nel ciclo piu' esterno, non nello stesso in cui incrementi i... Quando ti chiedevo la condizione di terminazione mi riferivo a quella del ciclo piu' esterno, quella di quello piu' interno l'abbiamo gia' scritta
for(i=0;i<fine;i++){
...effettui i confronti...
}
fine--;
...rifai il ciclo...
fine viene decrementato nel ciclo piu' esterno, non nello stesso in cui incrementi i... Quando ti chiedevo la condizione di terminazione mi riferivo a quella del ciclo piu' esterno, quella di quello piu' interno l'abbiamo gia' scritta
for(i=0;i<fine;i++){
...effettui i confronti...
}
fine--;
...rifai il ciclo...
Partiamo dal fatto che se ci metti un fine-- ci sarà un ciclo while. Che fine debba essere maggiore di 1?
while ( fine > 1 ){
for....{}
}
wingman87
09-11-2009, 18:59
Ok, a logica ci stai, forse qualche indice di fine e di inizializzazione va corretto ma inizia a scrivere il codice completo e a testarlo, poi se ci sono problemi che non riesci a risolvere posta ancora.
Bene, ti ringrazio dell'aiuto, sono riuscito a far funzionare l'ordinamento, questo è il codice completo del programma:
#include <stdio.h>
#define N 10
main()
{
int marks[N];
int mark = 0, i = 0, mean = 0, sum = 0, max = 0, min, tmp = 0, end = N;
/* Insert marks*/
printf("Insert 10 marks\n");
for ( i=0; i < N; i++)
{
scanf("%d", &mark);
marks[i] = mark;
}
/* Order marks section */
while ( end > 1)
{
for ( i=0; i < N; i++)
{
if ( marks[i] > marks[i+1] )
{
tmp = marks[i];
marks[i] = marks[i+1];
marks[i+1] = tmp;
}
}
end--;
}
/* Compute sum and mean then print them */
for ( i=0; i < N; i++)
{
sum = sum + marks[i];
}
mean = sum / N;
/* Compute maximum and minimum */
for ( i = 0; i < N; i++)
{
if ( marks[i] > max )
{
max = marks[i];
}
if ( marks[i] < min )
{
min = marks[i];
}
}
printf("Sum: %d\n", sum);
printf("Mean: %d\n", mean);
printf("Max: %d\n", max);
printf("Min: %d\n", min);
printf("Order: ");
for ( i = 0; i < N; i++)
{
printf("%d ", marks[i]);
}
}
Se avete dei suggerimenti dal punto di vista della codifica per migliorare la stesura del codice sono, ovviamente, ben accetti! :D
wingman87
10-11-2009, 00:02
Puoi ottimizzarlo così:
#include <stdio.h>
#define N 10
int main() {
int marks[N];
int mark = 0, i = 0, mean = 0, sum = 0, max = 0, min, tmp = 0, end = N-1;
/* Insert marks*/
printf("Insert 10 marks\n");
for ( i=0; i < N; i++) {
scanf("%d", &mark);
marks[i] = mark;
}
/* Order marks section */
while ( end > 0) {
for ( i=0; i < end; i++) {
if ( marks[i] > marks[i+1] ) {
tmp = marks[i];
marks[i] = marks[i+1];
marks[i+1] = tmp;
}
}
end--;
}
/* Compute sum and mean then print them */
for ( i=0; i < N; i++) {
sum = sum + marks[i];
}
mean = sum / N;
/* Compute maximum and minimum */
for ( i = 0; i < N; i++) {
if ( marks[i] > max ) {
max = marks[i];
}
if ( marks[i] < min ) {
min = marks[i];
}
}
printf("Sum: %d\n", sum);
printf("Mean: %d\n", mean);
printf("Max: %d\n", max);
printf("Min: %d\n", min);
printf("Order: ");
for ( i = 0; i < N; i++) {
printf("%d ", marks[i]);
}
}
Inoltre potresti aggiungere un controllo che se non vengono effettuati scambi dopo un intero ciclo for puoi terminare l'ordinamento perché significa che è già ordinato.
Puoi ottimizzarlo così:
#include <stdio.h>
#define N 10
int main() {
int marks[N];
int mark = 0, i = 0, mean = 0, sum = 0, max = 0, min, tmp = 0, end = N-1;
/* Insert marks*/
printf("Insert 10 marks\n");
for ( i=0; i < N; i++) {
scanf("%d", &mark);
marks[i] = mark;
}
/* Order marks section */
while ( end > 0) {
for ( i=0; i < end; i++) {
if ( marks[i] > marks[i+1] ) {
tmp = marks[i];
marks[i] = marks[i+1];
marks[i+1] = tmp;
}
}
end--;
}
/* Compute sum and mean then print them */
for ( i=0; i < N; i++) {
sum = sum + marks[i];
}
mean = sum / N;
/* Compute maximum and minimum */
for ( i = 0; i < N; i++) {
if ( marks[i] > max ) {
max = marks[i];
}
if ( marks[i] < min ) {
min = marks[i];
}
}
printf("Sum: %d\n", sum);
printf("Mean: %d\n", mean);
printf("Max: %d\n", max);
printf("Min: %d\n", min);
printf("Order: ");
for ( i = 0; i < N; i++) {
printf("%d ", marks[i]);
}
}
Inoltre potresti aggiungere un controllo che se non vengono effettuati scambi dopo un intero ciclo for puoi terminare l'ordinamento perché significa che è già ordinato.
Ok grazie. Per la cosa che se l'intero ciclo non riportava cambiamenti avevo intenzione di metterlo. Si tratta della storia del flag vero?
wingman87
10-11-2009, 14:05
Ok grazie. Per la cosa che se l'intero ciclo non riportava cambiamenti avevo intenzione di metterlo. Si tratta della storia del flag vero?
Sì
Penso di essere incappato in un problema che va oltre le mie conoscenze: le sequenze di fibonacci coi vettori.
Ho pensato che sarebbe stato bello poter fare in modo che il programma chiedesse in input la dimensione del vettore, ovviamente so che coi normali vettori ( o con le normali tecniche che a me sono state spiegate ) non è possibile assegnare una dimensione 'x' ad un vettore una volta che il programma è in esecuzione. Mi sono allora imbattuto in pointer, array definiti in modo strano ( con un * ) e robe simili.
La cosa credo sia abbastanza complicata viste le mie conoscenze, meglio lasciar stare?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.