Elyst 0 Posted April 2, 2011 Report Share Posted April 2, 2011 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) Link to post Share on other sites
Localhost 3 Posted April 2, 2011 Report Share Posted April 2, 2011 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 Link to post Share on other sites
NelsonBN 1 Posted April 2, 2011 Report Share Posted April 2, 2011 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; } Link to post Share on other sites
Elyst 0 Posted April 3, 2011 Author Report Share Posted April 3, 2011 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) Link to post Share on other sites
NelsonBN 1 Posted April 3, 2011 Report Share Posted April 3, 2011 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... Link to post Share on other sites
Elyst 0 Posted April 3, 2011 Author Report Share Posted April 3, 2011 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) Link to post Share on other sites
NelsonBN 1 Posted April 3, 2011 Report Share Posted April 3, 2011 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.... Link to post Share on other sites
Elyst 0 Posted April 4, 2011 Author Report Share Posted April 4, 2011 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) Link to post Share on other sites
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now