DOMANDA Aiuto programmino in c

Pr0ves

Utente Attivo
172
1
CPU
i7-2600k@4.30 con Macho HR-02
Scheda Madre
MSI Z77A-G45
HDD
Samsung 830 128GB + Seagate Barracuda 1TB
RAM
Hyperam 3x4GB DDR3 1333Mhz 256x8DIMM
GPU
Gigabyte GTX 770 Windforce3 2GB
Monitor
LG Flatron M227WDP FullHD
PSU
XFX-550w
Case
Aerocool Xpredator Evil Black
OS
Win7 64 bit
Mi servirebbe un aiuto con questo programma
Codice:
#include <stdio.h>



main()
{
      int a,b,c;
      float delta,ris1,ris2;
      printf("##############################\n");
      printf("#Calcolo trinomio particolare#\n");
      printf("##############################\n\n\n");
      printf("ax^2+bx+c=0\n");
      printf("Scrivere l'incognita a: ");
      scanf("%d", &a);
      printf("Scrivere l'incognita b: ");
      scanf("%d", &b);
      printf("Scrivere l'incognita c: ");
      scanf("%d", &c);
      
      delta = b*b - 4*a*c;
      ris1 = (-b + (sqrt(delta)))/2*a;
      ris2 = (-b - (sqrt(delta)))/2*a;
      
      if(delta <= 0)
      {
               printf("Risultato impossibile perche' delta minore di zero\n");
      } else {
      printf("Il delta e' %f \n", delta);
      printf("Il primo risultato e': %f\n", ris1);
      printf("Il secondo risultato e': %f\n", ris2);
      }      
  
  system("PAUSE");	
  return 0;
}
Vorrei che se, per esempio, si scrive una lettera al posto di un numero intero quando chiedo di scrivere di far uscire tipo "Questo non è un numero" o "Operazione non possibile", ho provato con if e while (che in pratica hanno fatto la stessa cosa) ma non sono riuscito a tornare indietro.
 
U

Utente cancellato 68151

Ospite
Potresti prendere a, b, c come stringe (array di char) e utilizzare la funzione atoi() per poi convertirli in interi
guarda qui:
atoi() - Standard C String & Character - C Programming Reference - eLook.org
Perchè le stringhe? essendo array di caratteri (quindi sai e imponi una dimensione massima) puoi controllare carattere per carattere e verificare che sia un numero così:
Codice:
//num[lenght] è la tua stringa di caratteri


for(i = 0; i < length; i++) {
	if(num[i] < '0' || num[i] > '9') {
		printf("Non è un numero...");
		return -1;
	}
}


//return -1 fa terminare immediatamente il programma (è la stessa cosa di return 0)
 
Ultima modifica da un moderatore:

Pr0ves

Utente Attivo
172
1
CPU
i7-2600k@4.30 con Macho HR-02
Scheda Madre
MSI Z77A-G45
HDD
Samsung 830 128GB + Seagate Barracuda 1TB
RAM
Hyperam 3x4GB DDR3 1333Mhz 256x8DIMM
GPU
Gigabyte GTX 770 Windforce3 2GB
Monitor
LG Flatron M227WDP FullHD
PSU
XFX-550w
Case
Aerocool Xpredator Evil Black
OS
Win7 64 bit
Però se scrivo così, quando uno scrive un non numero il programma si chiude, se ho capito bene. Io vorrei tornare indietro al printf, usando tipo un ciclo for, non esiste un comando come return -1 che invece di chiudere fa ricominciare il ciclo?

- - - Updated - - -

