C语言程序代码30题(详细注解版——自用复习)

227 阅读24分钟
1. 输出闰年,3个年号换一行 1900-2000年 (pass!!!)

复习备注:较为简单,主要运用到了for循环,建议过。

/*最终输出的结果如下图所示: 
1904 1908 1912
1916 1920 1924
1928 1932 1936
1940 1944 1948
1952 1956 1960
1964 1968 1972
1976 1980 1984
1988 1992 1996
2000
*/ 
int main(){
	int years,count=0;
	for(years=1900;years<=2000;years++){
		if(years%4==0&&years%100!=0||years%400==0)
		{
			printf("%d ",years);
			count++;
			if((count%3)==0)
			printf("\n");
		}
	}
	return 0;
}
2. 学生信息的相关数据显示操作

//复习备注:涉及结构体,打擂算法,多加复习 ①输入学生的信息(学号、性别、姓名、四门课成绩) ②输出总平均成绩最高的学生的信息(学号、性别、姓名、平均成绩)

********输出结果:
请输入学生1的学号、性别、姓名、成绩:
1 1 1 1 1 1 1
请输入学生2的学号、性别、姓名、成绩:
2 2 2 2 2 2 2
请输入学生3的学号、性别、姓名、成绩:
3 3 3 3 3 3 3
总平均成绩最高的是:学号:3,性别:3,姓名:3,平均成绩:3.000000 
#include <stdio.h>
#define N 3 //此处不要加分号,否则会报错 
//结构体的定义一般放在主函数的上方 
	struct student{
	long stu_num;//学号 
	char sex;//性别 
	char name[15];//姓名 
	int score[4];//分数 
	float average;//平均分 //平均分存在小数,故设置为浮点型 
	}stu[31];//存放学生信息的数组 
int main() {
	int i,j,index;
	float sum,max;
	//struct student stu[3];
//控制学生成绩的输入 
for(i=0;i<N;i++)
{
	printf("请输入学生%d的学号、性别、姓名、成绩:\n",i+1);
	//注意要加上取地址符 
	scanf("%ld %c %s",&stu[i].stu_num,&stu[i].sex,&stu[i].name);
	for(j=0;j<4;j++)
		scanf("%d",&stu[i].score[j]); //一个学生有多个成绩 
} 
//计算每位学生成绩的平均值 
for(i=0;i<N;i++)
{
	sum = 0.0;//注意要重新置为0(是每位学生的)
	for(j=0;j<4;j++)
		sum+=stu[i].score[j];
	stu[i].average = sum/4.0; 
}
	//找出平均成绩的最大值,并进行输出操作 
	max = stu[0].average;
	index = 0;
	for (i=1;i<N;i++)
	{
		if(stu[i].average>max)
		{
		max = stu[i].average;
		index = i; 
		}
	}
			printf("总平均成绩最高的是:学号:%d,性别:%c,姓名:%s,平均成绩:%lf\n",stu[index].stu_num,stu[index].sex,stu[index].name,stu[index].average);
} 
3. 从键盘当中输入10个整数,找出第一个能被7整除的数,若找到后打印该数,否则打印“未找到此数” (pass!!!)

//复习备注:1、用数组的--先输入再遍历输出; 2、边输入边输出

//方法一、
int main() {
	int num[10],i;
	for(i=1;i<=10;i++){
		scanf("%d",&num[i]);
	}
	for(i=1;i<=10;i++)
	{
			if(num[i]%7==0)
			{
			printf("找到此数:%d\n",num[i]);
			break;
			} 
	}
if(i>10)
	printf("未找到此数!");	
	return 0;	
}
//方法二、
int main() {
	int i,a;
	for(i=1;i<=10;i++){
		scanf("%d",&a);
		if(a%7==0){
		printf("%d",a);
		break;
		} 
	}
	if(i==11){
	printf("not exist!");
	return 0;
	} 
}
4.从键盘上输入a与n的值,计算sum=a+aa+aaa.......

//复习备注:再过一遍关键性代码,如何生成a、aa、aaaa..... //设计主要思路:生成每个数,生成项

