Ir ao conteúdo
  • Cadastre-se

C Problema em C: conversor de medidas


Ir à solução Resolvido por devair1010,

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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

  • Solução

@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
Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

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