• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

ptrci

[C] Ajuda: Vectores

17 mensagens neste tópico

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;
					}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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]);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 é.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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"?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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", &reg->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",&reg->etapas[i]);
	}
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes por o código do case1 outra vez? agora com as alterações feitas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora