Ir ao conteúdo
  • Cadastre-se

C estruturas, chamada na funçao principal


rsd_17

Posts recomendados

sera que alguem pode corrigir este exercicio para mim? obrigada.

 

#include <stdio.h>
 #define N 10


//as estruturas sao dadas no enunciado


typedef struct _data{    
    int dia, mes, ano; 
}Data; 
 
typedef struct _hora{    
    int hora, minuto; 
}Hora; 
 
typedef struct _prova{   
    char nome[255];    
    Data data;   
    float distancia;   
    Hora tempo;
}Prova;


int lista( Prova prova,int N ){

    
int i=0;

for(i=0;i<10;i++){
    
    if (prova[ i ].data == 2010){
        printf("%d # %s # %f # %d",prova[ i ].data,prova[ i ].nome,prova[ i ].distancia,prova[ i ].tempo);    
    }
}        
    return 0;
}

int tempo( Prova prova,int N){

int i;

    for(i=0;i<N;i++){
        
        if(prova[ i ].tempo > prova[i+1].tempo){
            menor=prova[i+1].tempo;
        }else{
            menor=prova[ i ].tempo;
        }

    }
    
    return 0;    
}


int crescente( Prova prova,int N){
    
int i, maior;    
    for(i=0;i<N;i++){
        for(j=0;j<(N-1);j++){
            if(prova[ i ].nome>prova[i+1].nome){
                maior=prova[i+1].nome;
                prova[i+1].nome=prova[ i ].nome;
                prova[ i ].nome=maior;    
            }
        }
    }
    
    for(i=0;i<N;i++){
        printf("%c \n ",v.nome);
    }
    
    return 0;
}


int main(){
    
FILE *fp;


int i=0;

Prova prova[N];

if((fp=fopen("provas.txt","rt"))==NULL){
    printf("erro na abertura do ficheiro");
}else{
    
    while(!feof(fp)){
        fgetc(fp);
        fscanf("%d # %s # %f # %d",&prova[ i ].data,&prova[ i ].nome,&prova[ i ].distancia,&prova[ i ].tempo);
    i++;
}
    
    
}
fclose(fp);

crescente(prova, N);
tempo( prova,N);
lista( prova, N );

return 0;    
} 

1.png

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@rsd_17 Olá. Tem um ponto q chama muito a atenção no seu código. Em todas as funções você está colocando return 0. Somente no main é q colocamos o return 0. A não ser q em alguma função a gente queira mesmo retornar o valor 0. Tipo: se na função a condição é verdadeira retornamos 1, se é falsa retornamos 0.

Você pode definir o tipo de retorno das suas funções como void (que não retorna nada). Ex:

void lista( Prova *prova, int N ) // perceba q tem um * como parâmetro do tipo Prova. Isso é porque se trata de um vetor

Também tem a questão de você ter uma struct dentro de outra. Ex:

typedef struct _prova{
    char nome[255];
    Data data; // struct _data
    float distancia;
    Hora tempo; // struct _hora
}Prova;

Nesse caso, para verificar o ano, por exemplo, na função lista seria isso:

if (prova[i].data.ano == 2010)

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá @rsd_17.

 

Sobre:

4 horas atrás, rsd_17 disse:

sera que alguem pode corrigir este exercicio para mim? obrigada.

 

Corrigir o quê? a orientação é que nos indique o que não está funcionando, para assim tentarmos focar no que você precisa.

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Alguns pontos:

1#

Ao tentar compilar, está dando alguns erros. Aqui no meu Dev-C++ deu:

2	12	C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\_FONTES\_FCdH.c	[Error] expected ';', ',' or ')' before numeric constant
24	28	C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\_FONTES\_FCdH.c	[Note] in expansion of macro 'N'
2	12	C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\_FONTES\_FCdH.c	[Error] expected ';', ',' or ')' before numeric constant
38	28	C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\_FONTES\_FCdH.c	[Note] in expansion of macro 'N'
2	12	C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\_FONTES\_FCdH.c	[Error] expected ';', ',' or ')' before numeric constant
56	32	C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\_FONTES\_FCdH.c	[Note] in expansion of macro 'N'
C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\_FONTES\_FCdH.c	In function 'main':
92	16	C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\_FONTES\_FCdH.c	[Warning] passing argument 1 of 'fscanf' from incompatible pointer type
1	0	C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\_FONTES\_FCdH.c	In file included from C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\_FONTES\_FCdH.c
385	15	C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\MinGW64\x86_64-w64-mingw32\include\stdio.h	[Note] expected 'struct FILE * __restrict__' but argument is of type 'char *'
92	36	C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\_FONTES\_FCdH.c	[Warning] passing argument 2 of 'fscanf' from incompatible pointer type
1	0	C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\_FONTES\_FCdH.c	In file included from C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\_FONTES\_FCdH.c
385	15	C:\Users\Simon\OneDrive\Note\_My Portable\Dev-C++ v5.11 (4.92 x64)\MinGW64\x86_64-w64-mingw32\include\stdio.h	[Note] expected 'const char * __restrict__' but argument is of type 'struct Data *'

 

Então, pegando em ordem temos um erro na linha 2. Ele inicialmente me pareceu estranho... fiquei com dúvida se era na sintaxe, após confirmar que está certo, analisei as outras linhas de erros... e foi identificado que está utilizando um mesmo label para duas coisas distintas... por algum motivo isso não funciona.

 

RESUMIDAMENTE:

Aproveite para mudar para algo como:

#define MAX 10

 

obs.: se é que seja para um "máximo" mesmo... mas o que importa é que o label  N não poderia. Ou se for usar N, teria que mudar lá onde também está com N.

 

 

 

