Ir ao conteúdo
  • Cadastre-se
Nathan Holanda

C RESOLVIDO Problema em C: conversor de medidas

Posts recomendados

Tenho que fazer um coversor de medidas de área. Esse é apenas um trecho do programa e ele não tá completo. Mas vou explicar brevemente como funciona e quais problemas estou tendo.
O programa deve apresentar um menu inicial (void menu), até aqui tudo bem. Caso o usuário selecione uma unidade de medida, o programa deve apresentar uma descrição sobre ela (void description1 e void description2).
Os problemas

  • A função setlocale(LC_ALL, "Portuguese") não funciona mesmo quando eu altero pra UTF-8 no encoding nas configurações.
  • As funções void description1 e void description2 não funcionam e eu já testei de diversas formas: com if else, sem a variável intermediária s1 ou s2, iserindo a estrutura de seleção diretamente no void main. Também já usei printf pra testar se o vetor op[2] está recebendo valor e ele está.

    Estou quase de mãos atadas e preciso de ajuda. Por favor 😕


 

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

int op[2];
int start;
char km[2];
char ha[2];
char m[200];
char cm[2];
char mm[2];
char um[2];
char nm[2];
char s1[300];
char s2[300];


void menu(){
    do{
        printf("*****MENU*****\n\n");
        printf("Ecolha uma opção através do número correspondente\n\n");
        printf("1 - Sobre o programa\n2 - Descrição do programa\n3 - Fazer uma conversão\n\n");
        printf("Opção: ");
        scanf("%d", &start);
        system("cls");
    }while(start!=1 && start!=2 && start!=3);
}


char description1(){
    //as descrições das unidades ainda serão inseridas
    km[2]="a";
    ha[2]="a";
    m[200]="O metro quadrado (m²) é a unidade padrão de área adaptada para o Sistema Internacional de Unidades, e derivada da unidade básica metro. Corresponde à área que tem um quadrado com um metro de lado.";
    cm[2]="a";
    mm[2]="a";
    um[2]="a";
    nm[2]="a";
    switch(op[0]){
        case 1:strcpy(s1,km);break;
        case 2:strcpy(s1,ha);break;
        case 3:strcpy(s1,m);break;
        case 4:strcpy(s1,cm);break;
        case 5:strcpy(s1,mm);break;
        case 6:strcpy(s1,um);break;
        case 7:strcpy(s1,nm);break;
    }
    puts(s1);
}


void description2(){
    //as descrições das unidades ainda serão inseridas
    km[2]="a";
    ha[2]="a";
    m[200]="O metro quadrado (m²) é a unidade padrão de área adaptada para o Sistema Internacional de Unidades, e derivada da unidade básica metro. Corresponde à área que tem um quadrado com um metro de lado.";
    cm[2]="a";
    mm[2]="a";
    um[2]="a";
    nm[2]="a";
    switch(op[1]){
        case 1:strcpy(s2,km);break;
        case 2:strcpy(s2,ha);break;
        case 3:strcpy(s2,m);break;
        case 4:strcpy(s2,cm);break;
        case 5:strcpy(s2,mm);break;
        case 6:strcpy(s2,um);break;
        case 7:strcpy(s2,nm);break;
    }
    puts(s2);
}


void main(){
    setlocale(LC_ALL, "Portuguese");
    int op[2], i=1;
    double a, b, tabela[2];
    menu();
    if(start==1){
        printf("teste");
        //serão inseridas aqui informações gerais sobre o programa
        system("pause");
        system("cls");
        menu();
    }
    else if(start==2){
        printf("teste");
        //descrição de como funciona o programa
        system("pause");
        system("cls");
        menu();
    }
    else if(start==3){
        printf("CONVERTER DE:\n\n");
        printf("1 - Quilômetro quadrado (km²)\n2 - Hectare (ha)\n3 - Metro quadrado (m²)\n4 - Centímetro quadrado (cm²)\n5 - Milímetro quadrado (mm²)\n6 - Micrometro quadrado (μm²)\n7 - Nanômetro quadrado (nm²)\n\n");
        printf("Opção: ");
        scanf("%d", &op[0]);
        system("cls");
        printf("CONVERSÃO PARA:\n\n");
        printf("1 - Quilômetro quadrado (km²)\n2 - Hectare (ha)\n3 - Metro quadrado (m²)\n4 - Centímetro quadrado (cm²)\n5 - Milímetro quadrado (mm²)\n6 - Micrometro quadrado (μm²)\n7 - Nanômetro quadrado (nm²)\n\n");
        printf("Opção: ");
        scanf("%d", &op[1]);
        printf("\nValor a ser convertido: ");
        scanf("%lf", &a);
        system("cls");
    }
    	description1();
  	printf("\n\n");
  	description2();
  	//minhas funções description não estão funcionando :(
}

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Compreendo perfeitamente;

