C_simple/conversion/C1main.c

194 lines
4.6 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by CC-star on 25-5-6.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int R,num;//需要得到的进制,输入的整数
char num_16[100]; // 十六进制
int R_choice;//原本进制
// void Pr_Start() {
// int power = 1; // R进制的幂从R^0=1开始
// }
//十进制转2进制
void DectoBin() {
int arr[100],length = 0;
while(num){
arr[length++] = num % 2;
num/=2;
}
printf("对应2进制表示为");
for(int i = length-1;i>=0;i--){
printf("%d",arr[i]);
}
printf("\n");
}
//十进制转R进制
void DectoR() {
switch(R){
//十进制转二进制
case 2:
DectoBin();
break;
//十进制转8进制
case 8:
printf("对应8进制表示为%o\n",num);
break;
case 10:
printf("对应10进制表示为%d\n",num);
break;
//十进制转16进制
case 16:
printf("对应16进制表示为%x\n",num);
break;
default:
printf("输入有误目前只支持2、8、10、16进制间的转换\n");
break;
}
}
//2进制转10进制
void BintoDec() {
int s = 0;
int i = 0;
int power = 1;
while (num > 0) {
s += (num % 10) * power;
power *= 2;
num/=10;
i++;
}
num = s;
DectoR();
}
//8进制转10进制
void OcttoDec() {
int s = 0;
int i = 0;
int power = 1;
while (num > 0) {
s += (num % 10) * power;
power *= 8;
num/=10;
i++;
}
num = s;
DectoR();
}
//16进制转10进制
void HextoDec() {
int s = 0; // 十进制结果
int len = strlen(num_16);
int power = 1;
for(int i = len-1; i >= 0; i--) {
int digit;
if(num_16[i] >= '0' && num_16[i] <= '9') {
digit = num_16[i] - '0';
}
else if(num_16[i] >= 'A' && num_16[i] <= 'F') {
digit = num_16[i] - 'A' + 10;
}
else if(num_16[i] >= 'a' && num_16[i] <= 'f') {
digit = num_16[i] - 'a' + 10;
}
else {
// 既不是数字也不是字母a-f/A-F输入错误
printf("错误:输入的不是有效的%d进制数\n",R_choice);
return ;
}
s = s + digit * power;
power *= 16;
}
num = s;
DectoR();
}
int Input() {
printf("输入你的%d进制数:",R_choice);
scanf("%d",&num);
while (getchar() != '\n');
if(num < 0) {
printf("错误:请输入正数!\n");
return 0;
}
int tmp = num;
int a;
while (tmp > 0) {
a = tmp % 10;
if (a >= R_choice) {
printf("错误:输入的不是有效的%d进制数\n",R_choice);
return 0;
}
tmp /= 10;//去掉个位
}
printf("输入你要得到的R进制:");
scanf("%d",&R);
while (getchar() != '\n');
return 1;
}
int C1main(){
int opt;
while (1) {
printf("---------------------👇进制转换【整数|正数】控制面板👇----------------------\n");
printf("12进制转R\n28进制转R\n");
printf("310进制转R\n416进制转R\n");
printf("0.返回主控制台\n");
printf("-----------------------👆选择对应数字👆------------------------\n");
printf("请输入选择:");
scanf("%d", &opt);
//固定原始数字的进制
if (opt == 1) {
R_choice =2;
}else if(opt == 2) {
R_choice=8;
}else if(opt == 3) {
R_choice=10;
}else if(opt == 4) {
R_choice=16;
}
switch (opt) {
case 1://2进制转R
if(Input() == 1) {
BintoDec();
}
break;
case 2://8进制转R
if(Input() == 1) {
OcttoDec();
}
break;
case 3://10进制转R
if(Input() == 1) {
DectoR();
}
break;
case 4://16进制转R
printf("输入你的16进制数:");
scanf("%s", num_16);
printf("输入你要得到的R进制:");
scanf("%d",&R);
HextoDec();
break;
case 0:
printf("⚠️返回主控制台中...⚠️\n");
return 0;
default:
printf("⚠️输入有误,请重新输入⚠️\n");
break;
}
}
}