PDA

Visualizza la versione completa : Problema semplice programma in C


jac22v
22-03-2012, 21:15
Salve a tutti, sto iniziando a studiare il C e questo un esercizio che consiste nel creare un programma con 3 numeri dati, il programma moltiplica i primi due e li divide per il terzo. poi da vari messaggi nel caso il terzo sia minore di zero o i primi due numeri siano negativi...
Purtroppo mi da errore, secondo voi dove ho sbagliato? :D
Questo il mio semplice programmino:



#include <stdio.h>

float Divisione (float x, float y, float z);

int main (int argc, char *argv[]) {
float a=3, b=3, c=2;
float soluzione= Divisione (a, b, c);
if (c!=0){
float Divisione (a, b, c);
printf ("%f*%f/%f e' uguale a %f\n" a, b, c, soluzione);
}
else if (c<0){
printf ("%f e' un numero negativo.\n" c);
}
else if (a&&b<0){
printf ("%f e %f sono numeri negativi.\n" a, b);
}
getchar();
return 0;
}

float Divisione (float x, float y, float z) {
return x*y/z;
}

ESSE-EFFE
22-03-2012, 21:21
Originariamente inviato da jac22v
Purtroppo mi da errore, secondo voi dove ho sbagliato? :D

Quale errore ti d? Quando posti del codice, usa i tag CODE.

jac22v
22-03-2012, 21:24
Ecco gli errori:


1>------ Build started: Project: Divisionecdiversodazero, Configuration: Debug Win32 ------
1>Build started 22/03/2012 20:24:36.
1>InitializeBuildStatus:
1> Touching "Debug\Divisionecdiversodazero.unsuccessfulbuild".
1>ClCompile:
1> Divisionecdiversodazero.cpp
1>c:\users\jac\documents\visual studio 11\projects\divisionecdiversodazero\divisionecdive rsodazero\divisionecdiversodazero.cpp(9): error C2078: too many initializers
1>c:\users\jac\documents\visual studio 11\projects\divisionecdiversodazero\divisionecdive rsodazero\divisionecdiversodazero.cpp(10): error C2146: syntax error : missing ')' before identifier 'a'
1>c:\users\jac\documents\visual studio 11\projects\divisionecdiversodazero\divisionecdive rsodazero\divisionecdiversodazero.cpp(10): error C2059: syntax error : ')'
1>c:\users\jac\documents\visual studio 11\projects\divisionecdiversodazero\divisionecdive rsodazero\divisionecdiversodazero.cpp(13): error C2146: syntax error : missing ')' before identifier 'c'
1>c:\users\jac\documents\visual studio 11\projects\divisionecdiversodazero\divisionecdive rsodazero\divisionecdiversodazero.cpp(13): error C2059: syntax error : ')'
1>c:\users\jac\documents\visual studio 11\projects\divisionecdiversodazero\divisionecdive rsodazero\divisionecdiversodazero.cpp(16): error C2146: syntax error : missing ')' before identifier 'a'
1>c:\users\jac\documents\visual studio 11\projects\divisionecdiversodazero\divisionecdive rsodazero\divisionecdiversodazero.cpp(16): error C2059: syntax error : ')'
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.08
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

ESSE-EFFE
22-03-2012, 21:31
Originariamente inviato da jac22v
Ecco gli errori:

Bene. Come vedi ci sono i numeri di riga e una breve spiegazione degli errori di compilazione. Quindi facile rintracciarli. Fondamentalmente ci sono due problemi, il primo questa "istruzione":


float Divisione (a, b, c);
che oltre ad essere sbagliata, direi che non serve a nulla (la funzione l'hai chiamata poco prima).

Il secondo, sono le varie printf che hai:


printf ("%f*%f/%f e' uguale a %f\n", a, b, c, soluzione);
Perch manca la virgola per separare il primo ed il secondo parametro.

jac22v
22-03-2012, 21:40
Grazie, ora funziona! :)

Avevo messo quella "istruzione" perch in un programma simile l'avevo messa e andava.



#include <stdio.h>

int Quadrato (int x);
int Cubo (int x);

int main (int argc, char *argv []) {
int n=6;
int xquadro = Quadrato (n);
int xcubo = Cubo (n);
if (n<6) {
Quadrato (n);
printf ("%d e' minore di 6 quindi il suo quadrato e': %d\n", n, xquadro);
}
else if (n>6) {
Cubo (n);
printf ("%d e' maggiore di 6 quindi il suo cubo e': %d\n", n, xcubo);
}
else {
printf ("Il numero e' 6, mi stai prendendo in giro?\n");
}
getchar();
return 0;

}

int Quadrato (int x) {
return x*x;
}

int Cubo (int x) {
return x*x*x;
}


In questa ripeto


Quadrato (n);

e non senza la "n" eppure andava, perch? XD

ramy89
22-03-2012, 21:44
#include <stdio.h>

float Divisione (float x, float y, float z);

int main (int argc, char *argv[]) {
float a=3, b=3, c=2;
float soluzione= Divisione (a, b, c);
if (fabs(c)>fabs(0.0+2.0e-10.0) ) // nota 1
{
float Divisione (a, b, c); // errore, stai ri-dichiarando la funzione in mezzo al main
printf ("%f*%f/%f e' uguale a %f\n" a, b, c, soluzione);
}
else if (c<0){
printf ("%f e' un numero negativo.\n" c);
}
else if (a&&b<0){
printf ("%f e %f sono numeri negativi.\n" a, b);
}
getchar();
return 0;


nota 1: I floating point vengono rappresentati con una certa precisione, che dipende
dal numero di bit che si usano per rappresentare la mantissa, ma anche dall' esponente, che pi alto, pi "sacrifica" la precisione.
Errore che pu aumentare con le varie operazioni che si fanno.
Allora c' un errore sul dato reale, per cui non si fa il confronto direttamente dicendo "if(c!=0)", ma si controlla che sia al di fuori da un certo intervallo, tipo [0,0+], dove 0+ "quasi zero".

A parte questi errori manca l' indentazione.
Dopo ogni graffa che si apre aggiungi 4 spazi, dopo ogni graffa che si chiude torni indietro di 4 spazi:


if(<condizione>)
{
<istruzioni>
<istruzioni>
}

ESSE-EFFE
22-03-2012, 21:52
Originariamente inviato da jac22v
In questa ripeto


Quadrato (n);

e non senza la "n" eppure andava, perch? XD
Beh prima di tutto inutile anche in questo caso. E poi qui la sintassi corretta, prima avevi messo il tipo e quindi in pratica era un ridefinizione. Attenzione anche ai confronti sui float (come ti hanno gi segnalato) e poi metterei per sicurezza un controllo su un'ipotetica divisione per zero.

jac22v
22-03-2012, 22:31
Ok, grazie :D

Loading