Observei que as funções descriptionN seriam facilmente implementadas com o uso de matrizes, invés de vetores.

 

Dar menos trabalho se deixa as strings mais simples do que continuar insistindo em como está.

Por exemplo:

  • Representando potências por uma circunflexão, assim: A*A*A= A^3, m² = m^2.
  • Pode também trocar certas palavra acentuadas por um sinônimo mais afim não acentuado.

 

km[2]="a"; <<<< Erro lógico.

Revise strings em C, fato é que não existe em C atribuição de strings literais.

  • Curtir 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Nathan Holanda   o @AnsiC   está certo ,  use o comando strcpy para preencher string :

strcpy(m,"O metro quadrado (m²) é a unidade padrão de área adaptada para o Sistema Internacional de Unidades, e derivada da unidade básica metro. Corresponde à área que tem um quadrado com um metro de lado.");

printf("%s\n",m);

  • Curtir 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Em outras ocasiões a atribuição direta havia funcionado com valor. Quando a atribuição é de uma string pra outra de fato não funciona. Vou tentar usar matriz. Porém o projeto tinha algumas exigências, eu precisava usat matriz, vetor, string e funções. Essa tinha sido a forma que eu encontrei de usar vetor. Mas tentarei com matriz.
@devair1010 tentei o que você recomendou e não funcionou 😕

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Nathan Holanda   ops ! ,   esqueci de remover a posição do vetor de caracteres , então editei o post acima , copie e teste .

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010  Se não me engano o strcpy só serve pra ser usado entre duas variáveis e não com variável e valor, porque continua não funcionando.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010  o problema tá sendo fazer funcionar dentro da estrutura de seleção. Eu preciso que determinada descrição apareça de acordo com a escolha do usuário.

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Nathan Holanda      você precisa colocar um comando de parada , como

getch();

 ou

system("pause");

, para que se consiga ver o que foi impresso ,  esse código vai precisar fazer as outras funções , mas você pode testar escolhendo as opções 3 , 1 , 3 a partir do menu principal ,  e seu código poderia ser assim  :

#include<stdio.h>
#include<ctype.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#include<locale.h>
#include<string.h>

#include <windows.h>
/*             0     1    2     3   4      5      6      7         8  */
typedef enum{black,blue,green,cyan,red,magenta,brown,lightgray,darkgray,   /* nome das cores */
lightblue,lightgreen,lightcyan,lightred,lightmagenta,yellow,white} colors;
/*  9         10         11        12        13         14    15 */

static int __BACKGROUND = 1/*BLACK*/;/*pode ser o numero ou o nome da cor*/
static int __FOREGROUND = lightgray;

void textcolor_2 (int letras, int fundo){/*para mudar a cor de fundo mude o background*/
    __FOREGROUND = letras;
    __BACKGROUND = fundo;
    SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
    letras + (__BACKGROUND << 4));
}

