PDA

View Full Version : [C] Confrontare la somma di due elementi di un vettore con un intero


shiony710
03-02-2015, 19:16
Ciao a tutti, ho urgente bisogno di aiuto, questa è la traccia:
Dato un vettore di interi v e un intero x scrivi una funzione in C che stabilisce se esistono in v due elementi
v[i] e v[i] tali che v[i] + v[i] = x. Calcola la complessita computazionale dell'algoritmo
proposto. Esiste un'algoritmo che funziona in tempo
O(n^2)? E possibile fare meglio?


Questo è quello che ho provato a fare:

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

int main()

{
int v[100], n, i, j, position;
printf("Inserisci il numero degli elementi\n");
scanf("%d", &n);

printf("Inserisci %d elementi\n", n);

for ( i = 0 ; i < n ; i++ )
scanf("%d", &v[i]);

int x;
printf("inserisci un intero x \n");
scanf("%d", &x);
for ( i = 0 ; i < ( n - 1 ) ; i++ )
{
position = i;
int somma = v[position] + v[j];

for ( j = i + 1 ; j < n ; j++ )
{
if ( somma = x )
somma = x;
}
if ( somma != x )
i++;
}
system("pause");
return 0;
}

Maxco93
05-02-2015, 08:29
Qui di seguito trovi il codice funzionante.Ho impostato un limite alla dimensione dell'array(costante dim), per vari motivi il più importante tra questi lo spreco di risorse.
Ti suggerisco di:

Quando puoi usa i puntatori.
Scrivi un codice piu leggibile possibile.
Step fondamentale di ogni linguaggio di programmazione: sono gli operatori, scrivere = e == significa 2 cose ben diverse sopratutto in C, gli hacker si basano proprio su questi errori.
Cerca di usare ove sia possibile meno cicli, rendono tutto poco leggibile.
Ho notato che utilizzi ancora il vecchio standard di gcc l'89, ti consiglio di usare il 99 che è l'ultima versione stabile di gcc che ti permette alcune scorciatoie.
Altra cosa che ho notato studia bene break,return sono molto utili per uscire da un ciclo.



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

const int dim = 4; //Dimensione

int main(){
int* v = (int*)calloc(dim,sizeof(int)); //Crea un array dinamico di 4 celle tute inizializzate a 0
int k,somma,i,j;
printf("Inserisci elementi:\n");
for (i = 0 ; i < dim ; i++ ){ //Inserisco i valori nelle celle scandite da 0 a 3
printf("\tInserisci valore: ");
scanf("%d", &v[i]);
}

int x;
printf("inserisci un intero x \n"); //Setto il valore di x
scanf("%d", &x);

k = somma = 0;
while(k < dim){ //Se il mio scan di indice raggiunge la fine dell'array
for(j = 0; j < dim; j++){ //Sotto ciclo per scandire le altre posizioni
if(j != k){ //Leggo tutte le posizioni tranne in quella dove sono
somma = v[k]+v[j];
if(somma == x){ //Se la somma è uguale a x, ho finito esco dal programma e faccio una stampa.
printf("Nella posizione v[%d]=%d e v[%d]=%d la loro somma è %d uguale a x=%d\n",k,v[k],j,v[j],somma,x);
return 0;
}
}
}
k++;
}
printf("Non ci sono elementi di V che danno per somma %d\n",x); //Se sono arrivati qui senza essere stato bloccato sopra vuol dire che non ci sono elementi per cui la loro somma sia x.
free(v); //Libero la memoria allocata per V, per renderla di nuovo disponibile al OS
return 0;
}



EDIT: Se hai domande chiedi pure.

shiony710
05-02-2015, 10:34
Ok ti ringrazio molto, ormai l'esame è andato ci riproverò nella prossima sessione, purtroppo il libro sul quale ho studiato non aiuta molto al livello pratico, quindi ho dovuto fare tutto come se fossi partito da 0

Maxco93
05-02-2015, 10:39
Fai buon uso dei consigli per la prossima volta allora.

shiony710
05-02-2015, 10:45
Si certo, e probabilmente ti "tartasserò" ancora per qualche chiarimento.
Grazie mille

Maxco93
05-02-2015, 11:56
Per avere un contatto piu diretto scrivimi un PM. :cool: