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:  
Jessé P. de Melo

C Dar print dentro de função

Recommended Posts

Boa tarde.

Recentemente comecei a estuda linguagem c de maneira mais profunda, já programo ha algum tempo porém era tudo a base da gambiarra.E como no Arduíno existe um bloco chamado loop (similar ao main) que é executado infinita vezes não dei a devida importância a funções. Resumindo... estou com o seguinte problema:

 

Faca uma função que receba a data atual (dia, mês e ano em inteiro) e exiba-a na tela no formato textual por extenso. Exemplo: Data: 01/01/2000, Imprimir: 1 de janeiro de 2000.

Não dá erro de compilação porém não printa a ultima linha da função.

Programei isso:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main (void){
    char data [11];
    char converte_data(char data[11]);

    printf("Digite a data(DD-MM-AAAA): ");
    scanf("%s",&data);
    fflush(stdin);
    converte_data(data);

}

char converte_data(char data[11]){

        char dia[3];
        dia[0]=data[0];
        dia[1]=data[1];
        dia[2]='\0';
        char mes[3];
        mes[0]=data[3];
        mes[1]=data[4];
        mes[2]='\0';
        char ano[5];
        ano[0]=data[6];
        ano[1]=data[7];
        ano[2]=data[8];
        ano[3]=data[9];
        ano[4]='\0';

        int dia_final;
        int mes_final;
        int ano_final;
        char mes_por_extenso[20];

        dia_final=atoi(dia);
        mes_final=atoi(mes);
        ano_final=atoi(ano);

        switch(mes_final){
        case 1:
        strcpy(mes_por_extenso,"Janeiro");
        break;

        case 2:
        strcpy(mes_por_extenso,"Fevereiro");
        break;

        case 3:
        strcpy(mes_por_extenso,"marco");
        break;

        case 4:
        strcpy(mes_por_extenso,"abril");
        break;

        case 5:
        strcpy(mes_por_extenso,"maio");
        break;

        case 6:
        strcpy(mes_por_extenso,"junho");
        break;

        case 7:
        strcpy(mes_por_extenso,"julho");
        break;

        case 8:
        strcpy(mes_por_extenso,"agosto");
        break;

        case 9:
        strcpy(mes_por_extenso,"setembro");
        break;

        case 10:
        strcpy(mes_por_extenso,"outubro");
        break;

        case 11:
        strcpy(mes_por_extenso,"novembro");
        break;

        case 12:
        strcpy(mes_por_extenso,"dezembro");
        break;

        printf("%i de %s de %i",dia_final,mes_por_extenso,ano_final);
        }
    }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

printf() tá dentro do bloco do switch. Só tirar. :thumbsup:

 

Abraço!

Editado por Fernando Mercês

Compartilhar este post


Link para o post
Compartilhar em outros sites

Afff, meu Deus ! Queria não ter aberto o post e ter prestado mais atenção.:oops:

  • Haha 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em tempo, você pode usar o %d pra ler direto um inteiro usando a scanf(), assim você não precisa ficar convertendo de string:

#include <stdio.h>

int main(int argc, char *argv[]) {

	int dia, mes, ano;

	scanf("%d-%d-%d", &dia, &mes, &ano);
	printf("dia: %d\nmes: %d\nano: %d\n", dia, mes, ano);

	return 0;
}

Veja:

$ ./data
17-05-2018
dia: 17
mes: 5
ano: 2018

Valeu! :wiggle:

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

E o nome de um vetor sem os colchetes já é uma referência para o vetor, logo não é necessário colocar & antes para passar referência:

char data [11];

//Ao invés de:
//scanf("%s",&data);

//Faça:
scanf("%s",data);

Mas como o @Fernando Mercês indicou, nesse caso tem uma maneira bem mais prática para ler a data digitada pelo usuário sem precisar fazer conversão de string para inteiro (pois o próprio scanf() já faz isso).

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

Verdade. E ó, olhando bem esse programa dá pra ser muito pequeno. hehe

 

Acho importante você seguir com sua linha de raciocínio, mas depois que terminar, vale observar essas sugestões minhas e do @isrnick. Tenho mais algumas ó:

  • Usar unsgined int ao invés de int, já que todos esses inteiros aí não podem ser menor que 0 (dia, mês, ano). Isso vai requerer o modificador %u ao invés do %d.
  • Criar um array de strings para os meses e depois exibir diretamente o mês correto usando array[mes - 1]. Teu código vai ficar bem mais limpo, rápido e você vai economizar 12 if's/switch's.
  • Adicionar um tratamento de erro para dia/mês inválido.

Abraço!

Editado por Fernando Mercês

Compartilhar este post


Link para o post
Compartilhar em outros sites

Relaxa. O assunto é extenso à beça hehe.

Por que você não faz o seguinte: quando terminar e funcionar do seu jeito, avisa e volta aqui. Aí a gente discute alguns jeitos de melhorar, pra aprendermos ainda mais. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Fernando Mercês Já terminei, estou corrigindo o que você sugeriu.

