C语言 基础编程练习题(二)
目录1.判断日期是否合法并格式化输出2.递归求斐波那契数列第 n 项3.数组奇偶分离4.提取字符串中的字母和数字5.输入年月计算该月天数6.有序数组折半查找7.统计 100~X 间各位数字和为 15 的数的个数8.找出 1-99 之间的所有同构数9.矩阵加法10.定义日期结构体并计算该日期是本年第几天11.用指针实现两个字符串连接12.单词首字母大写其余字母小写13.用结构体存储 10 名学生信息找出并输出最高分学生14.输入年份查询对应生肖15.杨辉三角16.整数逆序输出保留符号去尾零17.小写转大写自定义函数实现18.删除字符串中的ASCII奇数字符19.冒泡排序并统计交换次数20.自定义函数实现字符串复制1.判断日期是否合法并格式化输出编写一个能判断输入的日期是否合法的小程序。如果合法则按照年月日的格式输出此日期比如输出1998年6月26日否则提示用户您输入的日期有误请重新输入#includestdio.h #includestdbool.h bool isFullYear(int year) { return ((year%40)(year%100!0))||(year%4000); } int getMaxDay(int year,int month) { int std[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; int i(isFullYear(year)month2)?1:0; return std[month]i; } bool check(int year,int month,int day) { return !(year1||month1||month12||day1||daygetMaxDay(year,month)); } int main(void) { int year,month,day; printf(请依次输入年月日(使用空格分隔):); scanf(%d %d %d,year,month,day); if(check(year,month,day)) { printf(%d年%d月%d日,year,month,day); } else { printf(您输入的日期有误,请重新输入!); } return 0; }2.递归求斐波那契数列第 n 项斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233377610987159725844181676510946177112865746368........这个数列从第3项开始每一项都等于前两项之和。编写一个计算斐波那契数列第n项值的小程序。要求用递归函数实现求解斐波那契数列第n项。#includestdio.h int fun(int n) { if(n1||n2) { return 1; } return fun(n-1)fun(n-2); } int main(void) { int n; printf(请输入要求解的项数n:); scanf(%d,n); if(n1) { printf(数据有误); } else { printf(第%d项为:%d,n,fun(n)); } return 0; }3.数组奇偶分离编写程序实现数组元素的奇偶分离功能定义一个包含 10 个整型元素的数组从键盘输入数组元素的值将数组中的奇数和偶数分别提取到两个新数组中最后输出奇数数组和偶数数组的所有元素。例如输入数组{1,2,3,4,5,6,7,8,9,10}输出奇数数组{1,3,5,7,9}偶数数组{2,4,6,8,10}。#includestdio.h #define N 10 void printArr(int arr[N],int n) { int i; for(i0;in;i) { printf(%d ,arr[i]); } } void fun(int arr[N],int ja[N],int oa[N]) { int i,j0,k0; for(i0;iN;i) { int temparr[i]; if(temp%20) { oa[j]temp; } else { ja[k]temp; } } printf(奇数数组:); printArr(ja,k); printf(\n偶数数组:); printArr(oa,j); } int main(void) { int arr[N]; int ja[N]; int oa[N]; int i; for(i0;iN;i) { printf(请输入arr[%d]:,i); scanf(%d,arr[i]); } fun(arr,ja,oa); return 0; }4.提取字符串中的字母和数字编写一个程序,从键盘输入一个字符串长度不超过100分别搜索出其中的字母和数字字符其余的字符一概忽略。将字母序列和数字序列分别组成新的字符串输出。(输入字符串长度在100以内)#includestdio.h #includestring.h #includectype.h #define MAX 100 void fun(char str[MAX],char ch[MAX],char num[MAX]) { int i,j0,k0; for(i0;istrlen(str);i) { char cstr[i]; if(isalpha(c)) { ch[j]c; } else if(isdigit(c)) { num[k]c; } } ch[j]\0; num[k]\0; } int main(void) { char str[MAX]; char ch[MAX]; char num[MAX]; printf(请输入一个字符串:); gets(str); fun(str,ch,num); printf(字母字符串:%s,ch); printf(\n数字字符串:%s,num); return 0; }5.输入年月计算该月天数编写程序从键盘输入年份和月份计算出这一年的这一个月有几天。例如输入2017 1。 输出31天。输入2000 2。 输出29天。#includestdio.h #includestdbool.h bool isFullYear(int year) { return ((year%40)(year%100!0))||(year%4000); } int fun(int year,int month) { int std[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; int i(month2isFullYear(year))?1:0; return std[month]i; } int main(void) { int year,month; printf(请依次输入年月(使用空格分隔):); scanf(%d %d,year,month); if(year1||month1||month12) { printf(数据有误); } else { printf(%d天,fun(year,month)); } return 0; }6.有序数组折半查找数组a中存放10个有序整数{-5,4,9,15,28,45,66,89,100,180}从键盘输入整数m利用折半查找法查找整数m在数组中的位置。若找到返回其下标值否则输出“查找失败”。#includestdio.h int select(int arr[],int n,int m) { int idx-1; int low0; int highn-1; while(lowhigh) { int mid(lowhigh)/2; if(arr[mid]m) { idxmid; break; } if(arr[mid]m) { highmid-1; } else { lowmid1; } } return idx; } int main(void) { int arr[]{-5,4,9,15,28,45,66,89,100,180}; int nsizeof(arr)/sizeof(int); int m; printf(请输入要查找的整数m:); scanf(%d,m); int idxselect(arr,n,m); printf(idx-1?查找失败!:下标为:%d,idx); return 0; }7.统计 100~X 间各位数字和为 15 的数的个数编写自定义函数fun()函数的功能是:找出100至X(X999)之间各位上的数字之和为15的所有整数然后返回符合条件的整数个数。编写主函数输入X的值调用fun()函数输出符合条件的数字个数。#includestdio.h #includestdbool.h bool isOK(int n) { int sum0; while(n0) { sumn%10; n/10; } return sum15; } int fun(int x) { int count0; int i; for(i100;ix;i) { if(isOK(i)) { count; } } return count; } int main(void) { int x; printf(请输入x(100x999):); scanf(%d,x); if(x100||x999) { printf(数据有误); } else { printf(符合条件的数字个数:%d,fun(x)); } return 0; }8.找出 1-99 之间的所有同构数编写程序找出1-99之间的全部同构数同构数是这样一个数他出现在其平方数的右边。例如5是25右边的数25是625右边的数5和25都是同构数。#includestdio.h #includestdbool.h bool isOK(int n) { int in10?10:100; return (n*n)%in; } int main(void) { int i0; int count0; for(i1;i99;i) { if(isOK(i)) { printf(%d\t,i); count; if(count%50) { printf(\n); } } } return 0; }9.矩阵加法编写程序从键盘上输入两个三行四列整型二维数组的值实现两个矩阵的求和并输出显示。#includestdio.h #define M 3 #define N 4 void insert(int arr[M][N]) { int i,j; for(i0;iM;i) { for(j0;jN;j) { printf(请输入arr[%d][%d]:,i,j); scanf(%d,arr[i][j]); } } } void printArr(int arr[M][N]) { int i,j; for(i0;iM;i) { for(j0;jN;j) { printf(%d\t,arr[i][j]); } printf(\n); } } void fun(int a[M][N],int b[M][N]) { int i,j; for(i0;iM;i) { for(j0;jN;j) { a[i][j]a[i][j]b[i][j]; } } } int main(void) { int a[M][N]; int b[M][N]; printf(开始录入第一个数组:\n); insert(a); printf(开始录入第二个数组:\n); insert(b); fun(a,b); printf(运算结果:\n); printArr(a); return 0; }10.定义日期结构体并计算该日期是本年第几天定义一个结构体变量包含年、月、日信息判断今天是本年中的第几天。#includestdio.h #includestdbool.h typedef struct date { int year; int month; int day; }DATE; bool isFullYear(int year) { return ((year%40)(year%100!0))||(year%4000); } int getMaxDay(int year,int month) { int i(month2isFullYear(year))?1:0; int std[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; return std[month]i; } bool isOK(DATE date) { int yeardate.year; int monthdate.month; int daydate.day; return !(year1||month1||month12||day1||daygetMaxDay(year,month)); } int getDays(DATE date) { int yeardate.year; int monthdate.month; int daydate.day; int i(month2isFullYear(year))?1:0; int std[]{0,31,28,31,30,31,30,31,31,30,31,30,31}; int sum0; int j1; for(j1;jmonth;j) { sumstd[j]; } sumday; return sumi; } int main(void) { DATE date; printf(请依次输入年月日(使用空格分隔):); scanf(%d %d %d,date.year,date.month,date.day); if(isOK(date)) { printf(今天是本年的第%d天,getDays(date)); } else { printf(数据有误); } return 0; }11.用指针实现两个字符串连接编写程序用指针的方法将键盘输入的两个字符串(长度不超过50)连接起来形成一个新字符串。#includestdio.h #includestring.h #define MAX 50 void fun(char *s1,char *s2,char *str) { while(*s1!\0) { *(str)*(s1); } while(*s2!\0) { *(str)*(s2); } *str\0; } int main(void) { char s1[MAX]; char s2[MAX]; char str[2*MAX]; printf(请输入第一个字符串:); gets(s1); printf(请输入第二个字符串:); gets(s2); fun(s1,s2,str); printf(拼接后:%s,str); return 0; }12.单词首字母大写其余字母小写编写一个程序将一个英文句子长度不超过100中的每个单词的首字母大写其余字母小写。例如输入 hello world, how are you输出 Hello World, How Are You。#includestdio.h #includestring.h #includestdbool.h #includectype.h #define MAX 100 void fun(char str[MAX]) { int i; bool isNWtrue; for(i0;istrlen(str);i) { char cstr[i]; if(isalpha(c)) { if(isNW) { str[i]toupper(c); isNWfalse; } else { str[i]tolower(c); } } else { isNWtrue; } } } int main(void) { char str[MAX]; printf(请输入一个英文句子:); gets(str); fun(str); printf(%s,str); return 0; }13.用结构体存储 10 名学生信息找出并输出最高分学生编写程序从键盘输入10个学生信息包括学生的学号、姓名和成绩输出最高分学生的学号、姓名和成绩用结构体编程。#includestdio.h #includestring.h #define MAX 255 #define N 10 typedef struct stu { char sid[MAX]; char name[MAX]; float score; }STU; void insert(STU arr[N]) { int i; for(i0;iN;i) { printf(开始录入第%d个学生信息:\n,i1); printf(学号:); gets(arr[i].sid); printf(姓名:); gets(arr[i].name); printf(成绩:); scanf(%f,arr[i].score); getchar(); } } STU findMax(STU arr[N]) { int max0; int i; for(i0;iN;i) { if(arr[i].scorearr[max].score) { maxi; } } return arr[max]; } void printInfo(STU s) { printf(学号:%s\n,s.sid); printf(姓名:%s\n,s.name); printf(成绩:%f,s.score); } int main(void) { STU arr[N]; insert(arr); printf(最高分学生信息:\n); printInfo(findMax(arr)); return 0; }14.输入年份查询对应生肖编写程序实现生肖查询功能从键盘输入用户的出生年份正整数如 1998、2020先校验年份合法性需大于 0非法则输出“年份输入错误”按中国生肖规则鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪匹配生肖合法年份输出“XXXX 年出生的人生肖是XX”。#includestdio.h int fun(int year) { int idx(year-1900)%12; int iidx0?12:0; return idxi; } int main(void) { int year; printf(请输入出生年份:); scanf(%d,year); if(year0) { printf(年份输入错误!); } else { char std[12][4]{鼠,牛,虎,兔,龙,蛇,马,羊,猴,鸡,狗,猪}; printf(%d年出生的人的生肖是:%s,year,std[fun(year)]); } return 0; }15.杨辉三角编程打印如下的杨辉三角前10行。#includestdio.h #define N 10 void fun(int arr[N][N]) { int i,j; for(i0;iN;i) { for(j0;ji;j) { if(ij||j0) { arr[i][j]1; } else { arr[i][j]arr[i-1][j]arr[i-1][j-1]; } } } } void printArr(int arr[N][N]) { int i,j; for(i0;iN;i) { for(j0;ji;j) { printf(%d\t,arr[i][j]); } printf(\n); } } int main(void) { int arr[N][N]; fun(arr); printArr(arr); }16.整数逆序输出保留符号去尾零编写程序实现整数逆序输出功能输入要求接收用户输入的一个整数-10⁹ ~ 10⁹处理规则保留符号负数逆序后仍为负数如 -123→-321去掉末尾无意义的0如1200→21-450→-54输出要求有效输入输出“逆序结果X”若输入为0输出“逆序结果0”。#includestdio.h #includemath.h int fun(int n) { int beforen0?-1:1; int sum0; nabs(n); while(n0) { sumsum*10n%10; n/10; } return sum*before; } int main(void) { int n; printf(请输入一个整数:); scanf(%d,n); printf(逆序结果:%d,fun(n)); return 0; }17.小写转大写自定义函数实现编写一个自定义函数将字符串中的小写字母转换为大写字母在主函数中输入字符串调用自定义函数并输出结果。#includestdio.h #includestring.h #includectype.h #define MAX 255 void fun(char str[MAX]) { int i; for(i0;istrlen(str);i) { char cstr[i]; if(isalpha(c)) { if(cacz) { str[i]toupper(c); } } } } int main(void) { char str[MAX]; printf(请输入一个英文字符串:); gets(str); fun(str); printf(%s,str); return 0; }18.删除字符串中的ASCII奇数字符编写程序完成函数fun(char *p,char *q)其功能是将指针p所指字符串中ASCII值为奇数的字符删除串中剩余字符形成一个新串放在指针q所指的数组中。#includestdio.h #includestring.h #define MAX 255 void fun(char *p,char *q) { while(*p!\0) { char c*(p); if(c%20) { *(q)c; } } *q\0; } int main(void) { char p[MAX]; char q[MAX]; printf(请输入一个英文字符串:); gets(p); fun(p,q); printf(%s,q); return 0; }19.冒泡排序并统计交换次数编写一个程序对给定的一组整数进行排序使用冒泡排序算法然后输出排序后的结果并统计排序过程中交换元素的次数。#includestdio.h int bubbleSort(int arr[],int n) { int count0; int i,j; for(i0;in-1;i) { for(j0;jn-i-1;j) { if(arr[j]arr[j1]) { int temparr[j]; arr[j]arr[j1]; arr[j1]temp; count; } } } return count; } void printArr(int arr[],int n) { int i; for(i0;in;i) { printf(%d ,arr[i]); } } int main(void) { int arr[]{5,2,0,-1,3,1,-4}; int nsizeof(arr)/sizeof(int); printf(原始数组:); printArr(arr,n); int countbubbleSort(arr,n); printf(\n排序后数组:); printArr(arr,n); printf(\n交换次数:%d,count); }20.自定义函数实现字符串复制编写函数 mystrcpy()将长度为n的字符串从第m个字符开始的全部字符复制成另一个字符串并返回指针。#includestdio.h #includestring.h #define MAX 255 char *mystrcpy(char *str,char *sub,int m) { int i0; char *psub; while(*str!\0) { i; if(im) { *(p)*str; } *str; } *p\0; return sub; } int main(void) { char str[MAX]; char sub[MAX]; printf(请输入一个字符串:); gets(str); int m; printf(请输入要开始的位置:); scanf(%d,m); if(m1||mstrlen(str)) { printf(数据有误); } else { printf(%s,mystrcpy(str,sub,m)); } return 0; }往期文章C语言 基础编程练习题一Java 基础编程练习题 (一)Java 基础编程练习题 (二)Java 基础编程练习题 (三)