PDA

Visualizza la versione completa : [C] incremento di vettori ad ogni chiamata di funzione


Skass89
29-01-2010, 22:16
Questo è "programma per la gestione dei posti a sedere di un aereo"...il mio problema è l'incremento dei due vettori delle rispettive funzioni (firstClass, economicClass), cioè ad ogni chiamata il vettore deve incrementare e memorizzare la posizione di cui è stato incrementato. Gli ho inizializzati il primo a 0 e il secondo a 6, so che ad ogni chiamata vengono inizializzati da quel punto, quindi vorrei capire con il vostro aiuto come risolvere questo intreccio...



#include <stdio.h>
#define SIZE 10
#define POSTIprima 5
#define POSTIsecon 5
void firstClass(int prima[], int size);
void economicClass(int seconda[], int size);


int main(){
int scelta;

int aereo[SIZE]; /* vettore posti aereoplano*/
int azz; /*variabile per azzeramento vettore aereo*/
int postiPri, postiSec; /*contatori posti a sedere*/


/*azzera i posti a sedere dell'aereo*/
for(azz = 0; azz < SIZE; azz++){
aereo[azz] = 0;
}


printf("Premere [ 1 ] per la Prima Classe.\n");
printf("Premere [ 2 ] per la Seconda Classe.\n");



while(scelta > 0 || scelta <= 2){
printf("\nPrego, selezionare una delle due preferenze = ");
scanf("%d", &scelta);

if(scelta == 1){
firstClass(aereo, SIZE);
aereo[azz++];
} else if
(scelta == 2){
economicClass(aereo, SIZE);
aereo[azz++];
} else if (scelta != 1 || scelta != 2){
printf("\nLa preghiamo di selezionare una delle due preferenze = \n");

}

}

system("pause");
return 0;

}

firstClass(int prima[], int size){

prima[size++];

printf("\nIl suo posto e' al numero %d della Prima Classe\n\n", size);


}
economicClass(int seconda[], int size2){

seconda[size2++];

printf("\nil suo posto e' al numero %d della Seconda Classe\n\n", size2);

}

antotan
29-01-2010, 22:57
Ciao, potresti essere un pò più chiaro? Non si capisce molto e il codice non aiuta.
Cosa vuoi incrementare?

Con queste:


aereo[azz++];

oppure


prima[size++];

cosa vorresti fare? Vorresti aumentare la dimensione dell'array?

scelta non è inizializzato, quindi nel while, accedi ad un valore che sta in memoria, potrebbe essere qualsiasi cosa.

scelta > 0 || scelta <= 2 non terminerà mai, un int è per forza tra (0, max(int)] u [min(int), 2].
La condizione prevede un "and" se vuoi terminare il ciclo.



while(scelta > 0 && scelta <= 2) {
//...
}


Sebbene il flusso non ti porti in



else if(scelta =! 1 || scelta =! 2)


quando immetti in input 1 o 2, questa è logicamente sbagliata. Tutti gli interi sono diversi da 1 o 2. Ad esempio 1 non è diverso da 1, ma da 2 si. Stesso per 2. C'è un or, e ci andrebbe in and
Se fai terminare il ciclo scrivendo l'and nel while, questa parte però non ha senso però

Sempre parlando del while, l'utente deve poter inserire la propria scelta almeno una volta, quindi usa il do...while



do {
//....
} while(scelta > 0 && scelta <= 2)


togliando l'else if che ti ho detto prima.
Se invece non vuoi che termini il ciclo, togli la condizione (non avrebbe senso), così il programma continuerà fino a quando vuoi tu:



while(1) {
//...
else if(scelta != 1 && scelta != 2)
printf("sbagliato");
}


Spero ti siano utili queste dritte.

:ciauz:

Skass89
29-01-2010, 23:03
allora il programma deve terminare all'esaurimento dei posti che ne sarebbero 10, oltre a tutti i problemi della parte del main che mi hai fatto notare, a me servirebbe incrementare i vettori delle due funzioni ad ogni chiamata, cioè ad ogni posto assegnato...

nel frattempo di una tua risposta smanetto sulle tue dritte....

antotan
29-01-2010, 23:10
Vediamo se ho capito: il tuo aereo ha 10 posti. Probabilmente una parte sono per la prima e una parte sono per la seconda classe, date le costanti POSTIprima e POSTIsecon.
Tu vuoi che ognuno faccia il biglietto, scegliendo la classe e nel vettore vorresti mettere un uno, indicando che quel posto è occupato. Giusto?

Skass89
29-01-2010, 23:11
anche tu hai studiato con D&D :mame: ?????? hai azzeccato perfettamente