int main() {
	int a,n,i,t=0,sum=0;
	scanf("%d %d",&a,&n);
	for(i=1;i<=n;i++)
	{
		t+=a;
		sum+=t;
		t*=10; //不是这个t+=a*10; 
	}
	printf("sum=%d",sum);
}
5.从键盘当中输入10个评委的分数,去掉一个最高分,去掉一个最低分,求出其余8个人的平均分输出平均分,最高分,最低分

//程序设计的主体思路:利用数组+打擂算法,找出最高分和最低分,最后算平均分时候,将其总分减去两个分数,人数为8人即可

#define N 10
int main(){
	int scores[N],max,min,i,sum=0;
	float aver;
	printf("请输入10位评委的分数:\n");
	for(i=0;i<N;i++)
	{
		scanf("%d",&scores[i]);
	}
	max=min=scores[0];//将最小值和最大值进行初始化 
	for(i=0;i<N;i++){
		sum+=scores[i];
		if(scores[i]>max)
			max=scores[i];
		if(scores[i]<min)
			min=scores[i];
	}
	aver=(sum-min-max)/8.0;//如果这里为8的话,就变成了整数与整数相除,这样会导致向下取整,故结果为5.000000 
	printf("最高分:%d,最低分:%d,平均成绩为:%f",max,min,aver);
	return 0;
}
6、文件的相关字符串读取操作
6-1 将文件file1.txt文件中的内容读出并显示到屏幕上
int main() {
	FILE *fp;
	fp=fopen("file.txt","r");
	char ch;
	while((ch=getc(fp))!=EOF)//一直读取到文件字符末尾(言外之意就是读取全部字符) 
		putchar(ch);
	fclose(fp);
	return 0;
}
//6-2 将文本文件的file1.txt中的内容复制到文本文件file2.txt当中,同时将小写字母转化为大写字母
//核心:fputc和fgetc函数的应用
int main() {
	FILE *fp1;
	FILE *fp2;
	char ch;
	fp1=fopen("file1.txt","r");
	fp2=fopen("file2.txt","w");
	while((ch=getc(fp1))!=EOF){
		if(ch>='a'&&ch<='z')//完成大小写字母的转换 
			ch=ch-32;//或 ch-='a'-'A';
			fputc(ch,fp2);//将ch的值输出到fp2 
	}
	fclose(fp1); 
	fclose(fp2);
	printf("文件写入成功!");
	return 0;
}
7.字符或者数字的顺序性的输出问题汇总
7-1 逆序输出一个输入的数
//隐藏条件:次数未知、不知道具体的循环次数,故此处使用while循环 
int main() {
	int x,digit=0,rev=0;
	scanf("%d",&x);//控制输入数字 
	while(x!=0)//这里修改为此条件,目的在于负数也可以转置 
	{
		digit=x%10;//不断取个位数 
		rev=rev*10+digit;
		x/=10;//将小数点不断左移,保证每次向左取数 
	}
	printf("%d",rev);//打印转置后的数 
} 
//7-2 正序输出一个数的各位数字 
#include <stdio.h>
int main(){
	int x,t,count=1;
	scanf("%d",&x);
	t=x;
	while(t>9)//用于计算x为几位数,如果为两位数则为100 
	//不能写成>=(此时打印的第一个数字就是0) 
	{
		t/=10;
		count*=10;
	}
	do
	{
		int d=x/count; //不断取最高位,并依次输出 
		printf("%d ",d);
		x%=count;//去掉最高位置的数 !!!!
		count/=10;
	}while(count>0);
}
//扩展:逆序输出输出数字:实质就是取低位,去低位,再取低位,如此往复,直至完全取完 
#include <stdio.h>
int main(){
	int x,t,count=0;
	scanf("%d",&x);
	t=x;
	while(t>9)//用于计算x为几位数,如果为两位数则为100 
	//不能写成>=(此时打印的第一个数字就是0) 
	{
		t/=10;
		count++;
	}
	do
	{
		int d=x%10; //不断取最高位,并依次输出 
		printf("%d ",d);
		x=x/10;//去掉最高位置的数 !!!!
		count--;
	}while(count>=0);
} 
//7-3、将输入的字符串反序输出
//重点:gets()和puts()函数 
//字符数组:来存取输入的字符串、i,j用来遍历、k用来保存长度、temp用来作为临时变量用于交换 
//复习备注:掌握对当行字符串的处理方法,使用特殊函数,提高效率,减少代码量 
#include <string.h>
int main(){
	char c[200],temp;
	int i,j,k; 
	printf("请输入一个字符串:\n");
	gets(c);//输入字符 
	k=strlen(c);//计算字符的长度 
	for(i=0,j=k-1;i<k/2;i++,j--)//i表示字符头,j表示字符尾 
	{
		//交换首尾字符的位置 
		temp=c[i];
		c[i]=c[j];
		c[j]=temp;
	}
	puts(c);//输出字符 
	return 0;
}
8.输出200-300之间的素数

