Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

guilhoto

problema na funçao

Mensagens Recomendadas

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

Editado por pmg
Falta LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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");
}

Editado por pmg
Falta LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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]'

Editado por pmg
Falta LP no GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.