adicionado 11 minutos depois

Ficou assim.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void main (void){
    char data [11];
    char converte_data(char data[11]);
    converte_data(data);

}

char converte_data(char data[11]){
        unsigned int dia;
        unsigned int mes;
        unsigned int ano;

        char mes_por_extenso[12][10]={"Janeiro","Fevereiro","marco","abril","maio","junho","julho","agosto","setembro","outubro","novembro","dezembro"};

        printf("Digite a data(DD-MM-AAAA): ");
        scanf("%d-%d-%d",&dia,&mes,&ano);
        fflush(stdin);

        for(int x=0;x<12;++x){
            if(mes-1==x){
                printf("%u de %s de %u",dia,mes_por_extenso[x],ano);
            }
        }
    }

Eu que fiz mais estou em duvida o motivo de "if(mes-1==x)"? Na minha concepção deveria funcionar sem o -1.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esquece parei para reparar aqui. o Mes começa em 1 enquanto o vetor começa em 0. Por isso estava dando erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

Tá bem legal, cara. Parabéns! Já tá bem menor né? :)

 

Quer parar por aí? Porque eu tenho mais sugestões! haha

  • Como você tá inicializando o array, não precisa dizer quantos elementos ele terá. O compilador calcula pra você, mas você vai ter que usar a notação de ponteiro junto, ficando *mes_por_extenso[].
  • Se você reparar, o mes-1 bate com a posição da string certa no array então você não precisa do loop. Se você fizer mes_por_extenso[mes - 1] já vai funcionar sempre, percebe? Se o mês é Março (3), por exemplo, vai pegar a posição 2 do array (mes - 1), sem precisar do laço.
  • Dá pra fazer tudo na main().
  • O retorno da main() é interessante que seja int. Aí você põe um return 0 no fim dela.
  • Você não precisa mais da string.h nem da stdlib.h.
  • Você não precisa mais dessa char data[11] também, porque agora já tá lendo direto para os inteiros com a scanf().
  • Como int é o tipo padrão do C, você não precisa informá-lo ao declarar uma unsigned. Dá pra declarar todas com uma só linha também: unsigned dia, mes, ano;

 

Enfim, seu código tá muito legal. Só tô seguindo com as sugestões porque to admitindo que você tá curtindo implementar. Não encare como crítica, ok? Em programação existem infinitos jeitos de se resolver um problema e não tem essa de certo e errado a meu ver.

 

Grande abraço!

Editado por Fernando Mercês
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Fernando Mercês disse tudo. :thumbsup:

 

A única coisa que eu poderia adicionar seria usar %u no scanf também para ler número inteiro decimal sem sinal (unsigned).

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
7 minutos atrás, Fernando Mercês disse:

Você não precisa mais da string.h nem da stdlib.h.

Da string eu sabia agora stdlib não, sempre uso stdio e stdlib juntas nem sei mais diferenciar as duas, só sei que são bibliotecas para facilitar entrada e saída de dados e realizar algumas operações simples.

 

10 minutos atrás, Fernando Mercês disse:

O compilador calcula pra você, mas você vai ter que usar a notação de ponteiro junto, ficando *mes_por_extenso[].

Só tenho conhecimentos teóricos sobre ponteiros, eles estão no plano de estudo só que mais para frente.

 

12 minutos atrás, Fernando Mercês disse:

Você não precisa mais dessa char data[11]

Eu tinha a intenção de trabalhar com strings, e depois converter com atoi esse pedaço ficou do código antigo.

 

13 minutos atrás, Fernando Mercês disse:

Como int é o tipo padrão do C, você não precisa informá-lo ao declarar uma unsigned.

Coloco por redundância mesmo, se não me engano a linguagem trabalha de acordo com o sistema. 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O código ficaria assim com as alterações do @Fernando Mercês :

#include<stdio.h>

int main(){
    unsigned dia, mes, ano;

    char *mes_por_extenso[] = { "janeiro", "fevereiro", "marco",
                               "abril", "maio", "junho", "julho",
                               "agosto", "setembro" , "outubro",
                               "novembro", "dezembro"
                              };

    printf("Digite a data(DD-MM-AAAA): ");
    scanf("%u-%u-%u",&dia,&mes,&ano);
    fflush(stdin);
    
    printf("%u de %s de %u", dia, mes_por_extenso[mes-1], ano);
    
    return 0;
}

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
7 minutos atrás, isrnick disse:

char *mes_por_extenso[] = { "janeiro", "fevereiro", "marco", "abril", "maio", "junho", "julho", "agosto", "setembro" , "outubro", "novembro", "dezembro" };

Eu não sabia, que dava criar um ponteiro e inserir dados ao mesmo tempo. No final virou um vetor normal só que sendo um ponteiro

  • 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

×