Jump to content
Sign in to follow this  
blue_ice

Duvida vector em C

Recommended Posts

blue_ice

Boa noite

Estou com uma duvida na construção de um programa que leia um vector de números inteiros positivos, o que se pretende é que o vector não tenha limite ou seja tanto pode ler 1 número como 10000.

a minha questão é em como fazer que ele não tenha limite.

Agradeço a ajuda disponibilizada.

Share this post


Link to post
Share on other sites
TheDark

Ou perguntas ao utilizador quantos números quer inserir (que não deve ser o pretendido), ou inicias com um array de tamanho determinado, e quando preencheres todas as posições do array, alocas memória nova, copias os elementos, e libertas o array antigo.


Desaparecido.

Share this post


Link to post
Share on other sites
blue_ice

Boas,

Estou como uma duvida, como é que posso por um programa em c a percorrer um determinado vector de forma a ser circular, também como é que meto o programa a andar x posições para a frente quando lê um determinado numero do vector?

do genro vector 65422583 lê o numero 6 na posição 0 e anda 6 números para a frente até ao 8.

Obrigado pela ajuda disponível

Share this post


Link to post
Share on other sites
Baderous

Para ser circular tens de jogar com a função do resto da divisão (%) e com o tamanho do vector. Para andar o número de posições que queres é só incrementar o índice no número pretendido.

Share this post


Link to post
Share on other sites
blue_ice

boas

Importas-te de dar um exemplo para eu poder perceber melhor o que queres dizer?

obrigado

Share this post


Link to post
Share on other sites
Baderous

#include <stdio.h>

#define DIM 5

int main(void) {
    int array[DIM]={1,2,3,4,5};
    int i;
    for (i=0;i<10;i++)
        array[i%DIM] = i+1;
    for (i=0;i<DIM;i++)
        printf("%d\n",array[i]);
    return 0;
}

Tens aqui um array de 5 posições que vai ser iterado num ciclo com 10 iterações em que, em cada uma, actualizo a posição do array indicada pelo índice i com o valor do índice incrementado em 1 unidade. Ao utilizar o i%DIM estou a dizer que quando ele chegar à posição final do array, volta ao início, pois sendo i=5 e DIM=5, i%DIM = 0, logo reinicia o índice. As iterações fazem as seguintes substituições:

i: array[ i]

1ª iteração (0<=i<=5)

0: 1

1: 2

2: 3

3: 4

4: 5

2ª iteração (5<=i<10)

0: 6

1: 7

2: 8

3: 9

4: 10

Share this post


Link to post
Share on other sites
amp48rc

E se o vector não estiver todo preenchido ?

A última posição não pode ser utilizada nos cálculos se o vector não estiver todo preenchido pois não ?

Como fazer neste caso para saber qual a última posição preenchida no vector e torná-lo circular ?

Se for um vector de inteiros como se detecta o preenchimento das posições ?

Obrigado.

Share this post


Link to post
Share on other sites
Baderous

Pode, não interessa o que está lá dentro (está sempre alguma coisa), só interessa é saber a sua dimensão (tamanho do array e não o nº de elementos com que foi inicializado).

O exemplo que dei já foi com vector de inteiros.

Share this post


Link to post
Share on other sites
amp48rc

No teu exemplo a variável DIM é o número de valores preenchidos não é ?

Mas o vector foi preenchido por ti.

Mas se o vector for preenchido com input do teclado como se controla o que está preenchido ?

Obrigado.

Share this post


Link to post
Share on other sites
Baderous

Tu precisas de ir estudar arrays antes de fazeres essas perguntas.

1) DIM é o tamanho que eu defini para o meu array. O tamanho NÃO É o número de elementos que eu coloquei no array! Neste caso foi porque me apeteceu.

2) Sempre que crias um array ele é inicializado com valores desconhecidos. Isto é diferente de não ter nada! Ele tem lá valores, mas não se sabe quais são a menos que faças um printf desses valores! Depois é que nós podemos atribuir valores às posições do array que irão sobrepor-se a esses valores já existentes! Capiche?

3) Como controlas o que está preenchido? Podes colocar uma flag na posição seguinte à última que preencheste a indicar que na posição anterior se encontra o último valor introduzido via teclado. É um pouco como o '\0' nas strings.

EDIT: http://stackoverflow.com/questions/201101/how-to-initialize-an-array-in-c

Share this post


Link to post
Share on other sites
amp48rc

Desde já agradeço a tua paciência em responder a perguntas tão básicas.

Tens alguma sugestão para a flag a utilizar e como testar o fim do preenchimento com essa flag.

Podias refazer o teu exemplo por favor para esse caso ?

Obrigado.

Share this post


Link to post
Share on other sites
Baderous

Isso depende um pouco daquilo que queres ler para o array. Se só quiseres ler inteiros positivos podes, por exemplo, colocar um inteiro negativo como o -1 para representar a flag.

Share this post


Link to post
Share on other sites
amp48rc

Sim só quero ler inteiros positivos.

A ideia é percorrer o vector de forma circular ou seja da última posição passar para a primeira.

Ex:

int vector[5]={10,9,2,0,0};

1. ler vector[0] que neste caso é 10.

2. Percorrer 10 posições como se o vector fosse circular.

3. Teria que passar por 9,2 -> 10,9,2 -> 10,9,2 -> 10 e parar em 9 -> array[1]

Para isso posso inicializar o vector desta forma ?

int vector[5]={0,0,0,0,0};

E para passar da última posição preenchida do vector para a primeira, como faço ?

Obrigado.

Share this post


Link to post
Share on other sites
Baderous

Bem terás entao o vector:

int vector[5] = {10,9,2,-1,0}

Percorres o vector até encontrares o -1 e vais contando o nº de elementos. O nº que obtiveres vai ser o teu DIM do meu exemplo anterior. A partir daí é igual.

Share this post


Link to post
Share on other sites
amp48rc

Obrigado Baderous.

Já consigo detectar o último valor preenchido do vector.

Já consigo ler o primeiro valor do vector e calcular  o nº de posições que ele vai percorrer.

Não consigo perceber como voltar ao ínicio do vector continuando a contar posições:

Ex:

int vector[6]={10,11,22,17,0,0};

1. Já controlo o nº de valores preenchidos (neste caso n=4)

2. Já sei que o nº de posições que ele vai percorrer no ínicio (neste caso vector[0]%n=2 -> 10%4=2).

3. Vou ter que me deslocar para a posição vector[2] e calcular o nº de posições a percorrer:

vector[2]%n=2 -> 22%4=2

4. Só que agora tinha que ir para a posição vector[0] (vector[2] + 2 posições) e isso não estou a conseguir.

Baderous podes explicar melhor como conseguir este movimento ?

Obrigado.

Share this post


Link to post
Share on other sites
blue_ice

Boa noite

Não estou a conseguir por o programa a ler a 1º posição do vector nem que ele ande x posições para a frente consoante a valor no qual ele estiver ler.

Alguém me pode dar uma ajuda?

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
Sign in to follow this  

×
×
  • 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.