news 2026/5/21 3:41:54

C语言 基础编程练习题(二)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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日;否则提示用户:您输入的日期有误,请重新输入!

#include<stdio.h> #include<stdbool.h> bool isFullYear(int year) { return ((year%4==0)&&(year%100!=0))||(year%400==0); } 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)&&month==2)?1:0; return std[month]+i; } bool check(int year,int month,int day) { return !(year<1||month<1||month>12||day<1||day>getMaxDay(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, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........这个数列从第3项开始,每一项都等于前两项之和。编写一个计算斐波那契数列第n项值的小程序。要求用递归函数实现求解斐波那契数列第n项。

#include<stdio.h> int fun(int n) { if(n==1||n==2) { return 1; } return fun(n-1)+fun(n-2); } int main(void) { int n; printf("请输入要求解的项数n:"); scanf("%d",&n); if(n<1) { 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}。

#include<stdio.h> #define N 10 void printArr(int arr[N],int n) { int i; for(i=0;i<n;i++) { printf("%d ",arr[i]); } } void fun(int arr[N],int ja[N],int oa[N]) { int i,j=0,k=0; for(i=0;i<N;i++) { int temp=arr[i]; if(temp%2==0) { 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(i=0;i<N;i++) { printf("请输入arr[%d]:",i); scanf("%d",&arr[i]); } fun(arr,ja,oa); return 0; }

4.提取字符串中的字母和数字

编写一个程序,从键盘输入一个字符串(长度不超过100),分别搜索出其中的字母和数字字符,其余的字符一概忽略。将字母序列和数字序列分别组成新的字符串输出。(输入字符串长度在100以内)

#include<stdio.h> #include<string.h> #include<ctype.h> #define MAX 100 void fun(char str[MAX],char ch[MAX],char num[MAX]) { int i,j=0,k=0; for(i=0;i<strlen(str);i++) { char c=str[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天。

#include<stdio.h> #include<stdbool.h> bool isFullYear(int year) { return ((year%4==0)&&(year%100!=0))||(year%400==0); } int fun(int year,int month) { int std[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int i=(month==2&&isFullYear(year))?1:0; return std[month]+i; } int main(void) { int year,month; printf("请依次输入年月(使用空格分隔):"); scanf("%d %d",&year,&month); if(year<1||month<1||month>12) { printf("数据有误"); } else { printf("%d天",fun(year,month)); } return 0; }

6.有序数组折半查找

数组a中存放10个有序整数{-5,4,9,15,28,45,66,89,100,180}

从键盘输入整数m,利用折半查找法查找整数m在数组中的位置。若找到,返回其下标值,否则输出“查找失败!”。

#include<stdio.h> int select(int arr[],int n,int m) { int idx=-1; int low=0; int high=n-1; while(low<=high) { int mid=(low+high)/2; if(arr[mid]==m) { idx=mid; break; } if(arr[mid]>m) { high=mid-1; } else { low=mid+1; } } return idx; } int main(void) { int arr[]={-5,4,9,15,28,45,66,89,100,180}; int n=sizeof(arr)/sizeof(int); int m; printf("请输入要查找的整数m:"); scanf("%d",&m); int idx=select(arr,n,m); printf(idx==-1?"查找失败!":"下标为:%d",idx); return 0; }

7.统计 100~X 间各位数字和为 15 的数的个数

编写自定义函数fun(),函数的功能是:找出100至X(X<=999)之间各位上的数字之和为15的所有整数,然后返回符合条件的整数个数。编写主函数,输入X的值,调用fun()函数,输出符合条件的数字个数。

#include<stdio.h> #include<stdbool.h> bool isOK(int n) { int sum=0; while(n>0) { sum+=n%10; n/=10; } return sum==15; } int fun(int x) { int count=0; int i; for(i=100;i<=x;i++) { if(isOK(i)) { count++; } } return count; } int main(void) { int x; printf("请输入x(100<=x<=999):"); scanf("%d",&x); if(x<100||x>999) { printf("数据有误"); } else { printf("符合条件的数字个数:%d",fun(x)); } return 0; }

8.找出 1-99 之间的所有同构数

编写程序,找出1-99之间的全部同构数,同构数是这样一个数:他出现在其平方数的右边。例如:5是25右边的数,25是625右边的数,5和25都是同构数。

#include<stdio.h> #include<stdbool.h> bool isOK(int n) { int i=n<10?10:100; return (n*n)%i==n; } int main(void) { int i=0; int count=0; for(i=1;i<=99;i++) { if(isOK(i)) { printf("%d\t",i); count++; if(count%5==0) { printf("\n"); } } } return 0; }

