Ir ao conteúdo

C Problema em C: conversor de medidas


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

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
Postado

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
Postado

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

@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
  • Solução
Postado

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

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

@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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!