[C] aiuto con questo programma!

gio881
salve ho delle difficoltà a impostare questo esercizio qualcuno potrebbe aiutarmi?

Descrivere un algoritmo codificato in linguaggio C/C++ che :

1) definisce due vettori, il primo di nome a contenente 100 interi e il secondo di nome b contenente 50 numeri interi
2) riempie il vettore a inserendo in ogni sua posizione un valore letto da standard input
3) riempie il vettore b inserendo in esso i valori contenuti nei posti dispari del vettore a */



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


int main(){

    int i ,j, a[10] , b[5];



    for (i=0 ; i<10 ; i++){
        scanf("%d" , &a[i]);
        }
        i=1;
        for(j=0 ; j<5 ; j++){
                do{
                a[i]=b[j];
                i=i+2;
                }while(i%2!=0);

        }

        for(j=0;j<5;j++){
            printf("%d\n" , b[j]);

        }




return 0;

}


per comodità al fine di rendere più semplcie il controllo su code::blocks , al posto di un vettore da 100 e un vettore da 50 ho fatto un vettore da 10 e uno da 5 , sono bloccato alla parte in cui devo mettere i valori che sono nelle posizioni dispari del vettore a nel vettore b....probabilmente è una stupidata , ma sul momento mi servirebbe una mano!grazie in anticipo

Risposte
Cronovirus
Scusami non mi sono messo a trovare l'errore che hai commesso, molto semplicemente io lo farei così (l'ho buttato giù velocemente.. lo puoi fare in centinaia di modi)
#include <stdio.h>
#include <stdlib.h>
int main() {
        int a[10];
        int b[5];
        int i,j=0;
        for(i=0;i<10;i++){
                scanf("%d",&a[i]);
                if(i%2==1){
                        b[j] = a[i];
                        j++;
                        }
                }
        return 0;
}

vict85
Ma che errore trovi?

apatriarca
Il ciclo due while interno è infinito.. i è inizializzato a 1 e viene incrementato di due ad ogni ciclo. Quindi stai iterando su tutti i numeri dispari e non ci sarà alcun numero dispari per cui il resto con due sarà uguale a zero.. Il ciclo è comunque del tutto inutile..

vict85
Stavo pensando... Ma posizione o indice dispari? Perché a rigore il primo elemento inserito viene messo in posizione 0 quindi gli elementi di posizione dispari hanno ordine pari :roll: . Insomma potrebbe essere una ambiguità del testo dato dal fatto che gli indici partono da 0. Ripensandoci c'era la stessa ambiguità nel tuo scorso problema.

Supponendo sia come lo hai interpretato tu nota che avrai \(\displaystyle a[2k+1] = b[k] \) o anche \(\displaystyle a[k] = b\bigl[\lfloor k/2 \rfloor \bigr] \). Puoi ovviamente usare due indici che aumenti insieme oppure incrementarne uno solo e calcolare l'altro di volta in volta.

Nota che il for è più malleabile di quanto possa essere presentato inizialmente nei corsi universitari. Puoi fare le seguenti cose:
[list=1][*:2e9n8zth] Dallo standard c99 puoi definire la variabile usata nel ciclo direttamente nel suo interno. Ad esempio
for(int i = 0; i != N; ++i) { ... }
[/*:m:2e9n8zth]
[*:2e9n8zth] Puoi inizializzare più variabili all'interno del for. Ad esempio
for(i = 0, j = 0; i+j < N; ++i) { ... }
[/*:m:2e9n8zth]
[*:2e9n8zth] Puoi utilizzare ogni tipo di condizione finale possa essere usato in un if o un while. Ad esempio
for(int i = 0; (i < N) && (f(i) || g(i, N)) && !b ; ++i) { ... }
[/*:m:2e9n8zth]
[*:2e9n8zth] Puoi fare qualsiasi tipo di operazione alla fine di ogni ciclo. Ad esempio questo for trova il massimo divisore dispari di un numero \(\displaystyle n \):
for(d = n; d%2 == 0; d/=2);
oppure equivalentemente
for(d = n; !(d%2); d>>=1);
[/*:m:2e9n8zth]
[*:2e9n8zth] Puoi fare più operazioni alla fine del ciclo, basta dividerle con un virgola. Ad esempio
for(int i = 0; i < N; i += 4, somma += i);
[/*:m:2e9n8zth][/list:o:2e9n8zth]

gio881
Grazie per l aiuto!!!!

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


int main(){

    int i ,j, a[10] , b[5];



    for (i=0 ; i<10 ; i++){
        scanf("%d" , &a[i]);
        }
        for(j=0 ; j<5 ; j++){
                if(i%2==1){
                    b[j]=a[i];
                    j++;
                    }

        }


        for(j=0;j<5;j++){
            printf("%d\n" , b[j]);

        }




return 0;

}



anche così l'esercizo però non mi viene , testandolo su code::blocks...

vict85
Stai mescolando un metodo con un altro. Scrivere un programma equivale a fornire delle indicazioni ad processore su cosa debba fare. Devi pensare al messaggio prima che alle parole.

Comunque il tuo codice è la dimostrazione vivente che si dovrebbe insegnare ai principianti a definire le variabili all'interno del for: se l'avessi fatto il compilatore ti avrebbe detto che l'i nel secondo ciclo non è definito in quello "scope" (insomma in quel blocco). E se ci pensi un secondo capiresti che quell'i non cambia il suo valore durante tutto il ciclo ovvero che rimane fissato al valore 10, che fortunatamente è pari :roll: .

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.