//复习建议:标志数的合理使用(涉及判断条件类问题(如判定与否的问题))

//代码亮点:运用了定义函数功能,提高了代码阅读性 
#include <math.h> 
int prime(int x){
//i:因子遍历量、isprime:素数与否的标志数、k遍历的范围 
	int i,isprime=1,k=sqrt(x);
	for(i=2;i<=k;i++){
		if(x%i==0)
		{
		isprime=0;
		break; 
		}
	}
	return isprime;
}
int main(){
	int i;
	for(i=200;i<300;i++){
		if(prime(i)==1)
			printf("%d是素数\n",i);
	}
	return 0;
}
9.输入两个字符,若这两个字符之差为偶数,则输出前驱字符,否则输出后继字符
//前驱字符:较小字母前面的,后继字符:较小字母后面的
//代码两点:三目运算符的运用,简化了代码量;
//复习备注:三目运算符的运用 
int main() {
	char a,b,y;//a为字符1,b为字符2 
	printf("请输入两个字符:\n");
	scanf("%c %c",&a,&b);
	if((a-b)%2==0)
	{
		y=(a<b?a:b);
		y--;
		printf("%c",y);
	}
	else
	{
		y=(a>b?a:b);
		y++;
		printf("%c",y);
	}
	return 0; 
}
10.输入年份和月份,输出该月的天数(应先判断是否为闰年)
//switch-case语句的运用、标志数的使用 
//利用其函数带来的返回值来进行计算天数 
int main(){
	int year,month,days=0,isprime=0;
	printf("请输入年份和月份\n");
	scanf("%d %d",&year,&month);
	if(year%4==0&&year%100!=0||year%400==0)
		isprime=1;
	switch(month){
		case 1:case 3:case 5:case 7:case 8:case 10:case 12:
			days=31;
			break;
		case 4:case 6:case 9:case 11:
			days=30;
			break;
		case 2:
			days=28+isprime;//闰年的2月份为29天,利用其函数带来的返回值来进行计算天数 
	}
	printf("%d年%d月有%d天",year,month,days);
	return 0;
}
11.输入10个数字,将这十个数按升序输出,并且奇数在前,偶数在后。例如10个数是10,9,8,7,6,5,4,3,2,1
//方法一、
//冒泡排序算法 
int sort(int a[],int n){
	int i,temp,j;
	for(i=0;i<n;i++){
		for(j=0;j<n-i-1;j++){
			if(a[j]>a[j+1])
			{
			temp=a[j];
			a[j]=a[j+1];
			a[j+1]=temp;
			}
		}
	}
} 
int main(){
	int m[10],i,j,odd[10],k=0,eve[10],n=0;
	printf("请输入10个数字:\n");
	for(i=0;i<10;i++)
		scanf("%d",&m[i]);
	for(i=0;i<10;i++)
	{
		if(m[i]%2==0)//判断其奇偶性,分别将奇数和偶数赋值给不同的数组 
			odd[k++]=m[i];
		else
			eve[n++]=m[i];
	}
	sort(odd,k);
	sort(eve,n);
	for(j=0;j<n;j++)
		printf("%d ",eve[j]);
	for(i=0;i<k;i++)
		printf("%d ",odd[i]);
}
//方法二、采取先分奇偶再排序
12.录入一段英文文章(存放在数组a当中),统计其中的单词个数,并按照单词长度,从小到大输出各个单词。假定这段文章不超过1000个字符,单词不超过240个,请自行设计录入结束条件
#include <stdio.h> 
#include <stdlib.h>//引入目的:为了使用malloc函数 
#include <string.h>
	struct voca
	{
		char word[20];
		int lent;//单词的长度
	};
	int main(){
		int i=0,word=0,len;
		struct voca *danci;//定义一个结构体指针
		danci = (struct voca *)malloc(240 *sizeof(struct voca));
		//(类型)malloc(大小) 
		char a[1000];
		int j = 0;
		printf("请输入:\n");
		gets(a);//gets函数里面所含的是数组 
		//**********功能1:实现单词个数的统计********** 
		while(a[i]!='\0')
		{
			if(a[i]==' ')
				for(i++;a[i]==' ';i++);//连续跳过所有空格
			else
			{
				word++;//计算单词数
				len=1;
				for(i++;a[i]!='\0'&&a[i]!=' ';i++)//连续跳过所有字符
				{
					len++; 
				} 
				danci[j].lent=len;//该单词的长度
				strncpy(danci[j].word,a+i-len,len);
				j++;
			} 
		}
		//************功能2:实现单词的排序********** 
		int m,n;
		struct voca t;
		for(m=0;m<word;m++)
			for(n=0;n<word-m;n++)
			{
				//关于比较的另外一个函数是strcmp(str1,str2) 相等返回0,大于返1,小于返-1 
				if(danci[n].lent>danci[n+1].lent)
				{
					t=danci[n];
					danci[n]=danci[n+1];
					danci[n+1]=t;
				}
			}
			int f;
			printf("从小到大的顺序:\n");
			for(f=0;f<word+1;f++)
			{
				printf("%s ",danci[f].word);
			}
			printf("\n");
			printf("单词数为:%d\n",j);
			printf("结构体的大小为:%d",sizeof(voca)); 
			return 0;
	}