Vorrei fare tipo
Codice:
[COLOR=#333333]for(i = 0; i < 10; i++) 
{
         printf("scrivi a\n");
         scanf("%d", a);
         if(a //diverso da un numero) 
        {
                  printf("Non è un numero\n");
                  //comando per ricominciare il ciclo
         } else {
             //comando per finire il ciclo e passare avanti
         }
}
                           
[/COLOR]
Questo codice di sicuro ha qualche errore, comunque sarebbe ripetuto per tre volte per chiedere a, b e c
il comando per dire a diverso da un numero non credo esista, aspetto un vostro consiglio.
Spero esista quello per ricominciare il ciclo mentre quello per finirlo credo sia break o continue.
 
Ultima modifica:

matteoc91

Utente Attivo
158
17
Questo dovrebbe fare al caso tuo ;)

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


#define DIM 10
#define SIZE 10


main(){


    int i,array[DIM];
    char str[SIZE];


    for(i=0; i<DIM; i++){
        
        do{
    
            printf("Digita l'elemento %d: ",i);
            scanf("%s",str);
        
        }while( strcmp(str,"0")!=0 && (array[i]=atoi(str))==0 );
    
    }
    
    for(i=0; i<DIM; i++){
    
        printf("ELEMENTO %d: %d\n",i,array[i]);
    
    }


}

Questo in sostanza è come puoi risolvere il tuo problema passando gli elementi all'interno di una stringa per poi convertirli in interi. Una volta che hai l'array caricato puoi fare tutto quello che ti pare :)
Ciao,
Matteo.
 

Pr0ves

Utente Attivo
172
1
CPU
i7-2600k@4.30 con Macho HR-02
Scheda Madre
MSI Z77A-G45
HDD
Samsung 830 128GB + Seagate Barracuda 1TB
RAM
Hyperam 3x4GB DDR3 1333Mhz 256x8DIMM
GPU
Gigabyte GTX 770 Windforce3 2GB
Monitor
LG Flatron M227WDP FullHD
PSU
XFX-550w
Case
Aerocool Xpredator Evil Black
OS
Win7 64 bit
Grazie per la risposta, sono ancora alle prime armi e riguardo gli array ancora non ho capito come usarli.
Con define dim/size hai dato a entrambi il valore di 10, credo, poi hai dichiarato le variabili i e l'array[DIM], che quindi sarebbe composto da 10 elementi (giusto?), e hai anche dichiarato il char str[size] che non so che è, poi hai creato il ciclo for che si ripete per 10 volte facendo il DO che, se ho capito bene, chiede all'utente di scrivere 10 variabili che costituiscono l'array. e per ogni elemento fa questo
( strcmp(str,"0")!=0 && (array=atoi(str))==0 )
di cui conosco solo && :D,
Il secondo ciclo for serve per stampare i 10 elementi dell'array, credo. Non ho capito come usarlo nel mio caso, colpa mia :D. Non potrei usare il comando GOTO? mettendo un identificatore prima di un ciclo for, tipo quello di devil? sempre dopo che ho imposto a, b e c come caratteri.
 

matteoc91

Utente Attivo
158
17
Grazie per la risposta, sono ancora alle prime armi e riguardo gli array ancora non ho capito come usarli.
Con define dim/size hai dato a entrambi il valore di 10, credo, poi hai dichiarato le variabili i e l'array[DIM], che quindi sarebbe composto da 10 elementi (giusto?), e hai anche dichiarato il char str[size] che non so che è, poi hai creato il ciclo for che si ripete per 10 volte facendo il DO che, se ho capito bene, chiede all'utente di scrivere 10 variabili che costituiscono l'array. e per ogni elemento fa questo
( strcmp(str,"0")!=0 && (array=atoi(str))==0 )
di cui conosco solo && :D,
Il secondo ciclo for serve per stampare i 10 elementi dell'array, credo. Non ho capito come usarlo nel mio caso, colpa mia :D. Non potrei usare il comando GOTO? mettendo un identificatore prima di un ciclo for, tipo quello di devil? sempre dopo che ho imposto a, b e c come caratteri.

Provo a spiegarlo (dimmi se qualcosa non è chiaro).
Supponiamo di dover caricare un vettore con 10 elementi che l'utente deve inserire. A questo punto se vogliamo fare il controllo sugli elementi inseriti possiamo appunto passarli prima su una stringa e poi all'array di conseguenza.

