Ir ao conteúdo
  • Cadastre-se
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

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

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!

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

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!

  • 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

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

×