前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言实现进制转换、移位运算小工具

C语言实现进制转换、移位运算小工具

作者头像
程序员小涛
发布2022-05-07 16:03:17
8460
发布2022-05-07 16:03:17
举报
文章被收录于专栏:涛的程序人生

流程图

main
main
trans
trans
代码语言:javascript
复制
#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");
}

完整项目地址

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 流程图
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档