目录
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 基础编程练习题 (三)