Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [C] Problema somma vettori

    Salve a tutti ragazzi,
    ho iniziato a programmare da poco in C e già trovo le prime difficoltà, qualcuno di voi saprebbe dirmi cosa ho sbagliato in questo codice che ora vi posterò?

    Sembra tutto corretto solo che alla fine quando esegue la somma mi stampa a video dei risultati sbagliati (numeri giganteschi).

    Ho già cercato discussioni simili, ma non mi sembra di aver fatto errori come quelli elencati... qualche anima pia saprebbe darmi una mano?

    Grazie mille a tutti per il vostro aiuto

    codice:
    #include <stdio.h>
    
    char x;
    int n, l, k;
    
    
    main()
    {
    int vet1[n], vet2[n];
    int somv[n];
    
    do {
    printf("Selezionare la lunghezza n dei due vettori: ");
    scanf("%d", &n);
    }
    while(n<1);
    
    printf("Inizializzazione primo vettore.\n");
    for(k = 0; k < n; k++) {
          printf("Inserisci un valore: ");
         scanf("%d", &vet1[k]); 
          }
          
    printf("Inizializzazione secondo vettore.\n");
    for(k = 0; k < n; k++) {
          printf("Inserisci un valore: ");
          scanf("%d", &vet2[k]); 
          }
    
    
    
    for(k = 0; k == n; k++) {
          l = n-1;
          somv[k] = vet1[k] + vet2[l];
          }
    
    printf("Visualizzazione primo vettore.\n\n");
    for(k = 0; k < n; k++) printf(" %5d ", vet1[k]);
    
    printf("\n\nVisualizzazione secondo vettore.\n\n");
    for(k = 0; k < n; k++) printf(" %5d ", vet2[k]);
    
    printf("\n\nVisualizzazione vettore somma.\n\n");
    for(k = 0; k < n; k++) printf(" %5d ", somv[k]);
    
    fflush(stdin);
    scanf("%c", &x);
    }

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    void pulisciBuffer() {
    	while(getchar() != '\n');
    }
    
    int main()
    {
    	int *vet1, *vet2, *somv;
    	int n, k;
    
    	do {
    		printf("Selezionare la lunghezza n dei due vettori: ");
    		scanf("%d", &n);
    		pulisciBuffer();
    	} while(n < 1);
    	
    	vet1 = (int *)calloc(n, sizeof(int));
    	vet2 = (int *)calloc(n, sizeof(int));
    	sumv = (int *)calloc(n, sizeof(int));
    	
    	printf("Inizializzazione primo vettore.\n");
    	for(k = 0; k < n; k++) {
    		printf("Inserisci un valore: ");
    		scanf("%d", &vet1[k]);
    		pulisciBuffer(); 
    	}
          
    	printf("Inizializzazione secondo vettore.\n");
    	for(k = 0; k < n; k++) {
    		printf("Inserisci un valore: ");
    		scanf("%d", &vet2[k]); 
    		pulisciBuffer();
    	}
    
    
    
    	for(k = 0; k < n; k++)
    		somv[k] = vet1[k] + vet2[k];
    
    	printf("Visualizzazione primo vettore.\n\n");
    	for(k = 0; k < n; k++) 
    		printf(" %5d ", vet1[k]);
    	
    	printf("\n\nVisualizzazione secondo vettore.\n\n");
    	for(k = 0; k < n; k++)
    		printf(" %5d ", vet2[k]);
    	
    	printf("\n\nVisualizzazione vettore somma.\n\n");
    	for(k = 0; k < n; k++)
    		printf(" %5d ", somv[k]);
    	free(vet1);
    	free(vet2);
    	free(somv);
    	getchar();
    	return 0;
    }
    Questo codice è corretto.

    Nel tuo codice:
    codice:
    int vet1[n], vet2[n];
    int somv[n];
    Inizializzi i vettori senza settare il valore di n, ciò porta a risultati imprevisti! Inoltre dovresti sostituire la dichiarazione di array di lunghezza variabile con l'allocazione dinamica (es. malloc, calloc e free; vedi il codice postato per un esempio).

    P.s. io, dopo ogni chiamata a scanf, ho introdotto una funzione che pulisce il buffer, questo perchè scanf non lo fa di default, non è strettamente necessaria, ma siccome tu utilizzavi una scanf un po' ambigua per non uscire dal programma ho sostituito con una getchar, da ciò è risultata la necessità di tenere pulito il buffer

    Edit: non ho compilato perchè non ho un compilatore a disposizione, perciò potrebbe esserci qualche errore
    Edit2: C'era un errore... Colpa del fatto che ho modificato il codice e non l'ho riscritto
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it L'avatar di Dark867
    Registrato dal
    Mar 2010
    Messaggi
    435
    Scusa ma tu vuoi solo sommare i 2 vettori, no?
    Perché nella parte della somma non fai semplicemente:
    codice:
    for(i=0;i<n;i++)
    somma[i] = v1[i] + v2[i];
    ??Che vuol dire quel codice?

    Cmq è sbagliata la sequenza:
    codice:
     int v[n]
    seguita da
    codice:
     scanf("%d",&n);
    infatti la prima alloca già un vettore di n elementi, con n sconosciuto, e lo scanf non fa cambiare n. Dovresti usare l'allocazione dinamica...

  4. #4
    Grazie ragazzi siete fenomenali! Mi avete dato una risposta rapidissima e per di più mi avete anche corretto lo script!

    Rispondendo a Dark 867:
    Ho fatto in quel modo perchè in realtà il testo del quesito non mi chiedeva di sommare solo i vettori ma di sommare il primo elemento di un vettore con l'ultimo dell'altro, il secondo con il penultimo e così via.

    A Scara:
    Grazie mille, nel codice che mi hai scritto ci sono molte cose che non conosco (ho iniziato adesso a programmare ), adesso me lo studierò per bene, non vedo l'ora di imparare a programmare decentemente anche io

    Edit1:



    Dannazione ho usato anche il tuo codice ma ancora non va lo script... mi da un numero gigantesco

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Per accedere all'ultimo elemento utilizza n - k - 1, quindi
    codice:
    for(k = 0; k < n; k++)
      somv[k] = vet1[k] + vet2[n - k - 1];
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Grazie ma non funziona il codice, c'è qualcosa di sbagliato mi sa... continua a darmi come risulatato della somma numeri giaganteschi del tipo:
    vet1[0]=2
    vet2[0]=3
    somv[0]=1985177776

    Perchè?

    PS. sto usando il codice che mi hai postato

  7. #7
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Quando hai dei numeri giganti generalmente stai stampando indirizzi di memoria e non i valori li contenuti...
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  8. #8
    Mi sembra strano... io stampo questo:
    codice:
    printf("\n\nVisualizzazione vettore somma.\n\n");
    for(k = 0; k < n; k++) printf(" %5d ", somv[k]);
    dopo aver fatto questa somma:
    codice:
    for(k = 0; k < n; k++)
      somv[k] = vet1[k] + vet2[n - k - 1];
    Perchè allora mi stampa l'indirizzo di memoria?
    Come devo fare per non stamparlo?

    PS. Sto usando il codice che mi ha postato Scara95

  9. #9
    Utente di HTML.it L'avatar di infinitejustice
    Registrato dal
    Nov 2001
    residenza
    Barcelona
    Messaggi
    772
    Usando il codice di Scara, a parte una variabile dichiarata col nome sbagliato, ottengo un output corretto (somma dei vettori, colonna per colonna).

    Visualizzazione primo vettore.

    1 2 3 4 5

    Visualizzazione secondo vettore.

    6 7 8 9 10

    Visualizzazione vettore somma.

    7 9 11 13 15

    Non ho controllato il codice. Ma in linea generale, se ottieni interi lunghissimi e lavori con vettori, la ragione è che stai stampando indirizzi di memoria. Non è necessariamente quella la ragione.
    Live fast. Troll hard.
    Pythonist | Djangonaut | Puppeteer | DevOps | OpenStacker | Lost in malloc
    Team Lead @Gameloft Barcelona

  10. #10
    Io ho usato precisamente il codice postato da scara (ho giusto cambiato la variabile da "sumv" a "somv") , guarda tu stesso il risultato... ho proprio adesso fatto uno stamp:



    Edit: ho cambiato compilatore e va tutto ok =D

    Grazie a tutti

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.