guilhoto Posted March 28, 2013 at 01:24 PM Report #500680 Posted March 28, 2013 at 01:24 PM (edited) void registo(char* aux){ aux[0]=' '; strcpy(lista_socios[i],aux); num_socio[i]=numero_socio; meses[i]=0; credito[i]=0; nModalidades[i]=0; numero_socio++; i++; conta+=200; } tenho esta funçao mas nao consigo passar os valores obtidos para a funçao main...alguem sabe porque? por exemplo, fiz 1 printf no fim da funçao e no fim da chamada da funçao no main e o i na 1ª vez que a chamo da 1 no printf da funçao e na funçao main da 0... Edited March 28, 2013 at 02:04 PM by pmg Falta LP no GeSHi
pmg Posted March 28, 2013 at 02:09 PM Report #500687 Posted March 28, 2013 at 02:09 PM Evita variaveis globais a todo o custo! como a variável i não está declarada/definida na tua função e supondo que esta função é parte de um código maior que compila ==> então, pelo menos dentro desta função, i é uma variável global. Se noutras funções declaras/defines outra variável com o mesmo nome, nessas funções o uso do identificador refere-se à variável local. Em vez de usares variáveis globais, usa somente variáveis locais e, quando necessário, passa o seu valor ou endereço para outras funções que precisam de saber/alterar o valor da variável. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
guilhoto Posted March 28, 2013 at 02:28 PM Author Report #500689 Posted March 28, 2013 at 02:28 PM (edited) ja meti as variaveis como sendo locais...mas mesmo assim nao estou a conseguir perceber como vou meter esses valores no main... #include <stdio.h> #include <stdlib.h> #include <string.h> void registo(char* coise){ int i=0, num_socio[1000],meses[1000], credito[1000], nModalidades[1000], conta=0, numero_socio=101; char lista_socios[1000][101], aux[101]; aux[0]=' '; strcpy(lista_socios[i],aux); num_socio[i]=numero_socio; meses[i]=0; credito[i]=0; nModalidades[i]=0; numero_socio++; i++; conta+=200; } main(){ char lista_socios[1000][101], aux[101], modalidades[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Y','W','Z'}; char aux2[101], aux3[101]; int num_socio[1000], meses[1000], credito[1000], nModalidades[1000], i,j=0, numero_socio=101, conta=0, n_praticantes[26],v=0,u, soma_creditos=0,q=0; int l,y; while(aux[0]!='x'){ scanf(" %[^\n]", &aux); char aux2[101]=""; v=0; j=0; q=0; while(j<=strlen(aux)&& q<2){ if(aux[j]=='0'||aux[j]=='1'||aux[j]=='2'||aux[j]=='3'|| aux[j]=='4'||aux[j]=='5'||aux[j]=='6'||aux[j]=='7'||aux[j]=='8'||aux[j]=='9'){ aux2[v]=aux[j]; v++; } if(aux[j]==' '){ q++; } j++; } v=0; while(j<=strlen(aux)){ if(aux[j]=='0'||aux[j]=='1'||aux[j]=='2'||aux[j]=='3'|| aux[j]=='4'||aux[j]=='5'||aux[j]=='6'||aux[j]=='7'||aux[j]=='8'||aux[j]=='9'){ aux3[v]=aux[j]; v++; } j++; } l=atoi(aux3); u=atoi(aux2); if(aux[0]=='r'){ registo(aux); } if(aux[0]=='i'){ if((u-101)<0){ printf("Introduza um numero de socio valido!\n"); } for(j=0; j<26; j++){ if(aux[6]==modalidades[j]|| aux[7]==modalidades[j]){ break; } } n_praticantes[j]++; conta+=10; nModalidades[u-101]++; credito[u-101]+=10; } if(aux[0]=='l'){ if(aux[2]=='0'){ j=0; while(j<i){ printf("%d %s %d %d %d\n", num_socio[j], lista_socios[j], meses[j], credito[j], nModalidades[j]); j++; } } if(aux[2]=='1'){ j=0; while(j<=i){ if(nModalidades[j]>0){ printf("%d %s %d %d %d\n", num_socio[j], lista_socios[j], meses[j], credito[j], nModalidades[j]); } j++; } } if(aux[2]=='2'){ j=0; while(j<i){ if(credito[j]<=0){ printf("%d %s %d %d %d\n", num_socio[j], lista_socios[j], meses[j], credito[j], nModalidades[j]); } j++; } } if(aux[2]=='3'){ j=0; while(j<=26){ if(n_praticantes[j]>0){ printf("%c %d\n", modalidades[j], n_praticantes[j]); } j++; } } } if(aux[0]=='+'){ j=0; while(j<i){ if(nModalidades[j]>0){ credito[j]=credito[j]-(nModalidades[j]*10); } if(credito[j]<-100){ nModalidades[j]=0; } meses[j]++; j++; } printf("%d\n", conta); conta=0; } if(aux[0]=='k'){ if((u-101)<0){ printf("Introduza um numero de socio valido!\n"); } for(j=0; j<26; j++){ if(aux[6]==modalidades[j]|| aux[7]==modalidades[j]){ break; } } n_praticantes[j]--; nModalidades[u-101]--; } if(aux[0]=='p'){ credito[u-101]+=l; conta+=l; } soma_creditos=0; j=0; while(j<=i){ soma_creditos=soma_creditos + credito[j]; j++; } } printf("%d %d\n",i, soma_creditos); system("pause"); } Edited March 28, 2013 at 02:38 PM by pmg Falta LP no GeSHi
pmg Posted March 28, 2013 at 02:48 PM Report #500694 Posted March 28, 2013 at 02:48 PM (edited) Se precisas que uma variável local seja alterada dentro duma função, precisas de passar o endereço dessa variável para a função e, dentro da função, actualizar o valor existente nesse endereço. Por exemplo, no código abaixo, a variável raiz é actualizada dentro da função rq() #include <math.h> #include <stdio.h> void rq(int valor, double *result) { *result = sqrt(valor); } int main(void) { double raiz; rq(1000, &raiz); printf("A raiz de 1000 e %f\n", raiz); return 0; } Sugestão: o teu código está muito para a direita. Isso é indicação forte que precisa de ser partido em funções. Funções essas que ficam chegadas à esquerda. Andar a scrollar para ver o código é bastante arreliante. Edited March 28, 2013 at 02:51 PM by pmg What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
guilhoto Posted March 28, 2013 at 06:50 PM Author Report #500722 Posted March 28, 2013 at 06:50 PM eu sei xD. por isso e q o tou agora a partir em funçoes...
guilhoto Posted March 28, 2013 at 07:22 PM Author Report #500733 Posted March 28, 2013 at 07:22 PM nao dara para fazer isso sem usar ponteiros?
pmg Posted March 28, 2013 at 07:27 PM Report #500736 Posted March 28, 2013 at 07:27 PM Dar dá, mas a(s) maneira(s) sem ponteiros sao piores. Assim de repente estou a ver duas maneiras a) usando variaveis globais b) usando estruturas para passar valores dumas funcoes para outras Como considero que qualquer destas solucoes é má, nao dou exemplos. Para uma coisa simples como o meu exemplo anterior de calcular a raiz quadrada, o melhor é devolver directamente o valor em causa. Assim, em vez de definir a funcao como nao devolvendo valor (void rq();) define-se como devolvendo um valor do tipo double double rq(int valor) { return sqrt(valor); } /* ... */ printf("A raiz de 1000 e %f\n", rq(1000)); /* ... */ What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
guilhoto Posted March 28, 2013 at 07:35 PM Author Report #500738 Posted March 28, 2013 at 07:35 PM o problema aqui e que nao quero devolver um valor...quero devolver 7...
guilhoto Posted March 28, 2013 at 07:53 PM Author Report #500740 Posted March 28, 2013 at 07:53 PM int i=0; char lista_socios[1000][101]; void registo(char* coise){ int num_socio[1000],meses[1000], credito[1000], nModalidades[1000], conta=0, numero_socio=101; char aux[101]; coise[0]=' '; strcpy(lista_socios[i],coise); num_socio[i]=numero_socio; meses[i]=0; credito[i]=0; nModalidades[i]=0; numero_socio++; i++; conta+=200; return; } estando a funçao assim a unica coisa que nao passa e lista_socios, alguma ideia porque :S?
pmg Posted March 28, 2013 at 08:12 PM Report #500743 Posted March 28, 2013 at 08:12 PM estando a funçao assim a unica coisa que nao passa e lista_socios, alguma ideia porque :S? Suponho que seja porque o valor de i antes e depois da funcao nao seja o mesmo? o problema aqui e que nao quero devolver um valor...quero devolver 7... A solucao basica imediata é uma estrutura e ponteiros! struct multi { int valor1; double valor2; char valor3[100]; /* ... */ }; int foo(int x, struct multi *result) { result->valor1 = x * x; result->valor2 = sqrt(x); strcpy(result->valor3, "quarenta e dois"); return 0; } int main(void) { struct multi multivalues; if (foo(42, &multivalues)) /* erro */; return 0; } What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
guilhoto Posted March 28, 2013 at 08:50 PM Author Report #500751 Posted March 28, 2013 at 08:50 PM para por agora estruturas teria que alterar o programa todo neh...
guilhoto Posted March 28, 2013 at 09:01 PM Author Report #500754 Posted March 28, 2013 at 09:01 PM (edited) #include <stdio.h> #include <stdlib.h> #include <string.h> int i=0; char lista_socios[1000][101]; void registo(char* coise, char v[1000][101]){ int num_socio[1000],meses[1000], credito[1000], nModalidades[1000], conta=0, numero_socio=101; char aux[101]; printf("%s\n", coise); coise[0]=' '; printf("%s\n", coise); strcpy(v[i], coise); printf("%s\n", v[i]); num_socio[i]=numero_socio; meses[i]=0; credito[i]=0; nModalidades[i]=0; numero_socio++; i++; conta+=200; return; } main(){ char aux[101], modalidades[26]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','X','Y','W','Z'}; char aux2[101], aux3[101]; int num_socio[1000], meses[1000], credito[1000], nModalidades[1000],j=0, numero_socio=101, conta=0, n_praticantes[26],v=0,u, soma_creditos=0,q=0; int l,y; while(aux[0]!='x'){ scanf(" %[^\n]", &aux); char aux2[101]=""; v=0; j=0; q=0; printf("%c\n", lista_socios[0][3]); while(j<=strlen(aux)&& q<2){ if(aux[j]=='0'||aux[j]=='1'||aux[j]=='2'||aux[j]=='3'|| aux[j]=='4'||aux[j]=='5'||aux[j]=='6'||aux[j]=='7'||aux[j]=='8'||aux[j]=='9'){ aux2[v]=aux[j]; v++; } if(aux[j]==' '){ q++; } j++; } v=0; while(j<=strlen(aux)){ if(aux[j]=='0'||aux[j]=='1'||aux[j]=='2'||aux[j]=='3'|| aux[j]=='4'||aux[j]=='5'||aux[j]=='6'||aux[j]=='7'||aux[j]=='8'||aux[j]=='9'){ aux3[v]=aux[j]; v++; } j++; } l=atoi(aux3); u=atoi(aux2); if(aux[0]=='r'){ registo(aux, lista_socios[1000][101]);//ERROOOO!! printf("%d\n", i); printf("%s \n", lista_socios[i]); printf("%s\n", aux); } if(aux[0]=='i'){ if((u-101)<0){ printf("Introduza um numero de socio valido!\n"); } for(j=0; j<26; j++){ if(aux[6]==modalidades[j]|| aux[7]==modalidades[j]){ break; } } n_praticantes[j]++; conta+=10; nModalidades[u-101]++; credito[u-101]+=10; } if(aux[0]=='l'){ if(aux[2]=='0'){ j=0; while(j<i){ printf("%d %s %d %d %d\n", num_socio[j], lista_socios[j], meses[j], credito[j], nModalidades[j]); j++; } } if(aux[2]=='1'){ j=0; while(j<=i){ if(nModalidades[j]>0){ printf("%d %s %d %d %d\n", num_socio[j], lista_socios[j], meses[j], credito[j], nModalidades[j]); } j++; } } if(aux[2]=='2'){ j=0; while(j<i){ if(credito[j]<=0){ printf("%d %s %d %d %d\n", num_socio[j], lista_socios[j], meses[j], credito[j], nModalidades[j]); } j++; } } if(aux[2]=='3'){ j=0; while(j<=26){ if(n_praticantes[j]>0){ printf("%c %d\n", modalidades[j], n_praticantes[j]); } j++; } } } if(aux[0]=='+'){ j=0; while(j<i){ if(nModalidades[j]>0){ credito[j]=credito[j]-(nModalidades[j]*10); } if(credito[j]<-100){ nModalidades[j]=0; } meses[j]++; j++; } printf("%d\n", conta); conta=0; } if(aux[0]=='k'){ if((u-101)<0){ printf("Introduza um numero de socio valido!\n"); } for(j=0; j<26; j++){ if(aux[6]==modalidades[j]|| aux[7]==modalidades[j]){ break; } } n_praticantes[j]--; nModalidades[u-101]--; } if(aux[0]=='p'){ credito[u-101]+=l; conta+=l; } soma_creditos=0; j=0; while(j<=i){ soma_creditos=soma_creditos + credito[j]; j++; } } printf("%d %d\n",i, soma_creditos); system("pause"); } mudei o codigo mas ta-me a dar dois erros onde assinalei: -initializing argument 2 of `void registo(char*, char (*)[101])' -invalid conversion from `char' to `char (*)[101]' Edited March 28, 2013 at 09:05 PM by pmg Falta LP no GeSHi
pmg Posted March 28, 2013 at 09:15 PM Report #500758 Posted March 28, 2013 at 09:15 PM Quando defines uma variavel como char gah[10]; isso quer dizer que gah é um array com dez elementos, cada um dos quais é um char. Alem disso gah[10] é a tentativa (ilegal) de aceder a um elemento alem do existente no array. Se defines uma variavel como char baz[10][20]; isso quer dizer baz é um array com dez elementos, cada um dos quais é um array com 20 elementos. Alem disso baz[10] é a tentativa (ilegal) de aceder a um elemento alem do existente no array. Se se ignorar que baz[10] nao existe, e se se tentar aceder a baz[10][20] agora é o vigesimo-primeiro elemento do decimo-primeiro sub-array que nao existe ... e, se existisse, seria do tipo char. No teu codigo definiste um array (em que cada elemento e um array) de mil elementos (sub-arrays). Na linha com erro estas a tentar aceder ao elemento (sub-array) inexistente #1001. Para passares o array completo usa apenas o nome dele! What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
guilhoto Posted March 28, 2013 at 09:23 PM Author Report #500759 Posted March 28, 2013 at 09:23 PM eu o que quero fazer ai e criar uma lista de nomes que possa ter no maximo 1000 nomes e que cada nome possa ter no maximo 101 caracteres... e ali o que quero imprimir e a string toda da posicao i...
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