Jump to content

[C] Ajuda: Vectores


Recommended Posts

Posted

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.

Posted

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

Posted

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

Posted

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

Posted

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.

Posted

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

Posted

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

Posted

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.

Posted

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

Posted

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

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

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.

Posted

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.

Posted

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.