3.5、C语言经典实例15-进制数的转换进制数的转换
在Main.h头文件中声明一个func15函数和trans函数,然后再Main.c源文件中定义func15函数和trans函数,并实现相关的功能。
Main.h头文件添加的代码如下
#define M sizeof(unsigned int)*8 // 实例15:进制数的转换进制数的转换 void func15(); int trans(unsigned n, int d, char s[]);
Main.c源文件添加的代码如下
// 实例15:进制数的转换进制数的转换 void func15() { unsigned int num = 253; int scale[] = { 2,3,10,16,1 }; char str[33]; int i; for (i = 0; i < sizeof(scale) / sizeof(scale[0]); i++) { if (trans(num, scale[i], str)) { printf("%5d = %s(%d)\n", num, str, scale[i]); } else { printf("%5d => (%d) Error! \n", num, scale[i]); } } } int trans(unsigned n, int d, char s[]) { /* 十六进制数字的字符 */ static char digits[] = "0123456789ABCDEF"; char buf[M + 1]; int j, i = M; if (d < 2 || d>16) { s[0] = '\0'; // 不合理的进制,置s为空字符串 return 0; // 不合理的进制,函数返回0 } buf[i] = '\0'; do { buf[--i] = digits[n % d]; // 译出最低位,对应字符存入对应工作数组中 n /= d; } while (n); // 将译出在工作数组中的字符串复制到s */ for (j = 0; (s[j] = buf[i]) != '\0'; j++, i++); // 其中控制条件可简写成s[j]=buf[i] return j; }
然后在main()函数中只调用func15()函数,其调试结果如下
3.6、C语言经典实例16-判断回文数
在Main.h头文件中声明一个func16函数和circle函数,然后再Main.c源文件中定义func16函数和circle函数,并实现相关的功能。
Main.h头文件添加的代码如下
// 实例16:判断回文数 void func16(); int circle(int n, int d);
Main.c源文件添加的代码如下
// 实例16:判断回文数 void func16() { int num[] = { 232,27,851 }; int scale[] = { 2,10,16 }; int i, j; for (i = 0; i < sizeof(num) / sizeof(num[0]); i++) { for (j = 0; j < sizeof(scale) / sizeof(scale[0]); j++) { if (circle(num[i], scale[j])) { printf("%d -> (%d) 进制是回文数!\n", num[i], scale[j]); } else { printf("%d -> (%d) 进制不是回文数!\n", num[i], scale[j]); } } } } int circle(int n, int d) { int s = 0, m = n; while (m) { s = s * d + m % d; m /= d; } return s == n; }
然后在main()函数中只调用func16()函数,其调试结果如下
3.7、C语言经典实例17-找出次大值
在Main.h头文件中声明一个func17函数,然后再Main.c源文件中定义func17函数,并实现相关的功能。
Main.h头文件添加的代码如下
// 实例17:找出次大值 void func17();
Main.c源文件添加的代码如下
// 实例17:找出次大值 void func17() { int n; int t; int m1 = 0; int m2 = 0; int k; printf("请输入数据的个数:\n"); scanf_s("%d", &n); printf("请输入这些数:\n"); for (k = 1; k <= n; k++) { scanf_s("%d", &t); if (t > m1) { m2 = m1;/// m1 = t; } else { if (t > m2) m2 = t; } } printf("这些数的最大值:%d,次大值:%d\n", m1, m2); }
然后在main()函数中只调用func17()函数,其调试结果如下
3.8、C语言经典实例18-验证哥德巴赫猜想
在Main.h头文件中声明一个func18函数、judgeGDBHArith函数和primeJudge函数,然后再Main.c源文件中定义func18函数、judgeGDBHArith函数和primeJudge函数,并实现相关的功能。
Main.h头文件添加的代码如下
// 实例18:验证哥德巴赫猜想 void func18(); // 否符合哥德巴赫猜想 int judgeGDBHArith(int intNum); int primeJudge(int n);
Main.c源文件添加的代码如下
// 实例18:验证哥德巴赫猜想 void func18() { int a = 0; printf("输入一个大于6的偶数:\n"); scanf_s("%d", &a); int blFlag = judgeGDBHArith(a); //判断是否符合哥德巴赫猜想 if (blFlag) { printf("%d能写成两个素数的和,所以其符合哥德巴赫猜想。\n", a); } } // 否符合哥德巴赫猜想 int judgeGDBHArith(int intNum) { int blFlag = 0; //标识是否符合哥德巴赫猜想 if (intNum % 2 == 0 && intNum > 6) //对要判断的数字进行判断 { for (int i = 1; i <= intNum / 2; i++) { int bl1 = primeJudge(i); //判断i是否为素数 int bl2 = primeJudge(intNum - i); //判断intNum-i是否为素数 if (bl1 & bl2) { // 符合哥德巴赫猜想 输出等式 printf("%d = %d+ %d\n", intNum, i, intNum - i); blFlag = 1; } } } return blFlag; //返回bool型变量 } int primeJudge(int n) { int i; for (i = 3; i <= n / 2; i += 2) { if (n % i == 0) return 0; } return 1; }
然后在main()函数中只调用func18()函数,其调试结果如下
3.9、C语言经典实例19-学生成绩输出
在Main.h头文件中先定义两个结构体:学生成绩信息表、学生表,然后在声明一个func19和getMember函数,然后再Main.c源文件中定义func19和getMember函数,并实现相关的功能。
Main.h头文件添加的代码如下
// 实例19:学生成绩输出 void func19(); #define STUNEM 5; // 定义一个学生的成绩表 typedef struct _tagMember { char number[8]; // 学号 char name[16]; // 名字 int math; // 数学分数 int chinese; // 语文分数 int english; // 英语分数 int sum; // 总分 } Member, *pMember; // 定义学生表 typedef struct _tagTable { pMember men; // 学生数据指针 int num; // 学生数量 } Table, *pTable; // 获取学生表中的学生指针 pMember getMember(pTable table, int n);
Main.c源文件添加的代码如下
// 实例19:学生成绩输出 void func19() { pTable table = (pTable)malloc(sizeof(Table)); char i; pMember p; printf("请输入5个学生的学号、姓名、3门课成绩:\r\n"); table->num = STUNEM; table->men = (pMember)malloc(sizeof(Member) * table->num); for (i = 1; i <= table->num; i++) { p = getMember(table, i); scanf_s("%s %s %d %d %d", &p->number, sizeof(p->number), &p->name, sizeof(p->name), &p->math, &p->chinese, &p->english); p->sum = p->math + p->chinese + p->english; } printf("-----------------------------------------------成绩表------------------------------------------------\r\n"); printf("学号\t姓名\t数学\t语文\t英语\t总分\r\n"); for (i = 1; i <= table->num; i++) { p = getMember(table, i); printf("%s\t%s\t%d\t%d\t%d\t%d\r\n", p->number, p->name, p->math, p->chinese, p->english, p->sum); } free(table->men); } pMember getMember(pTable table, int n) { if (n <= table->num && n > 0) return table->men + n - 1; else return 0; }
然后在main()函数中只调用func19()函数,其调试结果如下
3.10、C语言经典实例20-重组数组
在Main.h头文件中声明一个func10函数,然后再Main.c源文件中定义func10函数,并实现相关的功能。
Main.h头文件添加的代码如下
// 实例20:重组数组 void func20(); #define MAX 26 #define START 2 int sort_intfun(const void* a, const void* b);
Main.c源文件添加的代码如下
// 实例20:重组数组 void func20() { int i; int array[20]; srand((unsigned)time(NULL)); // 随机数播种函数 for (i = 0; i < 20; i++) // 产生十个随机数 array[i] = rand() % START; // 设定随机数范围并输出 for (i = 0; i < 20; i++) // 产生十个随机数 { if (array[i] == 0) array[i] = 65 + rand() % MAX; else array[i] = 97 + rand() % MAX; } printf("产生十个随机数是:"); for (i = 0; i < 20; i++) printf("%d ", array[i]); printf("\n"); qsort((void*)array, 20, sizeof(array[0]), sort_intfun); printf("\n用qsort重组数组后的数据是:"); for (i = 0; i < 20; i++) printf("%d ", array[i]); printf("\n"); } int sort_intfun(const void* a, const void* b) { return *(int*)a - *(int*)b; }
然后在main()函数中只调用func20()函数,其调试结果如下