int start,op[2];
char km[2],cm[2],m[1200],ha[2],s2[300];
char mm[2],nm[2],um[2],s1[300];
int opções(                      );/* protótipo das funções */
void converte(double a,int olp[2]);/* protótipo das funções */
void menu(){
    textcolor_2(10,0);
    do{
        printf("*****MENU*****\n\n");
        printf("Ecolha uma op%c%co atrav%cs do n%cmero correspondente\n\n",135,198,130,163);
        printf(" 1 - Sobre o programa\n");
        printf(" 2 - Descri%c%co do programa\n",135,198);
        printf(" 3 - Fazer uma convers%co\n",198);
        printf(" 4 - Sair do Programa\n\n");
        printf("Op%c%co : ",135,198);
        scanf("%d",&start);
        system("cls");
    }while(start < 1 || start > 4 );
    textcolor_2(7,0);
}
char description1(){
    //as descrições das unidades ainda serão inseridas
    km[0]='a';
    km[1]='a';
    ha[1]='a';
    strcpy(m,"O metro quadrado (m²) é a unidade padrão de área adaptada para o Sistema Internacional de Unidades, e derivada da unidade básica metro. Corresponde à área que tem um quadrado com um metro de lado.");
    system("pause");
    cm[1],'a';
    mm[1],'a';
    um[1],'a';
    nm[1],'a';
    op[0]=opções();
    switch(op[0]){
        case 1:strcpy(s1,km);break;
        case 2:strcpy(s1,ha);break;
        case 3:strcpy(s1,m );break;
        case 4:strcpy(s1,cm);break;
        case 5:strcpy(s1,mm);break;
        case 6:strcpy(s1,um);break;
        case 7:strcpy(s1,nm);break;
    }
    puts(s1);
}
void description2(){
    //as descrições das unidades ainda serão inseridas
    km[2]='a';
    ha[2]='a';
    strcpy(m,"O metro quadrado (m²) é a unidade padrão de área adaptada para o Sistema Internacional de Unidades, e derivada da unidade básica metro. Corresponde à área que tem um quadrado com um metro de lado.");
    cm[2]='a';
    mm[2]='a';
    um[2]='a';
    nm[2]='a';
    op[1]=opções();
    switch(op[1]){
        case 1:strcpy(s2,km);break;
        case 2:strcpy(s2,ha);break;
        case 3:strcpy(s2,m );break;
        case 4:strcpy(s2,cm);break;
        case 5:strcpy(s2,mm);break;
        case 6:strcpy(s2,um);break;
        case 7:strcpy(s2,nm);break;
    }
    puts(s2);
}
int main(){
    setlocale(LC_ALL, "");
    int op[2], i=1;
    double a,b,tabela[2];
    do{
        system("cls");
        menu();
        switch(start){
        case 1:
            printf("teste\n");
            printf("ser%co inseridas aqui informa%c%ces gerais sobre o programa\n\n",198,135,228);
            //serão inseridas aqui informações gerais sobre o programa
            break;
        case 2:
            printf("teste\n");
            printf("est%c na op%c%co 2\n\n",160,135,198);
            system("pause");
            break;
        case 3:
            printf("CONVERTER DE:\n\n");
            op[0]=opções();
            system("cls");
            printf("CONVERS%cO PARA:\n\n",199);
            op[1]=opções();
            printf("\nValor a ser convertido -: ");
            scanf("%lf", &a);
            converte(a,op);/* op tem duas as posições */
            break;
        case 4:
            printf("\n\n           Saindo . . . !\n\n\n");
            return 0;
        default :
            printf("\nOp%c%co inv%clida !\n",135,198,160);
        }
        system("pause");
    }while( start != 4 );
  	//minhas funções description não estão funcionando :(
}
int opções(){
    textcolor_2(14,0);
    int opc;
    printf("\n============================\n\n");
    textcolor_2(11,0);
    printf(" 1 - Quilômetro quadrado (km²)\n"  );
    printf(" 2 - Hectare (ha)             \n"  );
    printf(" 3 - Metro quadrado (m²)      \n"  );
    printf(" 4 - Centímetro quadrado (cm²)\n"  );
    printf(" 5 - Milímetro quadrado (mm²) \n"  );
    printf(" 6 - Micrometro quadrado (μm²)\n"  );
    printf(" 7 - Nan%cmetro quadrado (nm²)",226);
    textcolor_2(14,0);
    printf("\n\n============================\n");
    printf(" Op%c%co : ",135,198);
    textcolor_2(11,0);
    scanf("%d",&opc);
    return opc;
}
void converte(double a,int op[]){
    textcolor_2(7,0);
    switch(op[0]){
    case 1:
        switch(op[1]){
        case 1:
            break;
        case 2:
            break;
        case 3:
            printf("\n de kil%cmetro para metro => %.2lf\n\n",226,(double)a * 1000000);
            break;
        case 4:
            break;
        case 5:
            break;
        case 6:
            break;
        case 7:
            break;
        default :
            printf("\nOp%c%co inv%clida !\n\n",135,198,160);
        }
        break;
    case 2:
        break;
    case 3:
        break;
    case 4:
        break;
    case 5:
        break;
    case 6:
        break;
    case 7:
        break;
    default :
        printf("\nOp%c%co inv%clida !\n\n",135,198,160);
    }
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 Consegui ajeitar de uma outra forma, porém minha função setlocale continua sem funcionar e os caracteres "especiais" não aparecem.

Segue abaixo a mensagem do compilador, na imagem. Mesmo eu tendo alterado pra UTF-8, o problema persiste.

image.png

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Nathan Holanda    essa mensagem  não tem haver com a setlocale , é por que existe algum caractere no texto , que não é  normalmente usado , não consegui achar qual deles , mas isso não atrapalha o funcionamento , e  a setlocalle parece ser mesmo por causa do compilador usado , aqui também não está funcionando , pois estou usando o codeblocks mas com o compilador GCC do Dev++ , .

  • 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

×
×
  • Criar novo...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!