Blocco a runtime inatteso

di Anonimizzato20707 il
13 risposte
Salve a tutti sono uno studente ancora non esperto di programmazione volevo chiedermi quando faccio partire il mio programma non mi da nessun errore però quando uso l'interfaccia dell'utente e inizio ha mettere i dati dopo i primi due dati mi smette di funzionare e non so il motivo se qualcuno gentilmente può darmi una mano

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

int main(int argc, char*argv[]) /*main principale versione dev  */
 {
 	int Rx_vett[5];// inizializzazione variabile vettoriale
 	int indice;
 	int Rp=0;
	int Rs=0;
 	int somma=0;
 	int Rp1;
 	int Rp5;
   printf("\n Stiamo caricando il vettore devi inserire 5 numeri positivi \n");
   //richiesta per l'utente
    for(indice=0; indice<5; indice=indice +1)//inizio for 
    { 
                  printf("\n inserisci l'intero nella componente %d del vettore  ",indice);
                  
                  scanf("%d",& Rx_vett[indice]);
                  
                  printf("\n il valore della componente %d e' %d \n ", indice,Rx_vett[indice]);
                  somma = somma+Rx_vett[indice];
                 
				 Rp1 = 1/Rx_vett[indice];
                 
				  Rp5=1/Rp1;
                  Rp=Rp+Rp5;
                  
                   }//fine for 
                         
                       printf("\n il valore della resistenza in seire vale %d \n ", somma);     
                        printf("\n il valore della resistenza in parallelo vale %d \n ", Rp);
	system("PAUSE");
	return 0;

13 Risposte

  • Innanzitutto facciamo un pò di chiarezza...stai facendo confusione tra le librerie. iostream è una libreria usata in c++, quindi qui non c 'entra nulla. La variabile Rs non è utilizzata, non è grave ma è comunque uno spreco che puoi evitare, visto che l'hai rimpiazzata con somma. Veniamo al dunque. Nel codice fai delle divisioni,giusto? Ti sei chiesto cosa succederebbe se una delle tue componenti inserite fosse uguale a 0 ?
    Il risultato di una divisione tra interi è SEMPRE un intero ? Inoltre, dai una controllata al calcolo della resistenza in parallelo.
  • Ah, dimenticavo. I programmi non smettono mai di funzionare a caso!
  • E proprio il calcolo del parallelo che mi fa mandare in tilt il programma
  • Prova a rispondere alle mie domande di sopra!
  • Si sono tutte intere nel codice faccio delle divisioni
  • Allora prendi una calcolatrice, digita un qualsiasi numero e poi dividilo per 0. Poi digita queste due operazioni : 6 / 49 , 7 / 3 . Ti dice nulla tutto ciò ?
  • Un numero diviso per 0 e impossibile mentre i 2 calcoli sono dei float
  • Esatto! Quindi devi prevedere un controllo affinchè non avvenga una divisione per 0. In più ,devi modificare i tipi delle variabili da int a float, in modo tale da garantire correttezza nei calcoli. Cosi com 'è il risultato delle divisioni perde la mantissa. Nel calcolo del reciproco il programma crasha.
  • Grazie mille
  • Ma devo cambiare in float anche indice e il vettore e la somma ho basta che cambi solo il Rp,Rp1,Rp5?
  • L' indice sarà sempre e solo intero. Cosa vuol dire scrivere nella 0,5 cella del mio vettore?
    Comunque hai due possibilità: O trasformi il vettore in float ( io utilizzerei i double poichè sono a doppia precisione ) e di conseguenza anche la somma insieme ai tuoi Rp1........ oppure lasci intero sia il vettore che la variabile somma, ma sei costretto a castare esplicitamente i valori del vettore in float o double prima dell assegnamento ad Rp ( come nell'esempio )
    
    
    Rp1 += (1/(float) Rx_vett[indice]);
    
    
    Credo sia più pulito il primo modo.
  • Quando li metto in double quando vado per mettere i dati nell'interfaccia metto il primo con la virgola pero non me lo legge e li mette lui da solo
  • Controlla il parametro della scanf , non è più il % d.
    sostituiscilo con % f. Se vuoi limitare le cifre dopo la virgola scrvi % 2.2f dovrebbe andar bene
Devi accedere o registrarti per scrivere nel forum
13 risposte