Jump to content
Elyst

ler, imprimir e inverter vectores

Recommended Posts

Elyst

Boas tardes,

Sou um iniciado em programação e estou a criar um pequeno programa que lide com vectores.

O objectivo seria que o programa regista-se valores dados pelo utilizador, fosse capaz de imprimir o vector e por fim inverter o mesmo.

A minha ideia inicial era criar um menu simples no main. Teria um ciclo propositadamente infinito que pedia ao utilizador um número e com base nesse número corria uma função (por exemplo ao carregar no 2 o programa ia ler o vector e correr a função destinada para esse mesmo fim). Logicamente um dos botões terminaria o programa.

os erros que o meu código dá:

. Ao executar uma das funções ele diz "falha na segmentação"

. Não sei exactamente como fazer para inverter o vector. Pensei em escreve-lo ao contrario começando o ciclo em 100 e correndo até 0. Mas se o vector só tiver 10 números então o que isto fará será escrever 90 zeros e termina a função

. uma pergunta : para chamar o vector para uma função qualquer tenho de usar v[100] ou posso apenas escrever v ? Isto porque v[100] é um vector com 100 posições de memória e v é apenas um inteiro não é?

#include <stdio.h>

int writevector (int v[100]) /*regista valores no vector*/
{
  int i;
  printf("insira os valores a preencher no vector, para parar introduza o valor '-1' ");

  for(i=0;i<100;i++)
  {scanf("%d",&v[i]);
  if(i==(-1)) {printf("terminou o vector"); break;}
  }
}



int printvector (int v[100])	/*escreve os valores no vector*/
{
  int i;
  printf("escrevendo o vector...");
  for(i=0;i<100;i++)
  { printf("%d ",v[i]);
    if(i==(-1)) {printf("terminou o vector"); break;}
  }
}



int invertvector (int v[100])	/*inverte os valores no vector*/
{
  int i;

  for(i=100;i>0;i--)
  {
   printf("%d",v[i]);
   if(i==(-1)) {printf("terminou o vector"); break;}
  }
}



int main ()
{
  int v[100], i, c;
  
  for(i;
  {
  printf("(1) escrever. (2) ler. (3) inverter, (4) sair do programa ");
  scanf("%d",&c);
  
  switch (c)
    {	case (1): writevector (v[100]); break;
        case (2): printvector (v[100]); break;
case (3): invertvector (v[100]); break;
case (4): return 0;
    }
   }
return 0;
}

Muito obrigado pela ajuda

Cumps.

PS: desculpem qualquer erro ridículo que apareça por aí, por enquanto não vejo nenhum mas estou certo que deve haver muitos  😳


“The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.”(Seymour Cray)

Share this post


Link to post
Share on other sites
Localhost

O problema de segmentation fault está precisamente na maneira como chamas as tuas funções e como as defines. Para se passar um vector para uma função tens de ter (na definição - cabeçalho - da função) um ponteiro que vai receber o primeiro elemento - o seu endereço - e mandar para ela esse mesmo endereço.

Em código:

void print_string (char *my_string) // recebe o endereço do inicio da string
{
    scanf ("%s", my_string);
    printf ("%s\n", my_string);
}

char my_string[MAX];

print_string (my_string); // passámos o endereço do primeiro elemento. Também podia ser: print_string (&my_string[0]);

Em relação ao problema de inverter a string, tens que utilizar a função strlen.


here since 2009

Share this post


Link to post
Share on other sites
NelsonBN

verifica lá assim:

#include <stdio.h>

int writevector (int *v) /*regista valores no vector*/
{
  int i,aux;
  printf("insira os valores a preencher no vector, para parar introduza o valor '-1' ");

  for(i=0;i<100;i++)
  {scanf("%d",&aux);
  if(aux==(-1)) {printf("terminou o vector"); break;}
else { v[i] = aux;}
  }
return i;
}



int printvector (int *v, int t)        /*escreve os valores no vector*/
{
  int i;
  printf("escrevendo o vector...");
  for(i=0;i<t;i++)
  { printf("%d ",v[i]);  }
}



int invertvector (int *v, int t)        /*inverte os valores no vector*/
{
  int i;

  for(i=t-1;i>=0;i--)
  {
   printf("%d ",v[i]);
  }
}



int main ()
{
  int v[100], i, c,z=0;

  for(i;
  {
  printf("(1) escrever. (2) ler. (3) inverter, (4) sair do programa ");
  scanf("%d",&c);

  switch (c)
    {        case (1): z=writevector (v); break;
        case (2): printvector (v,z); break;
        case (3): invertvector (v,z); break;
        case (4): return 0;
    }
   }
return 0;
}

Share this post


Link to post
Share on other sites
Elyst

Já percebi qual o meu erro. Devia chamar o vector para as funções como um apontador, estou a ver...

Estive a testar as alterações que o NelsonBN fez e o programa funciona bem. Ainda assim restam-me 3 perguntas.

1) Como é que é feita a inversão do vector? Chamas para a função também um inteiro "z" que é zero... portanto o ciclo nem deveria começar... será que podias explicar melhor este ciclo "for(i=t-1;i>=0;i--)" na parte em que o vector é invertido?

2) Na função que escreve o vector tenho a mesma dúvida. Como é que a função não escreve o -1 ?