Io ho stabilito due define (è un po' come creare delle costanti), ovvero DIM e SIZE:
-DIM identifica la grandezza dell'array (nel nostro caso 10). Ho preferito definirla così in modo tale che se gli elementi fossero di più basterebbe cambiare il suo valore nella define e tutto funzionerebbe ugualmente.
-SIZE indica la grandezza della stringa che vogliamo usare. Ho messo 10 per pura casualità. Puoi mettere tranquillamente te quello che preferisci ;) Obv non uso solo caratteri perchè potremmo inserire numeri con più cifre.

Adesso veniamo al corpo del main.

Dichiarazione delle variabili.
Obv dobbiamo dichiarare l'array in cui inserire gli elementi che l'utente dovrà passarci, quindi definiamo larray di interi, int array[DIM] (DIM appunto identifica la dimensione del vettore).
A questo mi serve una variabile dove salvare temporaneamente i valori via via passati dall'utente, quindi definisco una stringa, char str[SIZE] (SIZE è la dimensione della stringa). Volendo puoi anche definirla in maniera dinamica come char* str e poi fare una malloc, puoi tranquillamente scegliere l'alternativa che preferisci: in questo caso avremo:
Codice:
char* str=(char *)malloc(sizeof(char));
L'indice i invece ci serve solo per il ciclo for.

Carichiamo l'array.
A questo punto abbiamo tutto quello che ci serve per caricare l'array con i valori passati dall'utente, quindi iniziamo il solito ciclo for in cui inizializzeremo le celle del vettore.
Quindi la prima cosa che bisogna fare e chiedere all'utente di passarci un valore da linea di comando, appunto con la printf; a questo punto dobbiamo salvare il valore che l'utente ci ha passato e per fare ciò abbiamo creato prima la variabile stringa di sopra (char str[SIZE]). Quindi con la scanf possiamo inserire il valore passato all'interno della stessa. A questo punto però dobbiamo fare un controllo, ovvero dobbiamo controllare che l'utente effettivamente abbia passato un intero. Per fare ciò ci viene in aiuto una funzione di libreria del C, ovvero atoi; in sostanza questa funzione della libreria stdlib.h del C prende il valore della stringa e se questi è un intero lo fa tornare come risultato della funzione, altrimenti ritorna 0. Il problema è che lo 0 per noi è un valore intero valido quindi prima di tutto dobbiamo chiederci se la stringa passato non sia 0, ovvero imponiamo due condizioni diverse. Per confrontare il valore di 2 stringhe anche qua sfruttiamo una funzione di libreria del C, strcmp, la quale restituisce un valore pari a 0 se le 2 stringhe sono uguali. Avremo quindi:
Codice:
if( strcmp(str,"0")!=0 ) ...
per controllare se la stringa passata è effettivamente diversa da 0, e:
Codice:
array[i]=atoi(str);
if(array[i]==0) ...

/*
che può essere riscritto in un unica volta come
if( (array[i]=atoi(str))==0 ) ...
*/
per controllare se ciò che l'utente passa è effettivamente un numero intero.

Se queste due condizioni sono verificate significa che l'utente ha passato un valore diverso da 0, ma che non è un intero, quindi deve reinserire. Il problema è che potrebbe reinserire un valore non valido quindi dobbiamo creare un ciclo che continui finchè l'utente non dicita un valore accettabile, ovvero:
Codice:
printf("...");
scanf("%s",str);
array[i]=atoi(str);

while( strcmp(str,"0")!=0 && array[i]==0 ){
      printf("...");
      scanf("%s",str);
      array[i]=atoi(str);
}
Che può essere riscritto in maniera più leggibile come:
Codice:
do{
      printf("...");
      scanf("%s",str);
}while( strcmp(str,"0")!=0 && (array[i]=atoi(str))==0 );
Di fatti così facendo l'indice i non avanza perchè questi viene solo incrementato dal ciclo for e finchè l'utente non inserisce un valore correto non si va avanti.
NOTA: la prima condizione è fondamentale (parliamo di strcmp) perchè se l'utente inserisce 0 la seconda condizione è verificata e quindi non si va avanti col ciclo for (in poche parole 0 non verrebbe accettato).

Stampiamo l'array.
L'ultima parte del programma serve semplicemente per visualizzare l'array così ottenuto.
 

Pr0ves

Utente Attivo
172
1
CPU
i7-2600k@4.30 con Macho HR-02
Scheda Madre
MSI Z77A-G45
HDD
Samsung 830 128GB + Seagate Barracuda 1TB
RAM
Hyperam 3x4GB DDR3 1333Mhz 256x8DIMM
GPU
Gigabyte GTX 770 Windforce3 2GB
Monitor
LG Flatron M227WDP FullHD
PSU
XFX-550w
Case
Aerocool Xpredator Evil Black
OS
Win7 64 bit
E io che volevo solo scrivere "Questo non è un numero" :D
Comunque grazie per la spiegazione, credo sia stata molto chiara.
Per l'array potrei farlo di 3 poiche mi servono solo 3 variabili. Poi faccio il ciclo FOR per far inserire queste 3 dall'utente, e nel frattempo c'é il WHILE con ATOI per riconoscere se ció che è stato inserito è un intero; ogni volta che chiede le variabili stampa tipo "Inserire variabile 1:" "Inserire variabile 2:" non c'è un modo per inserire le lettere al posto dei numeri? So che è da pignoli ma è per far capire meglio ció che si deve inserire; poi io volevo aggiungere "Questo non è un numero", era l'obiettivo principale, se aggiungo tra parentesi graffe , dopo il WHILE, un IF appunto per stampare quello, funzionerebbe?.
Il secondo ciclo, che stampa gli elementi dell'array, non sarebbe inutile? Cioè per quello che mi serve. Dopo che sono state inserite le variabili, le dovrei inserire nell'operazione, e qui non so come fare, e poi stampare i risultati.
Grazie per l'aiuto.
 

matteoc91

Utente Attivo
158
17
Andiamo con ordine :)
non c'è un modo per inserire le lettere al posto dei numeri?
L'unico modo che mi viene in mente è scrivere una relativa funzione, i.e.:
Codice:
char* toString(int val)  // In sostanza la funzione prende come argomento il relativo numero e ne restituisce la relativa stringa
{
   switch(val){    // Se non sai come funziona il costrutto switch puoi anche usare una serie di if obv
      case 0:
         return "zero";
         break;
      case 1:
         return "uno";
         break;
      case 2:
         return "due";
         break;
........
   }
}
Di conseguenza quando stampi la printf avrai qualcosa del tipo:
Codice:
printf( "Digita l'elemento %s: ",toString(i) );
poi io volevo aggiungere "Questo non è un numero", era l'obiettivo principale, se aggiungo tra parentesi graffe , dopo il WHILE, un IF appunto per stampare quello, funzionerebbe?.
Puoi ad esempio prendere il primo esempio che ti ho fatto con il ciclo while (quindi non prendere il do-while) e stampare la frase all'interno del ciclo stesso, ovvero:
Codice:
printf("...");
scanf("%s",str);
array[i]=atoi(str);

while( strcmp(str,"0")!=0 && array[i]==0 ){
      printf("Questo non è un numero, ridigita: ");
      scanf("%s",str);
      array[i]=atoi(str);
}
In sostanza la prima volta che richiede un numero non mette nessuna avvertenza, mentre se entra nel ciclo while è perchè l'utente ha inserito un valore non previsto e quindi deve ridigitarlo.
Il secondo ciclo, che stampa gli elementi dell'array, non sarebbe inutile? Cioè per quello che mi serve. Dopo che sono state inserite le variabili, le dovrei inserire nell'operazione, e qui non so come fare, e poi stampare i risultati.
Si si, obv non ti serve a nulla. Era solo per far vedere cosa veniva salvato all'interno dell'array ;)
 

Pr0ves