2#

Após mudar de acordo com o 1#, compilando novamente deu mais outros erros, o primeiro foi:

27	18	...\_FONTES\_FCdH.c	[Error] subscripted value is neither array nor pointer nor vector

Que no código deu essa linha:

        if (prova[i].data == 2010) {

obs.: o número da linha pode não coincidir ai... basta dar um clique duplo no erro, que vai pra linha.

 

A coluna corresponde ao [], e pelo erro informado, vemos que deu algo relacionado a vetores, ou seja, está tentando acessar posições como se fosse um vetor, em algo que não é um vetor! ... seria o que @giu_d sugeriu:

 

3 horas atrás, giu_d disse:

void lista (Prova *prova, int N) // perceba q tem um * como parâmetro do tipo Prova. Isso é porque se trata de um vetor

 

Ou seja, precisaria do * ali para usar essa variável como um ponteiro, daí fazer funcionar o [] lá no erro da linha...

 

 

 

 

3#

Corrigindo o 2#, deu:

27	27	...\_FONTES\_FCdH.c	[Error] invalid operands to binary == (have 'Data' and 'int')

 

Aí está relacionado ao "tipo de dados". Está comparando uma Data (struct), com um número (int). São tipos incompatíveis.

 

Ai seria também como @giu_d sugeriu:

3 horas atrás, giu_d disse:

Nesse caso, para verificar o ano, por exemplo, na função lista seria isso:


if (prova[i].data.ano == 2010)

 

 

 

***

 

Por ai vai...

 

Tente ir compilando e analisando os erros. E vai corrigindo.

 

Se tiver alguma dúvida, nos informa qual e onde.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@rsd_17 Olá. Tem mais coisas para ajustar. 

1 minuto atrás, rsd_17 disse:

num subprograma nao seria -> em vez do ponto ?

 

Nesse caso está funcionando com o ponto. 

Definir um parâmetro função dessa forma:

void lista( Prova *prova, int N )

Funciona do mesmo modo q dessa:

void lista( Prova prova[], int N )

Só não me peça para explicar a respeito disso porque não tenho ainda a maturidade necessária para dar uma boa resposta (explicação) com respeito a esse assunto: vetor/ ponteiro (diferenças).

Vamos torcer para q algum colega aqui apresente uma explicação :thumbsup: 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
6 minutos atrás, giu_d disse:

Só não me peça para explicar a respeito disso porque não tenho ainda a maturidade necessária para dar uma boa resposta (explicação) com respeito a esse assunto: vetor/ ponteiro (diferenças).

Vamos torcer para q algum colega aqui apresente uma explicação :thumbsup: 

 

Também não sei, mas uma coisa é clara:

Da forma que estava, estava recebendo uma única Prova... mas o método precisa de um vetor. Essa é a questão.

 

Daí, a sintaxe do C diz que para passar um vetor como parâmetro, poderia usar um *, como sugeriu inicialmente, ou usar [].

 

Em relação ao *, creio eu que tem toda uma lógica relacionada a ponteiros... onde os dados são armazenados em sequência.. daí, ou usar o [x] (indicando a posição que quer), o computador vai pulando de posição em posição até chegar... em fim, acho que isso não é importante no momento.

Link para o comentário
Compartilhar em outros sites

@rsd_17 Olá. Nesse erro você não está dizendo se é hora ou  minuto. Você está dizendo apenas tempo

Dá uma olhada na forma como ficaria usando minutos:

if(prova[i].tempo.minuto > prova[i+1].tempo.minuto) {

 

 

adicionado 7 minutos depois

@rsd_17

22 minutos atrás, rsd_17 disse:

mas eu estou a usar um vetor (Prova prova[N]; ), logo nao precisaria de usar apontadores porque por definiçao estes ja possuem ou nao?

 

Desculpa mas não entendi essa pergunta. Daria para explicar melhor qual é a dúvida?

Link para o comentário
Compartilhar em outros sites

@rsd_17 prova[i+1].nome se refere a uma string, e maior é do tipo int.  

Ou melhor, como diz na mensagem de erro: operandos são do tipo Prova{} e int.

 

Tô gostando de ver seu interesse e disposição para aprender! Se você continuar assim tenha, desde já, certeza q vai longe!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@rsd_17, percebe que seu código tem várias errinhos... isso não deveria acontecer, ou seja, a medida que vai implementando, já vai testando... Quando vai implementar uma coisa nova, espera-se que as coisas atuais já estejam funcionando... :)

 

Entende? seria como você fosse implementando, mesmo o código não estando compilável... mas não tem problema...

 

 

Vamos lá:

 

Sobre:

1 hora atrás, rsd_17 disse:

@giu_d certo mas o q significa este erro? 

nesta linha :     maior=prova[i+1].nome;&key=932d69d8514fc575&key=932d69d8514fc575

1.png

 

Você já ajustou o parâmetro do método para receber um vetor?

 

O código original está assim:

7 horas atrás, rsd_17 disse:

int crescente( Prova prova,int N){

 

Ai você está recebendo apenas uma prova, mas deveria ser um vetor!!!

 

Outro ponto é sobre o comentado por @giu_d:

1 hora atrás, giu_d disse:

@rsd_17 prova[i+1].nome se refere a uma string, e maior é do tipo int.  

 

Mas creio eu que ai seja outro erro... mas que de qualquer forma precisará ser resolvido... basta definir maior com o mesmo tipo que .nome está (char nome[255]).

 

***

 

Por ai vai.

 

 

Tenta corrigir. Caso tenha outra dúvida, por favor, antes poste o código completo para revisarmos, ok?

 

 

No aguardo.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...