9.矩阵加法

编写程序,从键盘上输入两个三行四列整型二维数组的值,实现两个矩阵的求和并输出显示。

#include<stdio.h> #define M 3 #define N 4 void insert(int arr[M][N]) { int i,j; for(i=0;i<M;i++) { for(j=0;j<N;j++) { printf("请输入arr[%d][%d]:",i,j); scanf("%d",&arr[i][j]); } } } void printArr(int arr[M][N]) { int i,j; for(i=0;i<M;i++) { for(j=0;j<N;j++) { printf("%d\t",arr[i][j]); } printf("\n"); } } void fun(int a[M][N],int b[M][N]) { int i,j; for(i=0;i<M;i++) { for(j=0;j<N;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.定义日期结构体并计算该日期是本年第几天

定义一个结构体变量,包含年、月、日信息,判断今天是本年中的第几天。

#include<stdio.h> #include<stdbool.h> typedef struct date { int year; int month; int day; }DATE; bool isFullYear(int year) { return ((year%4==0)&&(year%100!=0))||(year%400==0); } int getMaxDay(int year,int month) { int i=(month==2&&isFullYear(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 year=date.year; int month=date.month; int day=date.day; return !(year<1||month<1||month>12||day<1||day>getMaxDay(year,month)); } int getDays(DATE date) { int year=date.year; int month=date.month; int day=date.day; int i=(month>2&&isFullYear(year))?1:0; int std[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int sum=0; int j=1; for(j=1;j<month;j++) { sum+=std[j]; } sum+=day; return sum+i; } 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)连接起来形成一个新字符串。

#include<stdio.h> #include<string.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"。

#include<stdio.h> #include<string.h> #include<stdbool.h> #include<ctype.h> #define MAX 100 void fun(char str[MAX]) { int i; bool isNW=true; for(i=0;i<strlen(str);i++) { char c=str[i]; if(isalpha(c)) { if(isNW) { str[i]=toupper(c); isNW=false; } else { str[i]=tolower(c); } } else { isNW=true; } } } int main(void) { char str[MAX]; printf("请输入一个英文句子:"); gets(str); fun(str); printf("%s",str); return 0; }

13.用结构体存储 10 名学生信息,找出并输出最高分学生

编写程序,从键盘输入10个学生信息,包括学生的学号、姓名和成绩,输出最高分学生的学号、姓名和成绩(用结构体编程)。

#include<stdio.h> #include<string.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(i=0;i<N;i++) { printf("开始录入第%d个学生信息:\n",i+1); printf("学号:"); gets(arr[i].sid); printf("姓名:"); gets(arr[i].name); printf("成绩:"); scanf("%f",&arr[i].score); getchar(); } } STU findMax(STU arr[N]) { int max=0; int i; for(i=0;i<N;i++) { if(arr[i].score>arr[max].score) { max=i; } } 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”。

#include<stdio.h> int fun(int year) { int idx=(year-1900)%12; int i=idx<0?12:0; return idx+i; } int main(void) { int year; printf("请输入出生年份:"); scanf("%d",&year); if(year<0) { printf("年份输入错误!"); } else { char std[12][4]={"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"}; printf("%d年出生的人的生肖是:%s",year,std[fun(year)]); } return 0; }

15.杨辉三角

编程打印如下的杨辉三角前10行。

#include<stdio.h> #define N 10 void fun(int arr[N][N]) { int i,j; for(i=0;i<N;i++) { for(j=0;j<=i;j++) { if(i==j||j==0) { 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(i=0;i<N;i++) { for(j=0;j<=i;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”。

#include<stdio.h> #include<math.h> int fun(int n) { int before=n<0?-1:1; int sum=0; n=abs(n); while(n>0) { sum=sum*10+n%10; n/=10; } return sum*before; } int main(void) { int n; printf("请输入一个整数:"); scanf("%d",&n); printf("逆序结果:%d",fun(n)); return 0; }

17.小写转大写,自定义函数实现

编写一个自定义函数,将字符串中的小写字母转换为大写字母,在主函数中输入字符串调用自定义函数并输出结果。

#include<stdio.h> #include<string.h> #include<ctype.h> #define MAX 255 void fun(char str[MAX]) { int i; for(i=0;i<strlen(str);i++) { char c=str[i]; if(isalpha(c)) { if(c>='a'&&c<='z') { 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所指的数组中。

#include<stdio.h> #include<string.h> #define MAX 255 void fun(char *p,char *q) { while(*p!='\0') { char c=*(p++); if(c%2==0) { *(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.冒泡排序并统计交换次数

