Problema in linguaggio c

di il
10 risposte

Problema in linguaggio c

Salve a tutti dovrei risolvere questo esercizio ma non riesco a farlo:

Un programma deve leggere dall’utente due vettori di 5 elementi ciascuno. Il programma
deve creare un ulteriore vettore, che contenga la copia dei soli elementi pari presenti nei
due vettori di partenza, e stampare tale vettore.

il mio codice è questo ma il programma non funziona correttamente,qualcuno puo aiutarmi?
#include<stdio.h>
#include<stdlib.h>
void inserisci(int [],int);
void pari(int [],int,int [],int,int []);
void main(){
int a[5],b[5],c[10],n,m,i;
do{
printf("Quanti elementi inserire nell'array tra 0 e 5: ");
scanf("%d",&n);
}
while(n>=5 && n<0);
inserisci(a,n);
do{
printf("Quanti elementi inserire nell'array tra 0 e 5: ");
scanf("%d",&m);
}
while(m>=5 && m<0);
inserisci(b,m);
pari(a,n,b,m,c);
for(i=0;i<10;i++)
    printf("%d ",c[i]);

}

void inserisci(int a[],int n){
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
}

void pari(int a[],int n,int b[],int m,int c[]){
int z=0,i;
for(i=0;i<n;i++)
if(a[i]%2==0){
c[i]=a[i];
z=z+1;}
for(i=0;i<m;i++)
if(b[i]%2==0){
c[z]=b[i];
z=z+1;
    }

}