Utente Attivo
172
1
CPU
i7-2600k@4.30 con Macho HR-02
Scheda Madre
MSI Z77A-G45
HDD
Samsung 830 128GB + Seagate Barracuda 1TB
RAM
Hyperam 3x4GB DDR3 1333Mhz 256x8DIMM
GPU
Gigabyte GTX 770 Windforce3 2GB
Monitor
LG Flatron M227WDP FullHD
PSU
XFX-550w
Case
Aerocool Xpredator Evil Black
OS
Win7 64 bit
Grazie di nuovo :D
Un'ultima domanda, come inserisco le variabili degli array nelle operazioni?
per esempio queste sono le operazioni
Codice:
delta = b*b - 4*a*c;
      ris1 = (-b + (sqrt(delta)))/2*a;
      ris2 = (-b - (sqrt(delta)))/2*a;
Come scelgo i vari elementi degli array? scrivendo array[1]? e quindi poi sarebbe

Codice:
delta = array[2]*array[2] - 4*array[1]*array[3];
ris1 = (-array[2] + (sqrt(delta)))/2*array[1];
ris2 = (-array[2] - (sqrt(delta)))/2*array[1];
Così è giusto?
 

matteoc91

Utente Attivo
158
17
Se ti servono quelle 3 variabili si, puoi scriverle in quel modo, oppure se vuoi puoi fare una cosa un po' diversa ed utilizzare di nuovo le define, ovvero puoi scrivere prima del main:
Codice:
#define A 0
#define B 1
#define C 2
In questo modo potrai riferirti agli elementi dell'array in maniera più comoda come array[A], array e array[C] (ricorda solo che gli elementi dell'array partono da 0 e non da 1).

In alternativa se ti servono sempre e solo 3 variabili puoi fare a meno dell'array e dichiarare tre variabili intere, ovvero int a, b, c; :)
Poi quando vuoi inizializzarle basta che utilizzi un metodo esterno, i.e.
Codice:
int initVar(){

   char str[SIZE];
   int temp;

   printf("DIgita il valore della variabile: ");
   scanf("%s",str);
   temp=atoi(str);

   while( strcmp(str,"0")!=0 && temp==0 ){
      printf("Hai digitato un valore non numerico, ridigita: ");
      scanf("%s",str);
      temp=atoi(str);
   }

   return temp;

}
In questo modo avresti un metodo unico per le tue variabili, dopo di che nel main puoi scrivere:
Codice:
main(){

   int a,b,c;

   a=initVar();
   b=initVar();
   c=initVar();

   ...........

}
Così hai le variabile caricate e puoi farci quello che vuoi ;)

Volendo puoi scriverlo come metodo esterno anche per l'array così avresti nel ciclo for una cosa tipo:
Codice:
for(i=0; i<DIM; i++) array[i]=initVar();
Con initVar() uguale a quello di sopra. Se vuoi indicare il numero dell'elemento da inserire puoi passarglielo come argomento e modificare la printf nel metodo di sopra ;)
 

Pr0ves

Utente Attivo
172
1
CPU
i7-2600k@4.30 con Macho HR-02
Scheda Madre
MSI Z77A-G45
HDD
Samsung 830 128GB + Seagate Barracuda 1TB
RAM
Hyperam 3x4GB DDR3 1333Mhz 256x8DIMM
GPU
Gigabyte GTX 770 Windforce3 2GB
Monitor
LG Flatron M227WDP FullHD
PSU
XFX-550w
Case
Aerocool Xpredator Evil Black
OS
Win7 64 bit
Per ora proveró il primo metodo, definendo a, b e c, poi cercherò di usare il secondo.
Grazie sempre per le risposte.
 

Pr0ves

Utente Attivo
172
1
CPU
i7-2600k@4.30 con Macho HR-02
Scheda Madre
MSI Z77A-G45
HDD
Samsung 830 128GB + Seagate Barracuda 1TB
RAM
Hyperam 3x4GB DDR3 1333Mhz 256x8DIMM
GPU
Gigabyte GTX 770 Windforce3 2GB
Monitor
LG Flatron M227WDP FullHD
PSU
XFX-550w
Case
Aerocool Xpredator Evil Black
OS
Win7 64 bit
Questo è il codice finale
Codice:
#include <stdio.h>#include <stdlib.h>
#define DIM 3
#define SIZE 3
#define A 0
#define B 1
#define C 2


