#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <stdarg.h>
#include <ctype.h>
#include "conversion.h"
char MainMenu(); //主菜单
void pause(const char *str, ...); //暂停程序
void TransformMenu(); //进制转换菜单
void AddMenu(); //进制加法菜单
void getAddNumbers(int* a, int* b); //获取用户输入
void getNumberAndPos(int* number, int* pos); //获取用户输入
void DisplacementMenu(); //移位运算菜单
int main() //主函数
{
char menuID;
while (1)
{
menuID = MainMenu();
switch (menuID)
{
case '0':
pause("感谢使用,再见!");
exit(EXIT_SUCCESS);
case '1':
TransformMenu();
break;
case '2':
AddMenu();
break;
case '3':
DisplacementMenu();
break;
default:
pause("输入有误!请重新输入...");
break;
}
}
return 0;
}
char MainMenu() //程序主菜单
{
char menuID;
system("cls");
printf("*************************************\n");
printf("* 欢迎使用科学计算器 *\n");
printf("*************************************\n");
printf("* 1.进制转换 *\n");
printf("* 2.进制加法 *\n");
printf("* 3.移位运算 *\n");
printf("* 0.退出系统 *\n");
printf("*************************************\n");
printf("* 请选择您的操作 *\n");
printf("*************************************\n");
fflush(stdin);
menuID = getch();
return menuID;
}
//进制转换功能菜单
void TransformMenu()
{
char menuID = 1;
int a, b, na, nb, *trasa = NULL, *trasb = NULL;
while (menuID)
{
system("cls");
printf("**************************************\n");
printf("* 进制转换 *\n");
printf("**************************************\n");
printf("* 1.二进制 *\n");
printf("* 2.八进制 *\n");
printf("* 3.十六进制 *\n");
printf("* 4.返回主菜单 *\n");
printf("**************************************\n");
printf("* 请选择您的操作 *\n");
printf("**************************************\n");
fflush(stdin);
menuID = getch();
switch (menuID)
{
case '1':
getAddNumbers(&a, &b);
trasa = Transform(a, 2, &na);
printf("\na = %d = ", a);
printBinary(trasa, na);
trasb = Transform(b, 2, &nb);
printf("b = %d = ", b);
printBinary(trasb, nb);
freeData(trasa, trasb, NULL);
pause("\n按任意键返回...");
break;
case '2':
getAddNumbers(&a, &b);
trasa = Transform(a, 8, &na);
printf("\na = %d = ", a);
printBinary(trasa, na);
trasb = Transform(b, 8, &nb);
printf("b = %d = ", b);
printBinary(trasb, nb);
freeData(trasa, trasb, NULL);
pause("\n按任意键返回...");
break;
case '3':
getAddNumbers(&a, &b);
trasa = Transform(a, 16, &na);
printf("\na = %d = ", a);
printBinary(trasa, na);
trasb = Transform(b, 16, &nb);
printf("b = %d = ", b);
printBinary(trasb, nb);
freeData(trasa, trasb, NULL);
pause("\n按任意键返回...");
break;
case '4':
menuID = 0;
break;
default:
pause("输入有误!请重新输入...");
break;
}
}
}
//进制加法功能菜单
void AddMenu()
{
char menuID = 1;
int a, b, na, nb, *trasa = NULL, *trasb = NULL, *res = NULL;
while (menuID)
{
system("cls");
printf("**************************************\n");
printf("* 进制加法 *\n");
printf("**************************************\n");
printf("* 1.二进制 *\n");
printf("* 2.八进制 *\n");
printf("* 3.十六进制 *\n");
printf("* 4.返回主菜单 *\n");
printf("**************************************\n");
printf("* 请选择您的操作 *\n");
printf("**************************************\n");
fflush(stdin);
menuID = getch();
switch (menuID)
{
case '1':
getAddNumbers(&a, &b);
trasa = Transform(a, 2, &na);
printf("\na = %d = ", a);
printBinary(trasa, na);
trasb = Transform(b, 2, &nb);
printf("b = %d = ", b);
printBinary(trasb, nb);
res = Add(trasa, na, trasb, nb, 2);
printf("\na + b = %d = ", a + b);
printBinary(res, (fmax(na, nb) / 8 + 1) * 8);
freeData(trasa, trasb, res);
pause("\n按任意键返回...");
break;
case '2':
getAddNumbers(&a, &b);
trasa = Transform(a, 8, &na);
printf("\na = %d = ", a);
printBinary(trasa, na);
trasb = Transform(b, 8, &nb);
printf("b = %d = ", b);
printBinary(trasb, nb);
res = Add(trasa, na, trasb, nb, 8);
printf("\na + b = %d = ", a + b);
printBinary(res, (fmax(na, nb) / 8 + 1) * 8);
freeData(trasa, trasb, res);
pause("\n按任意键返回...");
break;
case '3':
getAddNumbers(&a, &b);
trasa = Transform(a, 16, &na);
printf("\na = %d = ", a);
printBinary(trasa, na);
trasb = Transform(b, 16, &nb);
printf("b = %d = ", b);
printBinary(trasb, nb);
res = Add(trasa, na, trasb, nb, 16);
printf("\na + b = %d = ", a + b);
printBinary(res, (fmax(na, nb) / 8 + 1) * 8);
freeData(trasa, trasb, res);
pause("\n按任意键返回...");
break;
case '4':
menuID = 0;
break;
default:
pause("输入有误!请重新输入...");
break;
}
}
}
void DisplacementMenu() //移位运算菜单
{
char menuID = 1;
int a, b, na, r, nr, *trasa = NULL, *res = NULL;
while (menuID)
{
system("cls");
printf("**************************************\n");
printf("* 移位运算 *\n");
printf("**************************************\n");
printf("* 1.左移 *\n");
printf("* 2.右移 *\n");
printf("* 3.返回主菜单 *\n");
printf("**************************************\n");
printf("* 请选择您的操作 *\n");
printf("**************************************\n");
fflush(stdin);
menuID = getch();
switch (menuID)
{
case '1':
getNumberAndPos(&a, &b);
printf("\nnumber = %d = ", a);
trasa = Transform(a, 2, &na);
printBinary(trasa, na);
printf("pos = %d\n", b);
r = a<<b;
printf("\n%d 左移 %d 位 = %d, 二进制: ", a, b, r);
res = Transform(r, 2, &nr);
printBinary(res, nr);
freeData(trasa, NULL, res);
pause("\n按任意键返回...");
break;
case '2':
getNumberAndPos(&a, &b);
printf("\nnumber = %d = ", a);
trasa = Transform(a, 2, &na);
printBinary(trasa, na);
printf("pos = %d\n", b);
r = a>>b;
printf("\n%d 右移 %d 位 = %d, 二进制: ", a, b, r);
res = Transform(r, 2, &nr);
printBinary(res, nr);
freeData(trasa, NULL, res);
pause("\n按任意键返回...");
break;
break;
case '3':
menuID = 0;
break;
default:
pause("输入有误!请重新输入...");
break;
}
}
}
//获取用户输入的两个整数
void getAddNumbers(int* a, int* b)
{
printf("请输入要进行运算的两个整数: \n");
scanf("%d %d", a, b);
return;
}
//输入要移位的数和移动的位数
void getNumberAndPos(int* number, int* pos)
{
printf("请输入要移位的数和移动的位数: (num pos)\n");
scanf("%d %d", number, pos);
return;
}
//暂停程序
void pause(const char *str, ...)
{
va_list vl;
char buf[500] = {0};
va_start(vl, str);
vsnprintf(buf, 500, str, vl);
va_end(vl);
printf(buf);
getch();
printf("\n");
}