3) Não é muito importante mas no fim do programa escrevi "return 0;" a seguir ao ciclo infinito. É redundante pois o programa nunca vai usar aquela linha de código. O programa nunca sairá do ciclo a menos que eu use o "case (4)". Seria melhor eu mudar para

case (4): break;
    }
   }
return 0;
}

acho que esta questão é mais relacionada com o que é de facto boa prática e não tanto quanto ao como funciona. Mas também convém ter boa prática para manter programas claros e simples.

Muito obrigado pela ajuda.

Cumps.


“The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.”(Seymour Cray)

Share this post


Link to post
Share on other sites
NelsonBN

1) Como é que é feita a inversão do vector? Chamas para a função também um inteiro "z" que é zero... portanto o ciclo nem deveria começar... será que podias explicar melhor este ciclo "for(i=t-1;i>=0;i--)" na parte em que o vector é invertido?

Se reparares bem z só vai ter zero quando o programa arranca.... depois de inserires os valores no vector, ele assume o numero de valores inseridos no vector....

case (1): z=writevector (v); break;

2) Na função que escreve o vector tenho a mesma dúvida. Como é que a função não escreve o -1 ?

scanf("%d",&aux);
  if(aux==(-1)) {printf("terminou o vector"); break;}
        else { v[i] = aux;}

repara que recebes os valores para uma variável auxiliar, e depois verificas se é igual a -1, caso seja interrompes o "for", caso contrario manda o valor dessa variável para o vector...

3) Não é muito importante mas no fim do programa escrevi "return 0;" a seguir ao ciclo infinito. É redundante pois o programa nunca vai usar aquela linha de código. O programa nunca sairá do ciclo a menos que eu use o "case (4)". Seria melhor eu mudar para

é suficiente este:

case (4): break;
    }
   }
return 0;
}

mas eu para fazer menus, sou mais adepto da função do..while,

na minha opinião do ciclo for deve ser usado quando sabemos o inicio e fim de algo....

os ciclos while e do..while deve ser usados quando sabemos quando determinada coisa começa, mas não sabemos ao certo quando acaba.... mas isto é a minha opinião....

mas como já deves ter reparado em programação, há muitas maneiras de resolver o mesmo problema...

Share this post


Link to post
Share on other sites
Elyst

só para esclarecer.

1) Z vai portanto tomar o ultimo valor do vector certo? e é usado para marcar o fim na função que escreve o vector certo?

2) exactamente, vi o if mas não pensei, mea culpa.

3) entendi, no meu caso o programa tem return 0 no caso do (4) e no final do programa, mas ele nunca chega ao final do programa por isso é redundante. Quando a sugestão, vou começar a usar mais o do while nestes casos assim até treino uma função que não conheco tão bem.

Obrigado pela ajuda, acho que já estou a compreender o funcionamento do programa.

Um grande abraço.


“The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.”(Seymour Cray)

Share this post


Link to post
Share on other sites
NelsonBN

1) Z vai portanto tomar o ultimo valor do vector certo? e é usado para marcar o fim na função que escreve o vector certo?

atenção.... z não vai receber o ultimo valor de vector... vai sim receber o numero da ultima posição do vector preenchida....

mas agora que estas a falar nisso e para esta minha afirmação fazer sentido o correcto seria colocar antes assim

na função "writevector()"

return i-1;

e na função "printvector()"

for(i=0;i<=t;i++)

e na função "invertvector()"

for(i=t;i>=0;i--)

o efeito vai ser o mesmo.... mas assim faz mais sentido, porque assim o função writevector() retornar sempre o numero de elementos inseridos....

Share this post


Link to post
Share on other sites
Elyst

muito obrigado pela ajuda.

Reparei agora que se pretendia que a inversão do vector fosse guardada num outro vector mas isso são alterações que faço facilmente depois... espero eu...


“The trouble with programmers is that you can never tell what a programmer is doing until it’s too late.”(Seymour Cray)

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.