main()
{
      int i, array[DIM];
      char str[SIZE];   
      float delta,ris1,ris2;
      printf("##############################\n");
      printf("#Calcolo trinomio particolare#\n");
      printf("##############################\n\n\n");
      printf("ax^2+bx+c=0\n");
      
      char* toString(int val)
      {
            switch(val){
             case 0:
                  return "A";
                  break;
             case 1:
                  return "B";
                  break;
             case 2:
                  return "C";
                  break;
            }
      } 
      for(i=0;i<DIM;i++)
      {
         printf("Digita %s: ",toString(i));
         scanf("%s", str);
         array[i]=atoi(str);
         
         while(strcmp(str,"0")!=0 && array[i]==0)
         {
            printf("Questo non e' un numero, ridigita: ");
            scanf("%s",str);
            array[i]=atoi(str);
         }
      }
            
      delta = array[B]*array[B] - 4*array[A]*array[C];
      ris1 = (-array[B] + (sqrt(delta)))/(2*array[A]);
      ris2 = (-array[B] - (sqrt(delta)))/(2*array[A]);
      
      if(delta <= 0)
      {
               printf("Risultato impossibile perche' Delta minore di zero\n");
      } else {
      printf("Delta=b^2-4ac \n %d*%d-4*%d*%d=%f\n", array[B],array[B],array[A],array[C],delta);
      printf("Il delta e' %f \n", delta);
      printf("Risultati:\n x=(-b+-sqrt(delta))/2*a=(-%d+-sqrt(%f))/2*%d\n", array[B],delta,array[A]);
      printf("x1=%f\n", ris1);
      printf("x2=%f\n", ris2);
      }
  system("PAUSE");    
  return 0;
}
Funge benissimo :D, non che avessi dubbi. Per il prossimo programma/esercizio vorrei farne uno come questo però con le disequazioni, in tal caso la prima parte andrebbe bene, bisognerebbe cambiare solo le formule, il problema sta nel riconoscere il segno maggiore/minore/magg.uguale/min.uguale.
 

matteoc91

Utente Attivo
158
17
Molto bene, l'unica cosa il metodo toString è meglio se lo scrivi fuori dal main, così diventa più comprensibile il codice, ovvero:
Codice:
.......
char* toString(int val);

main(){
...........
}

char* toString(int val){
   switch(val){
      case 0:
         return "A";
         break;
      case 1:
         return "B";
         break;
      case 2:
         return "C";
         break;
   }
}
 

Pr0ves

Utente Attivo
172
1
CPU
i7-2600k@4.30 con Macho HR-02
Scheda Madre
MSI Z77A-G45
HDD
Samsung 830 128GB + Seagate Barracuda 1TB
RAM
Hyperam 3x4GB DDR3 1333Mhz 256x8DIMM
GPU
Gigabyte GTX 770 Windforce3 2GB
Monitor
LG Flatron M227WDP FullHD
PSU
XFX-550w
Case
Aerocool Xpredator Evil Black
OS
Win7 64 bit
il toString con lo switch non lo dovrei mettere prima del main? o è la stessa cosa? Comunque come potrei fare per le disequazioni? nell'array non lo posso inserire, devo dichiarare un char (tipo char segno) e poi mettere una serie di if tipo
Codice:
if (segno == '<') //non so se è giusto
{   
      printf(...)
//etc
}
oppure usare uno switch come hai fatto tu.
Con questo metodo si potrebbe procedere?
 
Ultima modifica:

matteoc91

Utente Attivo
158
17
il toString con lo switch non lo dovrei mettere prima del main? o è la stessa cosa?
Se dichiari il metodo prima del main (come nell'esempio) non importa se lo sviluppi prima o dopo :)
Comunque come potrei fare per le disequazioni? nell'array non lo posso inserire, devo dichiarare un char (tipo char segno) e poi mettere una serie di if tipo
Codice:
if (segno == '<') //non so se è giusto
{   
      printf(...)
//etc
}
oppure usare uno switch come hai fatto tu.
Con questo metodo si potrebbe procedere?
Non ho capito cosa devi fare con le disequazioni...
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili