Jump to content
guilhoto

problema na funçao

Recommended Posts

guilhoto

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 by pmg
Falta LP no GeSHi

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
guilhoto

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 by pmg
Falta LP no GeSHi

Share this post


Link to post
Share on other sites
pmg

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 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!

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
guilhoto

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?

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
guilhoto

#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 by pmg
Falta LP no GeSHi

Share this post


Link to post
Share on other sites
pmg

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!

Share this post


Link to post
Share on other sites
guilhoto

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


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