10 Risposte

  • Re: Problema in linguaggio c

    Questa linea

    c=a;

    deve essere

    c[z]=a;

    E poi nella printf finale la for non si deve concludere a 10 perché non è detto che hai 10 valori nell'ultimo vettore.
    Il numero di valori è in z
  • Re: Problema in linguaggio c

    #include<stdio.h>
    #include<stdlib.h>
    void inserisci(int [],int);
    void pari(int [],int,int [],int,int []);
    void main(){
    int a[5],b[5],c[10],n,m,i;
    do{
    printf("Quanti elementi inserire nell'array tra 0 e 5: ");
    scanf("%d",&n);
    }
    while(n>=5 && n<0);
    inserisci(a,n);
    do{
    printf("Quanti elementi inserire nell'array tra 0 e 5: ");
    scanf("%d",&m);
    }
    while(m>=5 && m<0);
    inserisci(b,m);
    pari(a,n,b,m,c);
    }
    
    void inserisci(int a[],int n){
    int i;
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    }
    
    void pari(int a[],int n,int b[],int m,int c[]){
    int z=0,i;
    for(i=0;i<n;i++)
    if(a[i]%2==0){
    c[z]=a[i];
    z=z+1;}
    for(i=0;i<m;i++)
    if(b[i]%2==0){
    c[z]=b[i];
    z=z+1;
        }
    for(i=0;i<z;i++)
        printf("%d ",c[i]);
    }
    
    

    ok grazie mille,commetto ancora questi errori stupidi...un ultima curiosita,se il for per visualizzare il vettore con i numeri pari volessi metterlo nel main anziche nella funzione pari come potrei portarmi il valore di z?
  • Re: Problema in linguaggio c

    Risolto coi puntatori,grazie mille!
  • Re: Problema in linguaggio c

    Gli errori possono capitare se sei all'inizio. Ma devi rileggere il codice per individuarli ... se lo fai con attenzione li trovi.
  • Re: Problema in linguaggio c

    Salve, anche io ho provato a fare lo stesso esercizio e ci tenevo ad avere la vostra opinione. Il mio programma sembra funzionare correttamente ma qualche consiglio fa sempre piacere.
    
    /*
     * Copia degli elementi pari.
     * Un programma deve leggere dall’utente due vettori di 5 elementi ciascuno. Il programma
     * deve creare un ulteriore vettore, che contenga la copia dei soli elementi pari presenti nei
     * due vettori di partenza, e stampare tale vettore.
     */
    
    /* 
     * File:   main.c
     * Author: marco
     *
     * Created on 19 gennaio 2019, 15.28
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #define LVET 5          //lunghezza dei vet1 e vet2, 5 elementi ciascuno
    int vet1[LVET];         //vettore 1 di inserimento numeri
    int vet2[LVET];         //vettore 2 di inserimento numeri
    int vetP[LVET*2];       //vettore immagazzinamento numeri pari
    int contV = 0;          //contatore vettore numeri pari
    
    
    int main(int argc, char** argv) {
        //inserimento numeri vettore 1
        printf("Inserisci i 5 numeri del vettore 1\n");
        for(int i=0; i<LVET; i++) {
            printf("%d° valore vettore 1: ", i+1);
            scanf("%d", &vet1[i]);
        }
        printf("Inserimento vettore 1 completato!\n\n");
        //iserimento numeri vettore 2
        printf("Inserisci i 5 numeri del vettore 2\n");
        for(int i=0; i<LVET; i++) {
            printf("%d° valore vettore 2: ", i+1);
            scanf("%d", &vet2[i]);
        }
        printf("Inserimento vettore 2 completato!\n\n");
        //ricerca e stampa dei numeri pari presenti nei vettori
        printf("Numeri pari presenti nei due vettori:\n");
        //ricerca vettore 1
        for(int i=0; i<LVET; i++) {
            if(vet1[i]%2 == 0) {
                vetP[contV] = vet1[i];
                contV++;
            }
        }
        //ricerca vettore 2
        for(int i=0; i<LVET; i++) {
            if(vet2[i]%2 == 0) {
                vetP[contV] = vet2[i];
                contV++;
            }   
        }
        //stampa numeri pari copiati nel vettore numeri pari
        for(int i=0; i<LVET*2; i++) {
            if(vetP[i] != 0) {
                printf("%d\n", vetP[i]);
            }
        }
        return (EXIT_SUCCESS);
    }
    
    
    
  • Re: Problema in linguaggio c

    Allora:
    - se possibile (come in questo caso), evita di dichiarare variabili globali;
    - se non vuoi avere un codice ridondante, ti consiglio di utilizzare le funzioni;
    - per quanto riguarda la stampa di vetP sfrutti il fatto che di default gli oggetti dichiarati globalmente sono inizializzati a 0? A tal proposito ti faccio notare che lo stesso vale anche per la variabile contV, quindi potevi anche evitare l'inizializzazione "manuale";
    - in ogni caso la parte relativa alla stampa di vetP è sbagliata... rifletti sulla seguente domanda: 0 è pari?
    - inoltre ti faccio notare che non c'è bisogno di fare cose strane per stampare quell'array, in quanto già sai quanti inserimenti hai effettuato in vetP, sei d'accordo?!
  • Re: Problema in linguaggio c

    Nippolo ha scritto:


    Allora:
    - se possibile (come in questo caso), evita di dichiarare variabili globali;
    - se non vuoi avere un codice ridondante, ti consiglio di utilizzare le funzioni;
    - per quanto riguarda la stampa di vetP sfrutti il fatto che di default gli oggetti dichiarati globalmente sono inizializzati a 0? A tal proposito ti faccio notare che lo stesso vale anche per la variabile contV, quindi potevi anche evitare l'inizializzazione "manuale";
    - in ogni caso la parte relativa alla stampa di vetP è sbagliata... rifletti sulla seguente domanda: 0 è pari?
    - inoltre ti faccio notare che non c'è bisogno di fare cose strane per stampare quell'array, in quanto già sai quanti inserimenti hai effettuato in vetP, sei d'accordo?!
    Va bene, ci provo.
    Ho alcune domande:
    -Come mai è meglio non usare variabili globali?
    -E' vero potrei usare le funzioni per prendere i valori del vettore 1 e 2, il problema è che sto ancora imparando e per ritornare i valori di un array dovrei usare i puntatori, giusto?
    -Si sfruttavo questa regola perché se lo dichiaro nel main vetP[] comincia ad assumere valori casuali che mi potrebbe stampare se sono pari.
    -Francamente non ci ho mai pensato se lo zero e pari o dispari, dovrei stampare anche lui?
    -Scusami, ma non ho capito bene cosa intendi.

    Ti ringrazio per l'aiuto
    Ho ricorretto il codice, non è come dici tu ma spero che vada un po' meglio
    
    /*
     * Copia degli elementi pari.
     * Un programma deve leggere dall’utente due vettori di 5 elementi ciascuno. Il programma
     * deve creare un ulteriore vettore, che contenga la copia dei soli elementi pari presenti nei
     * due vettori di partenza, e stampare tale vettore.
     */
    
    /* 
     * File:   main.c
     * Author: marco
     *
     * Created on 19 gennaio 2019, 15.28
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #define LVET 5          //lunghezza dei vet1 e vet2, 5 elementi ciascuno
    int vetP[10];  
     
    
    int main(int argc, char** argv) {
        //inserimento numeri vettore 1
        printf("Inserisci i 5 numeri del vettore 1\n");
        int vet1[LVET];         //vettore 1 di inserimento numeri
        for(int i=0; i<LVET; i++) {
            printf("%d° valore vettore 1: ", i+1);
            scanf("%d", &vet1[i]);
        }
        printf("Inserimento vettore 1 completato!\n\n");
        //iserimento numeri vettore 2
        printf("Inserisci i 5 numeri del vettore 2\n");
        int vet2[LVET];         //vettore 2 di inserimento numeri
        for(int i=0; i<LVET; i++) {
            printf("%d° valore vettore 2: ", i+1);
            scanf("%d", &vet2[i]);
        }
        printf("Inserimento vettore 2 completato!\n\n");
        //ricerca e stampa dei numeri pari presenti nei vettori
        printf("Numeri pari presenti nei due vettori:\n");
                 
        //ricerca vettore 1
        int contV = 0;              //contatore vettore numeri pari
        for(int i=0; i<LVET; i++) {
            if(vet1[i]%2 == 0) {
                vetP[contV] = vet1[i];
                contV++;
            }
        }
        //ricerca vettore 2
        contV = 0;
        for(int i=0; i<LVET; i++) {
            if(vet2[i]%2 == 0) {
                vetP[contV] = vet2[i];
                contV++;
            }   
        }
        //stampa numeri pari copiati nel vettore numeri pari
        for(int i=0; i<10; i++) {
            if(vetP[i] != 0) {
                printf("%d\n", vetP[i]);
            }
        }
        return (EXIT_SUCCESS);
    }
    
    
  • Re: Problema in linguaggio c

    Provo a risponderti io ma prendi quello che ti dico con le pinze visto che sono uno studente:
    -Come mai è meglio non usare variabili globali?
    Nel 99% dei casi (e le eccezioni sono robe estremamente più complicate dei programmi che la gente normale programma, il mio prof faceva l'esempio del kernel di linux per intenderci) i programmi possono essere scritti senza variabili globali, ma se inizi ad abituarti a usarle non troverai più soluzioni che le escludano. Usandole inoltre rischi anche di incasinare il codice (sopratutto quando usi più funzioni).
    -E' vero potrei usare le funzioni per prendere i valori del vettore 1 e 2, il problema è che sto ancora imparando e per ritornare i valori di un array dovrei usare i puntatori, giusto?
    Non so a cosa si riferisse esattamente Nippolo, ma ad esempio vedo che scrivi due volte la parte di inserimento per il vettore uno e due, quando potresti fare (senza bisogno di puntatori) una funzione void riempi(int v[]) a cui passi il vettore e la parte di scanf printf se la sbriga lui, così risolveresti in due righe scrivendo nel main
    riempi(v1);
    riempi(v2);
  • Re: Problema in linguaggio c

    -Come mai è meglio non usare variabili globali?
    Premetto che ho specificato "se possibile", nel senso che la scelta va ponderata volta per volta, quindi non escludo il caso in cui l'utilizzo di variabili globali comporti un significativo miglioramento della leggibilità del codice e/o delle prestazioni.
    In ogni caso:
    - una funzione che utilizza una variabile globale perde di generalità e non potrà essere riutilizzata in altri contesti;
    - bisogna stare attenti perché se dichiari una variabile locale con lo stesso nome di una globale, quest'ultima verrà "oscurata" da quella locale;
    - dal momento che tutte le funzioni possono accedere alle variabili globali sia in lettura che in scrittura, un eventuale debug diventa molto più complicato, in quanto dobbiamo andare a spulciare ogni singola funzione per vedere quale di esse va effettivamente a leggere o a scrivere una determinata variabile globale;
    - le variabili globali occupano la memoria per tutto il tempo di esecuzione del programma, non soltanto quando servono.
    -E' vero potrei usare le funzioni per prendere i valori del vettore 1 e 2, il problema è che sto ancora imparando e per ritornare i valori di un array dovrei usare i puntatori, giusto?
    Prenditi tutto il tempo necessario per studiare bene la teoria, a quel punto se avrai dubbi noi siamo qui!
    -Si sfruttavo questa regola perché se lo dichiaro nel main vetP[] comincia ad assumere valori casuali che mi potrebbe stampare se sono pari.
    -Francamente non ci ho mai pensato se lo zero e pari o dispari, dovrei stampare anche lui?
    Ipotizziamo che

    vet1 = 3 2 35 0 14

    e

    vet2 = 6 9 11 22 7

    La stampa di vetP cosa dovrebbe mostrare?
    -Scusami, ma non ho capito bene cosa intendi.
    Considerando i vettori che ho appena scritto, quanto vale la variabile contV alla fine del programma?
  • Re: Problema in linguaggio c

    X @Muad'Dib90: ti sei appoggiato a un thread del 2016 e di un altro utente.
    Devi aprire un thread tuo, non riciclare quello degli altri.

    Chiudo la discussione
Devi accedere o registrarti per scrivere nel forum
10 risposte