antotan
29-01-2010, 23:29
no, mi sa che sono sensitivo :sadico:



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

#define SIZE 10
#define POSTIprima 5
#define POSTIsecon 5

int main(){
int scelta;

int aereo[SIZE]; /* vettore posti aereoplano*/
int postiPri = 0, postiSec = 0; /*contatori posti a sedere*/

/*azzera i posti a sedere dell'aereo*/
for(int i = 0; i < SIZE; i++){
aereo[i] = 0;
}

printf("Premere [ 1 ] per la Prima Classe.\n");
printf("Premere [ 2 ] per la Seconda Classe.\n");
printf("Premere [ 3 ] per lo stato dell'aereo.\n");

do {
printf("\nPrego, selezionare una delle due preferenze = ");
scanf("%d", &scelta);

if(scelta == 1)
{
if(postiPri < 5)
{
aereo[postiPri + postiSec] = 1;
printf("Grazie, viaggiatore #%d\n", postiPri+postiSec);
postiPri++;
}
else
printf("Spiacente, posti in prima terminati\n");
}
else if (scelta == 2)
{
if(postiSec < 5)
{
aereo[postiPri + postiSec] = 1;
printf("Grazie, viaggiatore #%d\n", postiPri+postiSec);
postiSec++;
}
else
printf("Spiacente, posti in seconda terminati\n");
}
else if(scelta == 3)
{
for(int i = 0; i < SIZE; i++)
printf("%d | ", aereo[i]);
printf("\n");
}
} while(scelta > 0 && scelta <= 3);

system("pause");
return 0;
}


Ogni volta che uno prenota un posto in prima classe, incremento la variabile postiPri, così tengo traccia di quanti viaggiatori ho (stesso per la seconda classe).
Se ho 2 viaggiatori in prima e 4 in seconda, il prossimo biglietto libero (partendo da 0) sarà 2+4 = 6, no (i viaggiatori vanno da 0 a 5, 6 è libero)? Per questo faccio

aereo[postiPri + postiSec] = 1;

Prova a guardarlo, ti ci ritrovi? credo sia, bene o male (qualcosa ovviamente cambia) che avevi iniziato a fare tu.

In questo esempio, l'uso dell'array non è necessario. Però prova a complicarlo un pò. Riesci ad implementare un sistema di annullamento dell'ordine? Un viaggiatore arriva, ti dice il numero del biglietto e tu annulli l'ordinazione (poni a 0 il relativo elem dell'array).
Oppure puoi considerare le posizione 0,1,2,3,4 dell'array riservate alla prima classe e le posizione 5,6,7,8,9 riservate alla seconda classe...

Skass89
29-01-2010, 23:45
tu sei un PAZZO....mi piace davvero molto....per quanto riguarda la parte dell'annullamento non mi sento di farla a quest'ora preferirei iniziare un'altro esercizio....comunque sembrerebbe molto chiaro.....ah e grazie per avermi smontato tutto il programma!!!! :cry: :cry: ........

adesso ho provato a mandarlo in esecuzione quello che non mi piace è che i passaggeri "sulla carta d'imbarco" :mame:(cioè sul output dopo la scelta) non sanno se vanno in prima o in seconda e non sanno a che posto sedersi, l'esercizio mi impone esplicitamente che la prima classe va dai posti 1 a 5 e la seconda da 6 a 10....

provo a ragionarci un po....ma se hai già un ideuzza in mente....è ben accetta!!!! :)

antotan
29-01-2010, 23:52
Si si, come ti dicevo io:


Oppure puoi considerare le posizione 0,1,2,3,4 dell'array riservate alla prima classe e le posizione 5,6,7,8,9 riservate alla seconda classe...

ovviamente puoi farcela tranquillamente da solo :)
Se hai problemi, posta pure.

Skass89
29-01-2010, 23:56
gentilissimo....e complimenti per il portale....comunque ti do subito notizie della mia fine...quindi se tardo è perchè il mio pc si sta schiantando giù dal 4 piano

antotan
30-01-2010, 00:00
grazie mille!

Ti aspetto. Nel frattempo, riallacciandomi al tuo codice iniziale, se vuoi incrementare la pos di un array (magari passandolo ad un altra funzione) devi fare qualcosa del genere:



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

void incr(int array[], int size, int pos)
{
if(pos < 0 || pos >= size) return;

printf("Prima: array[%d] = %d\n", pos, array[pos]);
array[pos]++;
printf("Dopo: array[%d] = %d\n\n", pos, array[pos]);
}

int main(){

int array[] = {0, 1, 2, 3};
int size = 4;

incr(array, size, 0);
incr(array, size, 0);
incr(array, size, 3);

system("pause");
return 0;
}


:ciauz:

Loading