Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
rsd_17

C estruturas, chamada na funçao principal

Recommended Posts

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

Editado por Simon Viegas
Inserir tag CODE
  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
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)

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d de resto esta tudo bem? 

num subprograma nao seria -> em vez do ponto ? 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 3

Compartilhar este post


Link para o post
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: 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
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.

Editado por Simon Viegas
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d e @Simon Viegas 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?

-----------

outra coisa, nao estou a perceber este erro o que significa ? Carreguei nele e ele foi para a linha que esta a vermelho

1.png

Editado por rsd_17
  • Curtir 1

Compartilhar este post


Link para o post
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?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d certo mas o q significa este erro? 

nesta linha :     maior=prova[i+1].nome;

1.png

  • Curtir 1

Compartilhar este post


Link para o post
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!

Editado por giu_d
Erro na explicação

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d tem que ser tenho exame na sexta, nao esta fácil fazer esta cadeira. 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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;imageproxy.php?img=&key=932d69d8514fc575imageproxy.php?img=&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.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×