problema con linguaggio c

Pubblicità

katesweet

Utente Attivo
Messaggi
7
Reazioni
0
Punteggio
24
salve a tutti..sono alle prime armi con il linguaggio c...volevo scrivere un programma che mi facesse il prodotto di due numeri(che inserisco io da tastiera),fin quando il loro prodotto sia minore di 36.
solo che il programma mi fa tutto il contrario.
esegue solo il prodotto di due numeri il cui risultato è > 36 e ci aggiunge pure un'unita.
ecco quello che ho scritto,dove è il problema?


#include<stdio.h>
#include<iostream>


int main (){
int add1;
int add2;
int moltiplicazione=36;
int i;


printf("Immetti il primo numero\n");
scanf("%d", &add1);
printf("Immetti il secondo numero\n");
scanf("%d", &add2);

for(i=0; i<= moltiplicazione;i++) {
i=add1*add2;
}
printf("il risultato è %d\n",i);
system("PAUSE");
return 0;
}
 
Codice:
for(i=0; i<= moltiplicazione;i++) {
    i=add1*add2;
}

Il problema sta nel ciclo for; supponiamo che tu abbia dato in input i valori 2 e 3, contenuti rispettivamente in add1 e add2. Ora facciamo quello che viene comunemente chiamato tracing, ossia simuliamo manualmente l'esecuzione del ciclo:

Inizio: i = 0

0 <= 36, quindi eseguiamone il corpo:

i = 2 * 3 = 6

Ora viene eseguita l'operazione di incremento:

i++ -> i = 7

Controllo della condizione: 7 <= 36 -> eseguiamo il corpo del ciclo:

i = 2 * 3 = 6

Incremento:

i++ -> i = 7

Controllo della condizione: 7 <= 36 -> eseguiamo il corpo del ciclo:

...

E così via! Il problema è dato dal fatto che non uscirai mai dal ciclo for, in quanto, con questo esempio, i raggiunge al massimo il valore 7 <= 36, e quindi la condizione di terminazione del ciclo non sarà mai falsa :)
 
salve a tutti..sono alle prime armi con il linguaggio c...volevo scrivere un programma che mi facesse il prodotto di due numeri(che inserisco io da tastiera),fin quando il loro prodotto sia minore di 36.
solo che il programma mi fa tutto il contrario.
esegue solo il prodotto di due numeri il cui risultato è > 36 e ci aggiunge pure un'unita.
ecco quello che ho scritto,dove è il problema?


#include<stdio.h>
#include<iostream>


int main (){
int add1;
int add2;
int moltiplicazione=36;
int i;


printf("Immetti il primo numero\n");
scanf("%d", &add1);
printf("Immetti il secondo numero\n");
scanf("%d", &add2);

for(i=0; i<= moltiplicazione;i++) {
i=add1*add2;
}
printf("il risultato è %d\n",i);
system("PAUSE");
return 0;
}
E' sbagliata proprio la logica del for...
In questo caso non va utilizzato un for ma un while...

Codice:
#include<stdio.h>
#include<stdlib.h>
 
 
int main (){
 
int add1;
int add2;
int prodotto;
 
printf("Immetti il primo numero\n");
scanf("%d", &add1);
printf("Immetti il secondo numero\n");
scanf("%d", &add2);
 
prodotto = add1*add2;
 
while(prodotto < 36)
       prodotto = prodotto + add1*add2;
}
 
printf("Il risultato è: %d \n", prodotto);
 
system("PAUSE"); /*solo se usi windows puoi fare la system("PAUSE")*/
}

Come ho fatto io, in pratica ti prendi in input i due numeri, li moltiplichi e metti il loro prodotto in prodotto. Se è minore di 36, allora entri nel ciclo while e fai il prodotto fin quando il prodotto è minore di 36. Appena è 36 esce e stampa il prodotto. Se prima del while il prodotto è > 36, allora non effettua nemmeno il ciclo e ti stampa direttamente il prodotto.

Non puoi usare il for a causa del fatto che tu non sai quando otterrai un prodotto che sarà maggiore di 36 per uscire dal ciclo. Quando non sai quando si verificherà un certo valore in genere non si usa il for ma il do-while o il while.
In questo caso un controllo in testa del while ci permette di evitare anche il ciclo del while quando il prodotto è > 36 mentre se è minore entra.

Spero di essere stato chiaro :)

Ciao! :)
 
Ultima modifica:
In realtà il tuo ha lo stesso identico problema... loop infinito: prova con input 2 e 3 a fare il tracing :)

Più che altro, visto che il testo non è chiarissimo, suppongo che quello che tu voglia fare sia:

* leggi due numeri;
* esegui il prodotto;
* se prodotto <= 36, ricomincia.

Anche perché non ha senso continuare a rifare il prodotto tra gli stessi numeri... se era minore o uguale a 36 prima, continuerà ad esserlo :)
Il codice che risolve il problema che ti ho appena descritto è il seguente:

Codice:
#include <stdlib.h>
#include <stdio.h>
#define MIN_PRODOTTO 36