13.输入一行字符,统计其中有多少个单词,单词之间用空格符隔开(通过字符数组来处理字符串)
int main(){
	char str[100];
	int i=0,word=0;
	printf("请输入一行字符:\n");
	gets(str);
	while(str[i]!='\0')
	{
		if(str[i]==' ')
			for(i++;str[i]==' ';i++) ;//跳过空格  
		else
		{
			word++;
			for(i++;str[i]!='\0'&&str[i]!=' ';i++) ;//跳过字符
		}
	}
	printf("该行字符串中一共有%d个单词",word);
	return 0;
}
14.排列组合问题,0,1,2,3,4,组成无重复的3位数字并输出
int main() 
{
	int i,j,k,count=0,num;
	for(i=1;i<=4;i++)
		for(j=0;j<=4;j++)
			for(k=0;k<=4;k++){
				if(i!=j&&i!=k&&k!=j)
				{
				num = i*100+j*10+k;
				count++;
				printf("%d ",num);
				if(count%5==0)
					printf("\n");
				}
			}
			printf("\n共计有%d个数",count);
		return 0;
}
15.求所100-1000有水仙花数,输出并统计其总个数(水仙花数是指一个3位数:各位数字立方之和等于该数本身)
int main(){
	int i,j,k,num,count=0;
		for(num=100;num<1000;num++){
		i=num/100;//百位
		j=num/10%10;//十位
		k=num%10;//个位 
		if(i*i*i+j*j*j+k*k*k==num){
			printf("%d ",num);
			count++;
			if(count%5==0)
				printf("\n");
		}
	}
	printf("水仙花数的个数为:%d",count);
	return 0;
}
16.找1-10000以内的完数并输出其完数和其个数(这个数等于除它本身以外的所有因子之和)
//代码主要思路:求出所有因子之和,然后与原数进行比较,看看其是否相等,相等则为完数 
int main(){
	int num,sum,i,count=0;
	printf("找到的完数如下:\n");
	for(num=1;num<10000;num++){
		sum=0;//!!!每次因子之和之前,都要将因子之和进行初始化 
		for(i=1;i<num;i++){
			if(num%i==0)
				sum+=i;
		} 
		if(sum==num)
		{
			printf("%d ",num);
			count++;
		}
	}
	printf("\n完数的个数为:%d",count);
	return 0;
}
17.将一个不小于2的整数进行分解质因数(40=222*5)
//主要思路:先%看是否能被整除,后/去掉该因子,(如果涉及到对原数的后期的使用,则需要先将原数copy一份出来 )
int main(){
	int num,k=2;
	printf("请输入一个大于2的整数:\n");
	scanf("%d",&num);
	printf("质因子的分解结果为:%d=",num);
	while(1){
		if(num%k==0)//如果该数为整数num的某个因子则进入到下一步 
		{
			num/=k;//去除整数num的某个因子 
			if(num>1)//如果除掉因子的数依然大于1的话则将其输出并留好尾巴* 
				printf("%d*",k);
			else
			//意味着这是最后一个因子,则直接输出,并跳出循环体 
			{
				printf("%d",k);
				break;
			}
		}
		else
			k++;//如果不等于0说明该数不是因子,则继续自增进行循环 
	}
	return 0;
}
18.判断重复数字(输入一个9位数的无符号整数,判断是否有重复数字)
//思路1、答案的主要思路为用long数据类型来接收数据,用count数组来进行计数,最后遍历循环count数组各个数字次数判断符合条件的即可 
//用数组对应的下标来统计对应的数字,相应下标对应的数据即为数字的重复次数 
//思路2、用数组来存取数字,并采用数组遍历的方式来进行 
/*
int main() {
	int i,n;
	long num;//数字用长整型数据类型进行存储,并且 
	int count[10]={0};//用于统计重复数字个数的数组 
	printf("请输入一个正整数:");
	scanf("%ld",&num);
	n=num;
	//对输入的数字进行拆分和统计 
	while(n!=0){
		count[n%10]++;//利用数字对应的数组下标来统计各个数字的次数(记个) 
		n/=10;//去掉统计完的个位上的数 (去个) 
	}
	for(i=0;i<10;i++)
	{
		if(count[i]>1)
			break;
	}
	if(i<10)
		printf("整数%d中存在重复数字。\n",num);
	else
		printf("整数%d中不存在重复的数字。\n",num);
	for(i=0;i<10;i++)
		printf("%d出现的次数为:%d次\n",i,count[i]);
	return 0;
} 
19.编写一个程序:将一个数插入升序数组当中,是插入后的数组仍然是升序
//注意:关于此题的代码逻辑要注意顺清楚,复习建议:加强巩固复习 
#define N 11
int main(){
	//注意在定义数组的时候,要预留好待插入的位置
	//*p=num+N-2 让指针指向最后一个数字,N-2表示下标为0-9 
	int num[N]={1,3,5,7,11,14,18,20,21,89},*p=num+N-2,n,i;
	printf("请输入需要插入的数字:\n");
	scanf("%d",&n);
	//保证指针不越界 
	while(p>=num)
	{
	if(*p>n)
	{
	*(p+1)=*p;//指针指向的数字后移 
	p--;//指针变量继续向左进行扫描比较 
	}
	//若带插入数据比原有的数据要大,则直接跳出循环 
	else
		break;
	}
	*(p+1)=n;//将待插入数据赋值给最右边的指针 
	for(i=0;i<N;i++){
		printf("%d ",num[i]);
	}
	return 0;
}
20.从字符串中提取整数 (假设输入的字符串中有数字和非数字字符,编写程序找出找出字符串中 所有连续的数字字符组成的整数,并统计 ) 循环不确定,故使用while语句
#include <string.h> 
int main(){
	char str[100]={0};//用户输入的字符数组 
	int i=0,num=0,count=0;//i循环遍历,num拼凑整数,count计数 
	printf("请输入一个包含多字段的字符串:\n");
	gets(str);
	printf("从该字符串找到的整数有:\n");
	while(str[i]){
		if(str[i]>='0'&&str[i]<='9')
		{
			for(num=0;str[i]<='9'&&str[i]>='0';i++)
			num=num*10+(str[i]-'0');//str[i]-'0'表示连续处理多个字符,并将其转换为字符形式 
			count++;//统计整数的个数 
			printf("No %d:%d ",count,num);
		}
		else
		{
			while(str[i]!='\0'&&(str[i]>'9'||str[i]<'0'))
			i++;//跳过所有非数字字符 
		} 
	}
		printf("\n共找到%d个整数",count);
		return 0;
}
//改版——将找数字修改为找字符! 
//关键在于有些值需要进行初始化,临时存放寻找的字符,清空临时字符数组+数组下标归0操作,方便下次继续使用 
请输入一段字符串(含字母和数字)
zhang1li2wang3zhao4
输入的字符串当中含有的字母如下:
字符提取到的第1个字符为:zhang
字符提取到的第2个字符为:li
字符提取到的第3个字符为:wang
字符提取到的第4个字符为:zhao
总共找到了4个字母字符:
#include <stdio.h> 
#include <string.h>
int main(){
	char str[100],str1[100];
	int count=0,i=0,k=0;
	printf("请输入一段字符串(含字母和数字)\n"); 
	gets(str);
	printf("输入的字符串当中含有的字母如下:\n");
	while(str[i]!='\0'){
		if(str[i]<='z'&&str[i]>='a'||str[i]<='Z'&&str[i]>='A')
		{
			for(memset(str1,0,sizeof(str1)),k=0;(str[i]<='z'&&str[i]>='a')||(str[i]<='Z'&&str[i]>='A');i++,k++)
			{
				str1[k]=str[i];
			}
			count++;
			printf("字符提取到的第%d个字符为:",count);
			puts(str1);
		}
		else
			i++;
		}
	printf("总共找到了%d个字母字符:",count);
	return 0;
	}
21.将两个升序数组合并为一个新的升序数组
//主要思路:两数组比较,小的放入新数组,依次下去,最终还要对剩余情况进行考虑,将剩余的部分全部放入最终的大数组当中 
#define M 10
#define N 8
void merge_sort(int *x,int lenx,int *y,int leny,int *z){
	int i=0,j=0,k=0;
	while(i<lenx&&j<leny)
	{
		if(x[i]<y[j])
			z[k++]=x[i++];
		else
			z[k++]=y[j++];
	}
	//将剩余字符放入新数组 
	while(i<lenx)
		z[k++]=x[i++];
	while(j<leny)
		z[k++]=y[j++];
}
int main(){
	int a[M]={1,2,4,5,6,7,9,88,99,111};
	int b[N]={11,12,22,33,44,55,66,77};
	int i,c[M+N];
	merge_sort(a,M,b,N,c);
	printf("归并得到的新的升序序列c为:\n");
	for(i=0;i<M+N;i++){
		printf("%d,",c[i]);
	} 
		return 0;//return语句目的是告诉程序执行结束了,如果随意放置会导致程序提前结束 
}
22.判断主串是否和子串匹配
请输入主串:
zhangjia nishi1
请输入子串:
jia
在主串中第5个位置找到了子串!
#include <string.h> 
int index(char s[],char t[])
{	
	int i=0,j=0,m=strlen(s),n=strlen(t);
	while(i<m&&j<n){
	//匹配到后就继续向后匹配 
		if(s[i]==t[j]){
			i++;
			j++;
		}
		//未匹配到,则主串+1从第二个字符开始匹配 
		else{
		//关键代码!!!! 
			i=i-j+1;//相当于匹配到半路就失败了,接下来将其进行回归操作,并将其+1到下一个字符进行新一轮匹配 
			j=0;
		}
	}
		if(j==n) //若匹配成功,则返回子串在主串当中的位置 
			return (i-n);//关键代码!!!返回子串首字符所在的位置 
		else
			return -1;// 
}
int main(){
char s1[100],s2[20];
	printf("请输入主串:\n");
	gets(s1);
	printf("请输入子串:\n");
	gets(s2);
	if(index(s1,s2)!=-1)
		printf("在主串中第%d个位置找到了子串!\n",index(s1,s2));
	else
		printf("未在主串中找到子串!");
	return 0;
	}
23.在一个字符串当中找出某一个字符
//主体框架,采用了函数模块化设计的思想,使得程序更加直观。 
#include <string.h> 
void index(char str[],char s)
{
	int i;
	for(i=0;i<strlen(str)&&str[i]!=s;i++)
	{
		if(str[i]==s)
			break;
	}
	if(i<strlen(str))
		printf("在字符串的第%d个位置找到了该字符!",i+1);
	else
		printf("未在字符串找到该字符!");
}
int main(){
	char a[100],b;
	printf("请输入字符串:\n");
	gets(a);
	printf("请输入待查找的字符:\n");
	b=getchar();
	index(a,b);
}
24.折半查找法(二分法查找):注意仅仅适用于元素已经有序的情况下才可使用
/arr为待查找的数组、k为带查找数、sz为数组的大小 
int mid_search(int arr[], int k, int sz)  //定义二分查找函数
{
    int left = 0;                //定义数组元素最左侧下标为0
    int right = sz - 1;          //定义数组元素最右侧下标为总数-1
    while (left <= right)        
    {
        int mid = left + (right - left) / 2;  //此表达式是防止int型溢出哦,也是求平均哈
        if (arr[mid] < k)     
        {
            left = mid + 1;   
        }
        else if (arr[mid] > k)
        {
            right = mid - 1;
        }
        else
        {
            return mid;    //找到了,返回下标
        }
    }
    return -1;            //过程全部走完了,没找到,返回-1;
}
int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int k = 0;                            //定义想要查找的值
    int ret;                              //用来接收函数的返回值
    int sz = sizeof(arr) / sizeof(arr[0]); // (sizeof是c语言的内置运算符,
//以字节为单位给出指定类型的大小 ;求数组元素的总数==整个数列字节大小/一个元素的字节大小)
    printf("请输入要查找的值\n");
    scanf("%d", &k);
    ret = mid_search(arr, k, sz);   //用ret接收mid_search返回的值
    if (ret == -1)
        printf("没找到,请重新输入");
    else
        printf("找到了,下标为%d", ret);
    return 0;
}
25.打印杨辉三角
define N 10
int main(){
	//1、变换位置 
	int i,j,a[N][N];
	for(i=0;i<N;i++)
		a[i][0]=a[i][i]=1;//每行的开头和结尾都是一样的数字 
	for(i=2;i<N;i++)//从第三行开始,有如下规律,故下标为2 
	{ 
		for(j=1;j<i;j++){
			//按照规律打印数字 
			a[i][j]=a[i-1][j]+a[i-1][j-1];
		}
	}
	//2、打印输出 
	for(i=0;i<N;i++){
		for(j=0;j<i+1;j++)
			printf("%6d",a[i][j]);
		printf("\n");
	}
}
*/ 
26.删除用户输入的字符串
请输入字符串:
zhangjiajun
请输入需要删除的字符:
j
删除完毕后的字符串打印输出如下:
zhangiaun 
//程序的思路:主要就是字符的过滤,遍历数组当中的所有元素,将待删除的元素进行跳过并将其余字符输入到新的字符当中 
//并将其输出 
#include <string.h> 
int main(){
	char str1[60],str2[60],str;//str1[60]存取输入的字符串,str2[60]存储删除后的字符串 
	int i=0,k=0;
	printf("请输入字符串:\n");
	gets(str1);
	printf("请输入需要删除的字符:\n");
	str=getchar();//单个字符 
	while(str1[i]!='\0')//连续读取字符串当中字符常用的手法 
	{
		if(str1[i]!=str)
			str2[i-k]=str1[i];//关键代码!!!相当于把第6个数放在第5个位置上去了 
		else
			k++;//k用来表示删除字符出现的,方便后期缩减字符长度以及打印输出; 
			i++;//继续比对下一个字符 
	}
	str2[i-k]='\0';//给字符数组最后一位添加\0使其构成字符串 
	printf("删除完毕后的字符串打印输出如下:\n");
	puts(str2);
	return 0;
}
27.判断是否为回文串(类似的还有回文数、婚约数、质数等)
//主要思路:利用下标遍历循环对比数组的开头和结尾 
/*
#include <string.h>
int main(){
	char str1[60];
	int i,j;
	printf("请输入一组字符串:\n");
	gets(str1);
	i=0; 
	j=strlen(str1)-1;//倘若不去-1,则下标会超出给定字符下标,从而导致判定错误! 
	while(i<j)//字符两端两两进行比较,故不用加等于号 
	{
		if(str1[i]==str1[j])//继续比较下一对字符 
		{
			i++;
			j--; 	
		}
		//一旦检索到两者不相等则返回不是回文串 
		else
		{
			printf("该数不是字符串!");
			break; 
		}	
	}
	if(i==j)
		printf("该字符串是回文串!");
	return 0;
}
28求1k次方+2k次方一直加到N的k次方
//复习注意:注意因子置零操作!!!极其容易忽视!!! 
请分别输入底数K和指数N
1 3
s=6
int main(){
	long s=0;
	int k,N,i,j,t=1;
	printf("请分别输入底数K和指数N\n");
	scanf("%d%d",&k,&N); 
	for(i=1;i<=N;i++){
	//因子置“0 ” 凡是涉及到每次都需要产生新因子的时候,则需要执行此操作!!!! 
		s=0;//因为每一项之间都需要重新进行计算,则需要将其进行初始化 
		for(j=1;j<=k;j++){
			t*=i;
		}
		s+=t;
	}
	printf("s=%ld",s);
	return 0;
}
29.分别求出输入的三个学生(i)的平均成绩(average)、最差(min)、最好成绩(max)
//未利用数组,直接使用循环实现

float max,min,aver;//定义全局变量,通过调用函数直接修改数据内容,有效的解决了一次返回多个值 
//主函数区 
int main() {
	int i;
	void process(int);
	//三次调用函数,用计算并输出三位同学的成绩 
	for(i=1;i<=3;i++){
		process(i);//用户找出最大值最小值和计算平均分 
		printf("Number %d\n",i);
		printf("/n average=%f,min=%f,max=%f",aver,min,max);
	}
	return 0;
	}
void process(int num)
{
	float score,sum;
	int count=0;
	printf("Please input scores of number:%d\n",num);
	scanf("%f",&score);
	max=min=score;
	while(score>=0)
	{
		sum+=score;//计算分数总和 
		//比较得出最差和最好的分数 (打擂算法) 
		if(score<min)
			min=score;
		if(score>max)
			max=score;
		count++;//统计分数个数,为计算平均值做准备 
		scanf("%f",&score);//接收下一次输入的数据 
	}
	aver=sum/count;//计算平均值 
} 
30.编写一个函数计算第n项的值
//版本1 
int fun(int n){
	if(n==0)
		return 0;
	if(n%3==0)
		return 2*fun(n-1)+1;//涉及到返回数,这样写更为简便 
	else
		return 2*fun(n-1)-1;
}
int main() {
	int num,result=0;
	printf("请输入项数n:\n");
	scanf("%d",&num);
	result=fun(num);
	printf("项数:%d 的计算结果为:%d",num,result);
	return 0;
}
//改进版本
//主要引进了an变量用来返回实际计算的值
int fun(int n){
 	int an;
	if(n==0)
		an=0;
	else
	{
		if(n%3==0)
			an=2*fun(n-1)+1;
		else
			an=2*fun(n-1)-1;	
	}
	return an;
}
int main() {
	int num,result=0;
	printf("请输入项数n:\n");
	scanf("%d",&num);
	result=fun(num);
	printf("项数:%d 的计算结果为:%d",num,result);
	return 0;
}
#include <stdlib.h>
#define N 20 
//该函数主要实现输出功能 
void fun(int s[]){
	int i;
	for(i=0;i<N;i++){
		printf("%d",s[i]);
		printf("\n");
	}
}
int main(){
	int s[N],i,j,temp;
	FILE *fp;
	fp=fopen("number.txt","r");
	//将排序前的数组输出给数组 
	for(i=0;i<N;i++)
		fscanf(fp,"%d\n",&s[i]);//注意这里使用了\n,因为数字是按照行来进行存储的
		printf("数字排序前的顺序为:\n");
		fun(s);
		//冒泡排序 
		for(i=0;i<N;i++){
			for(j=0;j<=N-i;j++){
				if(s[j]>s[j+1])
				{
					temp=s[j];
					s[j]=s[j+1];
					s[j+1]=temp;
				}
			}
		}
		//将排序好的数组写入到文件当中 
		fp=fopen("number.txt","w");
		for(i=0;i<=N-1;i++){
			fprintf(fp,"%d\n",s[i]);
		}
		printf("他们排序后的顺序为:\n");
		fun(s);
		fclose(fp);//这一点很容易遗忘,需要特别注意!!! 
		return 0;
}