A. 프로그램 실행 샷
II. 기능 소개
1. 함수 선언
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
void two(int n);//输入二进制数
void eight(int n);//输入八进制数
void ten(int n);//输入十进制数
void sixteen(int n);//输入十六进制数
void two_to_eight(char num[1000]);//把二进制转换为八进制
void two_to_ten(char num[1000]);//把二进制转换为十进制
void two_to_sixteen(char num[1000]);//把二进制转换为十六进制
void eight_to_two(char num[1000]);//把八进制转二进制
void eight_to_ten(char num[1000]);//把八进制转十进制
void eight_to_sixteen(char num[1000]);//把八进制转十六进制
void ten_to_two(char num[1000]);//把十进制转二进制
void ten_to_eight(char num[1000]);//把十进制转八进制
void ten_to_sixteen(char num[1000]);//把十进制转十六进制
void sixteen_to_two(char num[1000]);//把十六进制转二进制
void sixteen_to_eight(char num[1000]);//把十六进制转八进制
void sixteen_to_ten(char num[1000]);//把十六进制转十进制
bool judge(int n, char num[1000]);//判断输入的数是否符合
int mypow(int x, int cnt);
주제 자체의 제한 수준을 감안할 때, 더 잘 진수의 전환으로, 우리는 함수의 합성을 호출하여 더 많은 기능, 거의 전체 프로그램을 정의로 입력하기 위해, 각 소수를 할 복잡 할 수있다.
2. 심판 함수
//裁判
bool judge(int n, char num[1000])
{
//二进制判断
if (n == 2)
{
for (int idx = 0; idx < strlen(num); idx++)
if (num[idx] != '1' && num[idx] != '0')return false;
return true;
}
//八进制判断
if (n == 8)
{
for (int idx = 0; idx < strlen(num); idx++)
if (num[idx] < 48 || num[idx] > 55)return false;
return true;
}
//十进制判断
if (n == 10)
{
for (int idx = 0; idx < strlen(num); idx++)
if (num[idx] < 48 || num[idx] > 57)return false;
return true;
}
//十六进制判断
if (n == 16)
{
for (int idx = 0; idx < strlen(num); idx++)
if (num[idx] < 48 || num[idx] > 70)return false;
return true;
}
}
진수에 따르면, 각각의 숫자는 그렇지 않으면 탐색의 끝에서 true를 반환하고, 부적합의 수를 발견하면, 즉시 false를 반환 입력을 통과 할 것으로 보인다. 이 기능은 심판이 아니라 int로 반환을 사용할 수있는 활용 부울 값이 true를 반환 그것을 사용하는 것이 비교적 간단 때문 true와 false 0.
3. 지수 함수
//指数
int mypow(int x, int cnt)
{
int sum = 1;
for (int idx = 0; idx < cnt; idx++)sum *= x;
return sum;
}
소수 나중에 사용 변환 간단한 지수 함수.
4. 이진 입력 변환
//二进制
void two(int n)
{
char str[1000];
printf("请输入您的数字:");
scanf("%s", str);
if (!judge(n, str))printf("ERROR\n");
else
{
two_to_eight(str);
two_to_ten(str);
two_to_sixteen(str);
}
}
첫 번째는 바이너리 입력 기능은 바이너리 내가 숫자이 질문을 모두 촬영 한 있도록 충족 바이너리와 각 밴드의 전환을 위해이 질문에 불쾌한 장소, 우리는 단순히이 항목의 형식 제어 완료를 사용할 수 있다고 할 수있다 방법의 배열에 저장된다.
심판이 false를 반환하는 경우 전화 번호를 입력 할 수있는 프롬프트에 따르면, 그렇지 않으면, 세 진수 변환 함수를 호출, 실수를하라는 메시지가 표시됩니다.
void two_to_eight(char num[1000])//把二进制转换为八进制
{
int str[1000];
int ans = 1;
int cnt = 0, sum = 0;
memset(str, 0, sizeof(str));
for (int idx = strlen(num) - 1; idx >= 0; idx--)
{
cnt++;
sum = sum + (num[idx] - 48) * mypow(2, cnt - 1);
if (cnt == 3)
{
str[ans++] = sum;
sum = 0;
cnt = 0;
}
}
if (sum)str[ans++] = sum;
printf("八进制: ");
for (int idx = ans; idx >= 1; idx--)printf("%d", str[idx]);
printf("\n");
}
void two_to_ten(char num[1000])//把二进制转换为十进制
{
int str[1000];
int sum = 0;
memset(str, 0, sizeof(str));
for (int idx = strlen(num) - 1, i = 0; idx >= 0; idx--, i++)
{
sum = sum + (num[i] - 48) * mypow(2, idx);
}
printf("十进制: ");
printf("%d", sum);
printf("\n");
}
void two_to_sixteen(char num[1000])//把二进制转换为十六进制
{
char str[1000];
int ans = 1;
int cnt = 0, sum = 0;
memset(str, 0, sizeof(str));
for (int idx = strlen(num) - 1; idx >= 0; idx--)
{
cnt++;
sum = sum + (num[idx] - 48) * mypow(2, cnt - 1);
if (cnt == 4)
{
if (sum == 10)str[ans++] = 'A';
else if (sum == 11)str[ans++] = 'B';
else if (sum == 12)str[ans++] = 'C';
else if (sum == 13)str[ans++] = 'D';
else if (sum == 14)str[ans++] = 'E';
else if (sum == 15)str[ans++] = 'F';
else str[ans++] = sum + 48;
sum = 0;
cnt = 0;
}
}
if (sum) str[ans++] = sum + 48;
printf("十六进制: ");
printf("OX");
for (int idx = ans - 1; idx >= 1; idx--)printf("%c", str[idx]);
printf("\n");
}
라는 매우 간단한 함수 이진 진수 진수 16 진수로 변환되고, memset 함수 배열은 0으로 초기화에 저장되어있다
<String.h>에서 이진 세자리위한 진수 숫자를 고려하면, I는 카운터 (CNT)를 도입 매 3 이진수는 8 진수로 변환하고, 그 합계는 마지막 8 진수를 얻을 다음, 하나 개 이상의 출력은 정확한 표시를 실현할 진수 0으로 시작 진수 보장
다음 메트릭은 간단한 곱셈의 합이 피곤 비트이며 16 진수 진수 유사한 변형, 모든 수는 10 ~ 15에 네 개의 16 진수, 그리고 당신은에, 마지막으로 ~ F로 변환 할 전면 헥스 플러스 OX를 들면, 출력 16 진수를 나타낸다.
5. 진수 입력 및 전환
//八进制
void eight(int n)
{
char str[1000];
printf("请输入您的数字:");
scanf("%s", str);
if (!judge(n, str))printf("ERROR\n");
else
{
eight_to_two(str);
eight_to_ten(str);
eight_to_sixteen(str);
}
}
void eight_to_two(char num[1000])//把八进制转二进制
{
int str[1000];
memset(str, 0, sizeof(str));
for (int i = strlen(num) - 1; i >= 0; i--)
{
int cnt = 2;
int number = num[i] - 48;
do {
if (number % 2)str[i * 3 + cnt] = 1;
else str[i * 3 + cnt] = 0;
cnt--;
number /= 2;
} while (number > 0);
}
printf("二进制: ");
for (int i = 0; i < strlen(num) * 3; i++)
{
printf("%d", str[i]);
if ((i + 1) % 3 == 0)printf(" ");
}
printf("\n");
}
void eight_to_ten(char num[1000])//把八进制转十进制
{
int str[1000];
int sum = 0;
memset(str, 0, sizeof(str));
for (int idx = strlen(num) - 1, i = 0; idx >= 0; idx--, i++)
{
sum = sum + (num[i] - 48) * mypow(8, idx);
}
printf("十进制: ");
printf("%d", sum);
printf("\n");
}
void eight_to_sixteen(char num[1000])//把八进制转十六进制
{
char str[1000];
int sum = 0, ans = 0;
memset(str, 0, sizeof(str));
for (int idx = strlen(num) - 1, i = 0; idx >= 0; idx--, i++)
{
sum = sum + (num[i] - 48) * mypow(8, idx);
}
do {
int number = sum % 16;
if (number == 10)str[ans++] = 'A';
else if (number == 11)str[ans++] = 'B';
else if (number == 12)str[ans++] = 'C';
else if (number == 13)str[ans++] = 'D';
else if (number == 14)str[ans++] = 'E';
else if (number == 15)str[ans++] = 'F';
else str[ans++] = number + 48;
sum /= 16;
} while (sum > 0);
printf("十六进制: ");
printf("OX");
for (int idx = ans - 1; idx >= 0; idx--)printf("%c", str[idx]);
printf("\n");
}
6. 소수점 변환 입력
//十进制
void ten(int n)//输入十进制数
{
char str[1000];
printf("请输入您的数字:");
scanf("%s", str);
if (!judge(n, str))printf("ERROR\n");
else
{
ten_to_two(str);
ten_to_eight(str);
ten_to_sixteen(str);
}
}
void ten_to_two(char num[1000])//把十进制转二进制
{
int str[1000];
memset(str, 0, sizeof(str));
int cnt = 0, sum = 0;
for (int i = 0; i < strlen(num); i++)sum = sum * 10 + num[i] - 48;
do {
int number = sum % 2;
if (number % 2)str[cnt++] = 1;
else str[cnt++] = 0;
sum /= 2;
} while (sum > 0);
cnt--;
printf("二进制: ");
for (int i = cnt; i >= 0; i--)printf("%d", str[i]);
printf("\n");
}
void ten_to_eight(char num[1000])//把十进制转八进制
{
int str[1000];
int sum = 0, ans = 0;
memset(str, 0, sizeof(str));
for (int i = 0; i < strlen(num); i++)sum = sum * 10 + num[i] - 48;
do {
int number = sum % 8;
str[ans++] = number;
sum /= 8;
} while (sum > 0);
printf("八进制: ");
for (int i = ans; i >= 0; i--)printf("%d", str[i]);
printf("\n");
}
void ten_to_sixteen(char num[1000])//把十进制转十六进制
{
char str[1000];
int sum = 0, ans = 0;
memset(str, 0, sizeof(str));
for (int i = 0; i < strlen(num); i++)sum = sum * 10 + num[i] - 48;
do {
int number = sum % 16;
if (number == 10)str[ans++] = 'A';
else if (number == 11)str[ans++] = 'B';
else if (number == 12)str[ans++] = 'C';
else if (number == 13)str[ans++] = 'D';
else if (number == 14)str[ans++] = 'E';
else if (number == 15)str[ans++] = 'F';
else str[ans++] = number + 48;
sum /= 16;
} while (sum > 0);
printf("十六进制: ");
printf("OX");
for (int idx = ans - 1; idx >= 0; idx--)printf("%c", str[idx]);
printf("\n");
}
육각 변환을 입력 (7)
//十六进制
void sixteen(int n)//输入十六进制数
{
char str[1000];
printf("请输入您的数字:");
scanf("%s", str);
for (int i = 0; i < strlen(str); i++)
if (islower(str[i]))str[i] = toupper(str[i]);
if (!judge(n, str))printf("ERROR\n");
else
{
sixteen_to_two(str);
sixteen_to_eight(str);
sixteen_to_ten(str);
}
}
void sixteen_to_two(char num[1000])//把十六进制转二进制
{
int str[1000], number;
memset(str, 0, sizeof(str));
for (int i = strlen(num) - 1; i >= 0; i--)
{
int cnt = 3;
if (num[i] == 'A') number = 10;
else if (num[i] == 'B') number = 11;
else if (num[i] == 'C') number = 12;
else if (num[i] == 'D') number = 13;
else if (num[i] == 'E') number = 14;
else if (num[i] == 'F') number = 15;
else number = num[i] - 48;
do {
if (number % 2)str[i * 4 + cnt] = 1;
else str[i * 4 + cnt] = 0;
cnt--;
number /= 2;
} while (number > 0);
}
printf("二进制: ");
for (int i = 0; i < strlen(num) * 4; i++)
{
printf("%d", str[i]);
if ((i + 1) % 4 == 0)printf(" ");
}
printf("\n");
}
void sixteen_to_eight(char num[1000])//把十六进制转八进制
{
int str[1000];
int sum = 0, number, ans = 0;
for (int i = strlen(num) - 1; i >= 0; i--)
{
if (num[i] == 'A') number = 10;
else if (num[i] == 'B') number = 11;
else if (num[i] == 'C') number = 12;
else if (num[i] == 'D') number = 13;
else if (num[i] == 'E') number = 14;
else if (num[i] == 'F') number = 15;
else number = num[i] - 48;
sum = sum + number * mypow(16, strlen(num) - 1 - i);
}
do {
number = sum % 8;
str[ans++] = number;
sum /= 8;
} while (sum > 0);
ans--;
printf("八进制: ");
printf("0");
for (int i = ans; i >= 0; i--)printf("%d", str[i]);
printf("\n");
}
void sixteen_to_ten(char num[1000])//把十六进制转十进制
{
int sum = 0, number;
for (int i = strlen(num) - 1; i >= 0; i--)
{
if (num[i] == 'A') number = 10;
else if (num[i] == 'B') number = 11;
else if (num[i] == 'C') number = 12;
else if (num[i] == 'D') number = 13;
else if (num[i] == 'E') number = 14;
else if (num[i] == 'F') number = 15;
else number = num[i] - 48;
sum = sum + number * mypow(16, strlen(num) - 1 - i);
}
printf("十进制: ");
printf("%d", sum);
printf("\n");
}
이진 변환의 이러한 유형을 간단히 주요 기능 함수 비교적 많은 수의 설정을 달성하기 위해, 거의 동일하다.
특히, 나는 기능 16 진수 입력을 사용 <ctype.h>는 사용자가 소문자 문자 입력은 16 진수의 정확한 식별을 보장하기 위해, 모두 대문자로 변환.
쇼 세 .main 기능
int main()
{
int n;
while (1)
{
printf("请选择您所要输入的进制:");
scanf("%d", &n);
if (!n) break;
switch (n)
{
case 2:two(n); break;
case 8:eight(n); break;
case 10:ten(n); break;
case 16:sixteen(n); break;
default:printf("ERROR\n"); break;
}
printf("-------------------------------\n");
}
return 0;
}
사용자 0 종료 동시에, 사용자가 입력 한 숫자에 따라 이진 입력 전환 페이지를 입력 할 들어가는 경우에만 잠시 무한 루프를 수행 할 수 2,8,10,16의 밴드에 속하지 않는 당신은 오류 메시지가 표시 및 재 입력됩니다.
IV. 마인드 매핑
다섯 문제 및 해결 방법 :
질문 : 대신 순환을 위해 매크로를 사용하는 게으른 내 부하를 줄일 싶었지만, 나중에 프로그램이 BUG, 의지 출력 잘못된 답을 표시 발견했다.
int idx;
#define myfor(n) for(idx = 0;idx<n;idx++)
해결 방법 : 내가 전역 변수와 매크로를 삭제, 그래서 실수를 트리거, 전역 변수 바이어스의 값의 결과로, 함수를 호출 할 때 내가 찾은 매크로 및 재사용의 전역 변수의 집합입니다.
VI. 코드 동료 검토
그냥 일부 학생들이 제출 한 작품, 내가 그 기능 보았다, 나는 영감의 느낌, 모습에 - 하나의 비교가 있습니다.
1. 네트워크 1913 타오
int Tennum(char a[],int b)//将输入的数字转换为10进制数
{
int len, i, num;
int sum = 0;
len = strlen(a);//求字符长度
for (i = 0; i < len; i++)
{
if (a[i] >= '0' && a[i] <= '9')
{
num = a[i] - '0';
}
else if (a[i] >= 'A' && a[i] <= 'F')
{
num = a[i] - 'A' + 10;
}
sum = sum * b + num;
}
return sum;
}
난 당신이 공간을 많이 절약 진수 형식 이진의 다양한 유형을 완벽하게 할 수 있습니다, 이것은 좋은 아이디어라고 생각하고, 나는 각 밴드에 대한 사실 필요가 없습니다, 소수점 함수에 대한 변환을 설립했다.
2. 네트워크 1914 린 Jieying
int binaryconversion(int number){
if(number/2==0){
return number%2;
}
else{
return number%2+binaryconversion(number/2)*10;
}
}
재귀 밝은 반점, 내 코드가 조금 성가신을 보이지만, 많은 수를 처리 할 때, 재귀, 다음 가능성이 스택 것, 원래의 내 자신의 바이너리 변환에 비해이 방식으로 작성 될 수 이해했다 오버 플로우, 나는 그것이 잘못된 값이 약 6 자리 숫자를 입력하는 것입니다 얻을 것이다 시도했다.
3. 네트워크 1913 첸 하뉴
void TenToSixteen()
{
char ai[] = "0123456789ABCDEF";
char h[16];
int i = 0;
int j = 0;
int num = 0, g;
printf("输入一个整数:");
scanf_s("%d", &num);
g = num;
if (num < 0)
num = -num;
while (num)
{
h[i++] = ai[num % 16]; //对十进制数求余并最终与h数组中的字符匹配
num = num / 16;
}
printf("十进制数转换成十六进制数是:");
if (g < 0)
printf("-");
for (j = i - 1; j >= 0; --j)
printf("%c", h[j]);
printf("\n");
}
아주 좋은 생각, 방법 플레이 테이블을 사용하여 간결 완성 진수 변환입니다.
VII. 요약
1. 수확이 : 코드를 제출 한 학생에 비해, 내가 조금 성가신을 쓰고,이에, 나는 동시에 작업이이 과정에서 완료, 훌륭한 아이디어를 알게 심화 내 응용 프로그램 바이너리 변환뿐만 아니라, 프로그램을 달성하기 위해 기본적인 통화 기능에 의존, 거의 수행 등의 주요 기능과 같은 몇 가지 흥미로운 아이디어를 시도
2 이해 : 자체 코드를 만들기 위해 존재하는 기능이 더 명확하고 사람들이 자신의 좋은 이름을 복용의 함수로 프로그램을 읽기 쉽게보고, 옳은, 당신은 당신의 코드를보다 간결하게, 더 재미있게 만들 수 있습니다.