[C] aiuto con questo programma!
salve ho delle difficoltà a impostare questo esercizio qualcuno potrebbe aiutarmi?
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
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
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; }
Ma che errore trovi?
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..
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
. 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
[*:2e9n8zth] Puoi inizializzare più variabili all'interno del for. Ad esempio
[*:2e9n8zth] Puoi utilizzare ogni tipo di condizione finale possa essere usato in un if o un while. Ad esempio
[*: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 \):
[*:2e9n8zth] Puoi fare più operazioni alla fine del ciclo, basta dividerle con un virgola. Ad esempio

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]
Grazie per l aiuto!!!!
#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...
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
.
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
