ptrci Posted January 14, 2007 at 06:25 PM Report #76240 Posted January 14, 2007 at 06:25 PM Estou a tentar fazer várias coisas em vectores. Tenho um estrutura que guarda os dados nos vectores. E o que estou a tentar fazer é: 1 - Num vector de tamanho 250 contar quantas posições estão preenchidas e quantas posições estão vagas. 2 - criar um contador para que não grave os dados em cima de uma posição já existente. Ou seja, estou a usar o for para preencher o vector. O problema é que não estou a conseguir criar um contador, que não preencha posições existente. Escrevi 5 posições no vector, se voltar a tentar escrver mais uma posição. Ele vai gravar na posição 1, em vez de continuar i ir para posição 6. Cumps.
Warrior Posted January 14, 2007 at 06:46 PM Report #76245 Posted January 14, 2007 at 06:46 PM Não estou a perceber bem o que queres e qual é o teu problema. Talvez fosse melhor se mostrasses o código que fizeste. (ele deve falar por ti)
merlin3000 Posted January 14, 2007 at 06:53 PM Report #76247 Posted January 14, 2007 at 06:53 PM Que tipo de dados estás a guardar nos vectores? Podes por aí algum pedaço de código que dê para perceber porque não funciona? De qualquer modo há duas maneiras de fazer isso tens um contador (que é sempre actualizado cada vez que há mudanças) que guarda a posição onde começar a escrever. Ou inicias o vector todo com um valor pre-definido antes da primeira vez que inseres dados e ao inserir percorres o vector até que encontres uma posição que tenha esse valor (este modo é bom caso elimines dados de certas posições e não reorganizes o vector, assim basta atribuir a essa posição o tal valor pré-definido que da próxima inserção ele vai ser preenchido). Criar é Divertido
ptrci Posted January 14, 2007 at 07:08 PM Author Report #76248 Posted January 14, 2007 at 07:08 PM Esta aqui meu código não esta completo: typedef struct { /* O typedef server para não estar a repetir a palavra stuct no código */ int agrupamento; /*Tipo de agrupamento: motos, carros, camiões*/ int numero; /*Numero de indentificação */ int tempo; /*Tempo ( temp acumualdao das etapas hh-mm-ss );*/ int hh; /* Tempo horas */ int mm; /* Tempo minutos */ int ss; /* Tempo segundos */ int classificacao; /* Número de classificativas concluidas */ float etapas [limetapas]; /* Etapas */ char equipa [limequipa]; /*Equipa*/ char marca [limmarca]; /*Marca*/ char modelo [limmodelo]; /*Modelo*/ char piloto [limpiloto]; /*Nome Piloto */ }motas; int main () { motas dakar1[250]; /* vector 250 ( motos) */ case '1': printf ("\t Motas \n "); printf ("Indique o número de equipas: \n"); scanf ("%d", &n ); fflush (stdin); for ( nmotas=n; nmotas<n && nmotas<250) { inserirmotas( &dakar1[nmotas]); nmotas=nmotas+1; }
merlin3000 Posted January 14, 2007 at 07:38 PM Report #76254 Posted January 14, 2007 at 07:38 PM for ( nmotas=n; nmotas<n && nmotas<250) esta verificação nmotas<n impede isto de trabalhar. porque dizes que nmotas tem que ser menor n. Aí o nmotas<250 serve porque tu ja começas no n. Isso chega a entrar no ciclo? Já agora porque é que incrementas dentro do for e não logo na linha do for? Esse ciclo é suposto inserir n equipas a partir do sítio onde a última equipa foi guardada certo? Se sim o que podes fazer é ter uma variavel onde guardes essa posição e: for (nmotas=0; nmotas<n; n++) { inserirmotas( &dakar1[nmotas + var]); } Criar é Divertido
ptrci Posted January 14, 2007 at 09:41 PM Author Report #76290 Posted January 14, 2007 at 09:41 PM Esse ciclo é suposto inserir n equipas a partir do sítio onde a última equipa foi guardada certo? Esta correcto. inserirmotas( &dakar1[nmotas + var]); estas a dizer que tenho de adicionar uma variável , não percebi qual é.
rgcaldas Posted January 14, 2007 at 09:45 PM Report #76291 Posted January 14, 2007 at 09:45 PM Não sei se percebi, mas isto devia funcionar for ( i = nmotas; i <nmotas+n;i++) { inserirmotas( &dakar1[i]); nmotas++; } O for começa na primeira posição livre e anda até n posições, alterando o contador nmotas.
Warrior Posted January 14, 2007 at 10:17 PM Report #76298 Posted January 14, 2007 at 10:17 PM desde que n seja diferente de 0, esse ciclo entre em do forever. Ao mesmo tempo que incrementas o "i" incrementas o "nmotas", logo nunca daí vais sair. o que tu queres nao é algo assim? for (nmotas=0;nmotas<n;nmotas++) inserirmotas(&dakar1[nmotas]); Edit: É impressão minha ou tens um "case" sem "switch"?
merlin3000 Posted January 14, 2007 at 10:45 PM Report #76311 Posted January 14, 2007 at 10:45 PM Eu ali em cima enganei-me não era n++ era: for (nmotas=0; nmotas<n; nmotas++) { inserirmotas( &dakar1[nmotas + var]); } a tal variável (neste caso var) é algo que te guarda a posição onde podes escrever. Assim se podias escrever na posicao 23, ias somando a nmotas... 23+0=23 1ª posição onde podes escrever... 23+1=24 2ª Posição onde podes escrever.. etc. Como é que tu estavas a pensar em saber onde podias escrever? Criar é Divertido
Warrior Posted January 14, 2007 at 11:01 PM Report #76312 Posted January 14, 2007 at 11:01 PM Eu não percebi bem o que querias fazer, mas quando assim é, normalmente ou se resolve como tu resolveste, ou então faz-se um for (nmotas=var;nmotas<n+var;nmotas++) De qualquer maneira deves ter resolvido isso.
ptrci Posted January 14, 2007 at 11:29 PM Author Report #76324 Posted January 14, 2007 at 11:29 PM É impressão minha ou tens um "case" sem "switch"? Não esta lá o switch //------------------- do{ system("cls"); //Limpar o ecrã printf (" Menu Inserir Dados/Informacao"); printf (" Escolha a sua opcao: \n\n "); /* \t para colucar uma tabulação */ printf (" \t 1 - Motas \n" ); printf (" \t 2 - Carros \n" ); printf (" \t 3 - Camioes \n\n" ); printf (" \t 0 - Voltar ao meu principal \n" ); printf ("\n"); scanf ("%c",&p3); fflush (stdin); switch (p3) { case '1': printf ("\t Motas \n "); printf ("Indique o número de equipas: \n"); scanf ("%d", &n ); fflush (stdin); for ( i = nmotas; i <nmotas+n;i++) { inserirmotas( &dakar1[i]); nmotas++; } break; case '2': printf ("\t Carros \n "); break; case '3': printf ("\t Camioes \n "); break; case '0': printf ("\n\n Menu Principal \n\n"); break; default: printf ("\n\n Opcao invalada ( Ref: menu principal ) \n\n"); break; }/*Fim do "switch" */ }while ( p3!='0' ); /*Fim do "do" */ //------------------- Só que não vou por código completo porque ainda não acabei e estou sempre a alterar. E é muito longo.
ptrci Posted January 14, 2007 at 11:42 PM Author Report #76328 Posted January 14, 2007 at 11:42 PM Experimentei as vossas soluções e continua a escrever a partir da posição 0. Não consigo encontrar a solução/problema. esta aqui o código de escrita no vector se alguém pedir void inserirmotas (motas *reg){ /* void - não retorna valores */ int i; printf ("\n Insira os seguintes dados: \n"); printf ("\n"); printf ("\n Númmero de Indentificação: "); scanf ("%d", ®->numero); /* TEMPO */ fflush (stdin); printf("\n Nome da Equipa: "); gets ( reg->equipa ); fflush (stdin); printf("\n Marca da Mota: "); gets ( reg->marca ); fflush (stdin); printf("\n Modelo da Mota:"); gets ( reg->modelo ); fflush (stdin); printf("\n Nome do Piloto: "); gets ( reg->piloto ); printf ("Etapas: \n "); for (i=1; i<limetapas; i++ ) { printf("Etapa %d: ",i); scanf("%f",®->etapas[i]); } }
merlin3000 Posted January 15, 2007 at 12:32 AM Report #76340 Posted January 15, 2007 at 12:32 AM Podes por o código do case1 outra vez? agora com as alterações feitas? Criar é Divertido
rgcaldas Posted January 15, 2007 at 12:43 AM Report #76342 Posted January 15, 2007 at 12:43 AM desde que n seja diferente de 0, esse ciclo entre em do forever. Ao mesmo tempo que incrementas o "i" incrementas o "nmotas", logo nunca daí vais sair. Tens razão devia ter sido algo mais deste género ? for ( i = nmotas; i < nmotas + n ; i++){ inserirmotas( &dakar1[i]); } nmotas=nmotas+n;
ptrci Posted January 15, 2007 at 12:54 AM Author Report #76348 Posted January 15, 2007 at 12:54 AM desde que n seja diferente de 0, esse ciclo entre em do forever. Ao mesmo tempo que incrementas o "i" incrementas o "nmotas", logo nunca daí vais sair. Tens razão devia ter sido algo mais deste género ? for ( i = nmotas; i < nmotas + n ; i++){ inserirmotas( &dakar1[i]); } nmotas=nmotas+n; Obrigado. Experimentei agora e parece que esta a funcionar. Não experimentei a fundo porque enganei me a apagar uma "}" agora tenho que rever tudo. Só tenho de pensar numa função para contar quantas posições estão ocupadas e quando estão livres. Mas isso fica para amanha.
ptrci Posted January 16, 2007 at 02:03 PM Author Report #76565 Posted January 16, 2007 at 02:03 PM Depois de rever o código. O código: for ( i = nmotas; i < nmotas + n ; i++){ inserirmotas( &dakar1[i]); } nmotas=nmotas+n; funciona. Mais uma vez obrigado. E espero que este fórum e a revista continuem com um bom trabalho.
ptrci Posted January 20, 2007 at 05:03 PM Author Report #77461 Posted January 20, 2007 at 05:03 PM Para dizer quantos fala tambem já resolvi. Ao usar a função: void InserirVariasMotas (motas m[], int nm) { int n, i; printf ("Indique o número de equipas: \n"); scanf ("%d", &n ); fflush (stdin); for ( i = nm; i < nm + n ; i++){ inserirmotas( m[i]); } nm=nm+n; // (nm)++; Usei apontadores e fiz: ncm_ocupados=vecm-ncm; printf ("\n Existem %d registos ocupados de %d registos livres no total de %d registos \n \n", ncm ,ncm_ocupados, ncm+ncm_ocupados); Já esta resolvido podem fechar o tópico
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now