Jump to content
servn

Vectores

Recommended Posts

servn

Boa noite

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

tenciosamente

Servn

Share this post


Link to post
Share on other sites
Baderous

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

Share this post


Link to post
Share on other sites
servn

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

Share this post


Link to post
Share on other sites
Baderous

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.

Share this post


Link to post
Share on other sites
servn

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

Share this post


Link to post
Share on other sites
Baderous

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.

Share this post


Link to post
Share on other sites
servn

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

Share this post


Link to post
Share on other sites

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.