编写一个程序,对给定的一组整数进行排序(使用冒泡排序算法),然后输出排序后的结果,并统计排序过程中交换元素的次数。

#include<stdio.h> int bubbleSort(int arr[],int n) { int count=0; int i,j; for(i=0;i<n-1;i++) { for(j=0;j<n-i-1;j++) { if(arr[j]>arr[j+1]) { int temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; count++; } } } return count; } void printArr(int arr[],int n) { int i; for(i=0;i<n;i++) { printf("%d ",arr[i]); } } int main(void) { int arr[]={5,2,0,-1,3,1,-4}; int n=sizeof(arr)/sizeof(int); printf("原始数组:"); printArr(arr,n); int count=bubbleSort(arr,n); printf("\n排序后数组:"); printArr(arr,n); printf("\n交换次数:%d",count); }

20.自定义函数实现字符串复制

编写函数 mystrcpy(),将长度为n的字符串从第m个字符开始的全部字符复制成另一个字符串并返回指针。

#include<stdio.h> #include<string.h> #define MAX 255 char *mystrcpy(char *str,char *sub,int m) { int i=0; char *p=sub; while(*str!='\0') { i++; if(i>=m) { *(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(m<1||m>strlen(str)) { printf("数据有误"); } else { printf("%s",mystrcpy(str,sub,m)); } return 0; }

往期文章

C语言 基础编程练习题(一)

Java 基础编程练习题 (一)

Java 基础编程练习题 (二)

Java 基础编程练习题 (三)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 3:41:35

2026年自助建站平台哪个好?推荐这4个知名建站平台!

2026年自助建站平台哪个好&#xff1f;推荐这4个知名建站平台&#xff01;想搭建官网、小程序的中小企业和个体户&#xff0c;选对建站平台能省下大量时间和成本。结合艾瑞咨询、中国信通院发布的《2026年中国企业数字化服务市场研究报告》与《2026年中国网站建设行业白皮书》数…

作者头像 李华
网站建设 2026/5/21 3:41:34

【正式版上线】Open Claw 2.7.5 桌面端一键安装部署教程

前言 2026 年开源圈热门的「数字员工」OpenClaw&#xff08;昵称小龙虾&#xff09;&#xff0c;GitHub 星标突破 28 万&#xff0c;凭借本地运行 零代码操作 自动干活的核心优势广受关注&#xff01;很多人误以为它是普通聊天 AI&#xff0c;实则是能真正操控电脑的自动化神…

作者头像 李华
网站建设 2026/5/21 3:40:57

uniapp输入框fixed定位,导致页面顶起解决方案

解决方案在pages页面中使用禁止页面向上顶起&#xff0c;设置fixed的bottom等于0即可 "app-plus": {"softinputMode": "adjustResize", } 但由于我首页页面设置禁止顶起 页面显示会错乱原因是在键盘弹起时会导致 iOS 的 viewport 收缩&#xf…

作者头像 李华
网站建设 2026/5/21 3:40:54

图像生成初探:OpenAI 与千帆平台一键出图

前面我们让 AI 学会了对话、推理&#xff0c;但一直局限于文字。今天我们要解锁一个新维度——图像生成。只需要一句描述&#xff0c;AI 就能帮你画出对应的图片。 在 Spring AI 中&#xff0c;图像生成和对话聊天使用的是完全不同的模型接口。对话用的是 ChatClient&#xff0…

作者头像 李华
网站建设 2026/5/21 3:39:57

别再傻等!EPLAN部件库导入太慢?试试这个解压导入法,效率翻倍

EPLAN部件库高效导入实战&#xff1a;解压法与便携式部署全解析 电气工程师们对EPLAN的部件库导入速度缓慢一定深有体会——当你拿到一个几百兆的EDZ文件&#xff0c;点击导入后泡杯咖啡回来可能进度条才走了一半。这种等待不仅浪费时间&#xff0c;更会打断工作节奏。本文将彻…

作者头像 李华
网站建设 2026/5/21 3:39:56

知网查重和AIGC检测有什么区别?2026论文AI率降到20%教程

“老师说我论文要过查重和查AI两关&#xff0c;这俩不是一回事吗&#xff1f;” 这是今年毕业季被问得最多的问题之一。很多同学以为查重和查AI是同一件事&#xff0c;或者以为过了查重就万事大吉。结果提交论文后被通知AI率超标&#xff0c;又得回来改。 今天把这两件事彻底讲…

作者头像 李华