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

servn

Vectores

8 mensagens neste tópico

Boa noite

É possível um utilizador inserir todos os valores para preenchimento de um vector? Ou tem de ser 1 a 1?

tenciosamente

Servn

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes fazer isso de 2 maneiras:

[x] num scanf onde saibas à partida a dimensão do array, e então basta fazeres tantas leituras quantas as posições do array:

#include <stdio.h>

int main(void) {
    int v[10], i;
    scanf("%d %d %d %d %d %d %d %d %d %d",&v[0],&v[1],&v[2],&v[3],&v[4],&v[5],&v[6],&v[7],&v[8],&v[9]);
    for (i=0;i<10;i++)
        printf("%d\n",v[i]);
    return 0;
}

A forma como separas os valores é à escolha do freguês. Neste caso usei espaços para separar.

Esta solução dá origem a instruções do tamanho de comboios.

[x]utilizando uma função de leitura de strings (scanf/fgets), e depois separando os tokens através da função strtok, fazendo a conversão necessária para o tipo de dados do array:

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

#define DIM 3

int main(void) {
    int v[DIM], i;
    char str[1024], *ptr=NULL;
    fgets(str,sizeof(str),stdin);
    str[strlen(str)-1]='\0';
    ptr = strtok(str," ");
    v[0] = atoi(ptr);
    i=1;
    while (ptr && i<DIM) {
        ptr = strtok(NULL," ");
        v[i]=atoi(ptr);
        i++;
    }
    for (i=0;i<DIM;i++)
        printf("%d\n",v[i]);
    return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado, eu vou usar

 for (i=0;i<n;i++){
  printf("O valor %i é?\n",i);
  scanf("%i", &v[i]);
                   }

pois não sei à partida qual o valor da dimensão.

Agora fiquei com outra questão, não usando a função malloc é possível iniciar um vector sem definir a sua dimensão?

No código que apresentaste definiste Dim 3, isso é obrigatório?

Ou posso por exemplo fazer:

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

#define NMAX 5000
/*int verifica(int u[], int n)
{
   int i;
   for (i=0,i<n,i++);
     
     
     }
*/

int main()
{
  int n=0,i=0,v[n];
  system("chcp 1252");
  printf("Entre o tamanho do vector menor que 5000: ");
  scanf("%i", &n);
  printf("%i\n",n);
  printf("%i\n",i);
  for (i=0;i<n;i++){
  printf("O valor %i é?\n",i);
  scanf("%i", &v[i]);
                   }
  printf("O vector u é:\n");
  i=0;
  for (i=0;i<n;i++){ 
  printf("%i, ",v[i]);
                    }
  printf("\n");
  system("pause");
  return 0;     
}

Isto é definir um máximo e depois solicitar ao utilizador um valor?

E o que é uma lacuna num vector??

Atenciosamente

Servn

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora fiquei com outra questão, não usando a função malloc é possível iniciar um vector sem definir a sua dimensão?

Não. Se não indicares a dimensão como é que o compilador sabe quanto espaço tem de reservar em memória? Resposta: não sabe.

No código que apresentaste definiste Dim 3, isso é obrigatório?

Não, isso foi só para definir a dimensão do vector e evitar ter que alterar esse valor quando queria mudar a dimensão do vector. Assim, bastava alterar na directiva do #define DIM.

Ou posso por exemplo fazer:

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

#define NMAX 5000
/*int verifica(int u[], int n)
{
   int i;
   for (i=0,i<n,i++);
     
     
     }
*/

int main()
{
  int n=0,i=0,v[n];
  system("chcp 1252");
  printf("Entre o tamanho do vector menor que 5000: ");
  scanf("%i", &n);
  printf("%i\n",n);
  printf("%i\n",i);
  for (i=0;i<n;i++){
  printf("O valor %i é?\n",i);
  scanf("%i", &v[i]);
                   }
  printf("O vector u é:\n");
  i=0;
  for (i=0;i<n;i++){ 
  printf("%i, ",v[i]);
                    }
  printf("\n");
  system("pause");
  return 0;     
}

Isto é definir um máximo e depois solicitar ao utilizador um valor?

Podes fazer isso, pois no standard C99 foram introduzidos os VLAs, que te permitem definir a dimensão de um array em tempo de execução, contrariamente ao que antes era possível (defini-lo apenas em tempo de compilação).

E o que é uma lacuna num vector??

Deve ser um índice ao qual não atribuíste nenhum valor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Baderous obrigado por todas as ajudas que tens dado.

Então quer dizer que tenho sempre de colocar uma dimensão máxima, e depois posso solicitar uma dimensão para o vector, inferior a esse valor?

Ou corro o risco de o compilador não saber quanto espaço deve reservar. Isto supondo que não utilizo a função malloc.

Se eu pedir ao utilizador os valores depois de indicar a dimensão ele deve colocá-los todos pois não o fazendo o programa não avança. Assim como está no código que coloquei.

Não tem lógica ele dizer que precisa de "10 espaços" e depois só querer inserir 4, certo?

Obrigado novamente.

Servn

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então quer dizer que tenho sempre de colocar uma dimensão máxima, e depois posso solicitar uma dimensão para o vector, inferior a esse valor?

Ou corro o risco de o compilador não saber quanto espaço deve reservar. Isto supondo que não utilizo a função malloc.

Ou indicas a dimensão máxima ou solicitas a dimensão. Não fazes as 2 coisas.

Se eu pedir ao utilizador os valores depois de indicar a dimensão ele deve colocá-los todos pois não o fazendo o programa não avança. Assim como está no código que coloquei.

Não tem lógica ele dizer que precisa de "10 espaços" e depois só querer inserir 4, certo?

Podes declarar um array de 10 posições e inicializar apenas 4. As restantes posições são inicializadas com valores desconhecidos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

#define NMAX 5000

int main()
{
  int n=0,i=0,v[n];
  system("chcp 1252");
  printf("Entre o tamanho do vector menor que 5000: ");
  scanf("%i", &n);
  printf("%i\n",n);
  printf("%i\n",i);
  for (i=0;i<n;i++){
  printf("O valor %i é?\n",i);
  scanf("%i", &v[i]);
                   }
  printf("O vector u é:\n");
  i=0;
  for (i=0;i<n;i++){
  printf("%i, ",v[i]);
                    }
  printf("\n");
  system("pause");
  return 0;     
}


Então não preciso desta linha

#define NMAX 5000

??? :):P

Preciso apenas de

 int n=0,i=0,v[n];
  system("chcp 1252");
  printf("Entre o tamanho do vector menor que 5000: ");
  scanf("%i", &n);

Tendo obviamente de dar um valor a n tal como fiz.

Podes declarar um array de 10 posições e inicializar apenas 4. As restantes posições são inicializadas com valores desconhecidos.

Mas se é o utilizador que coloca de cada vez que ele não coloca fazendo Enter o programa fica à espera correcto, só dando a possibilidade de o utilizador deixar de inserir valores é que ele pode avançar. Usando por exemplo um While em que se o utilizador escrever N ele pára.

Estou a inventar ou nem por isso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Era capaz de ser boa ideia só inicializar o vector depois de leres o valor do n.

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