int main() {
  int fat1, fat2, prodotto;

  do {
    printf("Introduci il primo fattore -> ");
    scanf("%d", &fat1);
    printf("Introduci il secondo fattore -> ");
    scanf("%d", &fat2);
    prodotto = fat1 * fat2;
  } while(prodotto <= MIN_PRODOTTO);
  printf("Il risultato è %d\n", prodotto);
  getchar();
  return 0;
}
 
In realtà il tuo ha lo stesso identico problema... loop infinito: prova con input 2 e 3 a fare il tracing :)

Più che altro, visto che il testo non è chiarissimo, suppongo che quello che tu voglia fare sia:

* leggi due numeri;
* esegui il prodotto;
* se prodotto <= 36, ricomincia.

Anche perché non ha senso continuare a rifare il prodotto tra gli stessi numeri... se era minore o uguale a 36 prima, continuerà ad esserlo :)
Il codice che risolve il problema che ti ho appena descritto è il seguente:

Codice:
#include <stdlib.h>
#include <stdio.h>
#define MIN_PRODOTTO 36
 
int main() {
  int fat1, fat2, prodotto;
 
  do {
    printf("Introduci il primo fattore -> ");
    scanf("%d", &fat1);
    printf("Introduci il secondo fattore -> ");
    scanf("%d", &fat2);
    prodotto = fat1 * fat2;
  } while(prodotto <= MIN_PRODOTTO);
  printf("Il risultato è %d\n", prodotto);
  getchar();
  return 0;
}


Veramente ho dimenticato di aggiungere prodotto = prodotto + add1*add2.
Come stava andava il loop. Non l'ho provato prima di postarlo, ora ho visto che ho mancato alla variabile sommatrice il prodotto + add1*add2.
Comunque a quanto ho capito io, lui vuole che affinchè non si raggiunge 36 vengano moltiplicati i due numeri e sommati in una variabile in modo da uscire a 36.
Così ho capito.
 
allora voglio scrivere un programma che mi faccia il prodotto di due numeri (che inserisco io tramite tastiera) solo se questo prodotto è minore di 36.
 
ragazzi se utilizzo questo codice quà:
#include<stdio.h>
#include<stdlib.h>


int main (){

int add1;
int add2;
int prodotto;

printf("Immetti il primo numero\n");
scanf("%d", &add1);
printf("Immetti il secondo numero\n");
scanf("%d", &add2);

prodotto = add1*add2;

while(prodotto < 36){
prodotto = add1*add2;
}

printf("Il risultato è: %d \n", prodotto);

system("PAUSE");
}

mi esegue il programma solo se il prodotto dei numeri che inserisco è > 36...
 
E se il prodotto non è minore di 36 cosa deve fare? Rileggere i numeri o uscire e basta?

Ad ogni modo, riguardo il programma che hai postato te, se il prodotto è inferiore a 36 va in loop infinito, per lo stesso identico motivo per cui non funzionava il codice che hai postato la prima volta... il prodotto tra due numeri è sempre quello, puoi eseguirlo quante volte vuoi ma non cambierà mai, quindi se entri nel ciclo non ne esci più... Simuliamo l'esecuzione con add1 = 2 e add2 = 3:

Codice:
prodotto = add1*add2;  //1

while(prodotto < 36){    //2
prodotto = add1*add2;  //3
}

Viene eseguita l'istruzione 1: prodotto = 2 * 3 = 6
Viene valutata la condizione del while (2): prodotto == 6 < 36 -> viene eseguita l'istruzione contrassegnata dal 3: prodotto = 2 * 3 = 6
Viene valutata la condizione del while (2): prodotto == 6 < 36 -> viene eseguita l'istruzione contrassegnata dal 3: prodotto = 2 * 3 = 6
etc etc etc...
 
E se il prodotto non è minore di 36 cosa deve fare? Rileggere i numeri o uscire e basta?

Ad ogni modo, riguardo il programma che hai postato te, se il prodotto è inferiore a 36 va in loop infinito, per lo stesso identico motivo per cui non funzionava il codice che hai postato la prima volta... il prodotto tra due numeri è sempre quello, puoi eseguirlo quante volte vuoi ma non cambierà mai, quindi se entri nel ciclo non ne esci più... Simuliamo l'esecuzione con add1 = 2 e add2 = 3:

Codice:
prodotto = add1*add2;  //1
 
while(prodotto < 36){    //2
prodotto = add1*add2;  //3
}

Viene eseguita l'istruzione 1: prodotto = 2 * 3 = 6
Viene valutata la condizione del while (2): prodotto == 6 < 36 -> viene eseguita l'istruzione contrassegnata dal 3: prodotto = 2 * 3 = 6
Viene valutata la condizione del while (2): prodotto == 6 < 36 -> viene eseguita l'istruzione contrassegnata dal 3: prodotto = 2 * 3 = 6
etc etc etc...

Alla fine occorre prima cosa la chiarezza...
 
Pubblicità
Pubblicità
Indietro
Top