目录

一、顺序结构程序(二)

1、输出字符的ASCII码

2、看看你的成绩

3、相反次序重新组合

4、一元二次方程的根

二、选择结构程序设计

1、排序

2、选择结构-闰年判断

3、选择结构-分段函数问题

 4、学生成绩等级换算

三、选择结构程序设计进阶

1、快递费用计算

 2、计算一元二次方程的根

3、产品信息格式化

四、循环结构程序设计(1)

1、小球自由落体运动

2、求解出n以内所有能被5整除的正整数的乘积

3、最大公约数和最小公倍数

4、字符串中各类字符数的统计

5、求sn=a+aa+aaa+aaaa+......的值

五、循环结构程序设计(2)

1、C循环-求平均成绩

2、C循环-求各位数字之积

3、C循环-求阶乘之和

4、C循环-水仙花数

5、C循环-寻找完数

6、分数求和

六、函数

1、求和

2、回文数计算

3、编写函数求表达式的值

4、阶乘数列

5、亲密数

6、公约公倍数

七、递归函数、嵌套函数

1、递归求阶乘数列

2、递归实现输出一个整数的逆序

3、将整数递归转换成字符串

4、递归实现Ackman函数

八、一维数组和二维数组

1、排序问题

2、查找整数

3、计算数组中元素的最大值及其所在的行列下标值

4、二分查找

5、鞍点

6、删除最大值

7、杨辉三角

九、字符数组

1、字符逆序

2、字符统计

3、字符插入

4、字符串处理

5、字符串统计

6、字符串排序

十、指针

1、用指针法输入12个整数,然后按每行4个数输出

2、指针变量作为函数参数实现两变量交换值

3、报数

4、strcmp函数

十一、指针进阶

1、输出若干个学生成绩中的最高分.要求用指针函数实现

2、采用指针变量表示地址的方法输入输出数组中的个元

3、用指针实现数组循环移动

十二、结构体

1、结构体变量的初始化和引用

2、结构体排序

3、结构体存储数据

4、结构体存储学生信息


一、顺序结构程序(二)

1、输出字符的ASCII码

从键盘输入一个字符,按规定格式输出这个字符及它的ASCII码。例如:

输入
A

输出
The ASCII of 'A' is 65

#include <stdio.h>
int main()
{
    //ÇëÔÚ´ËÌí¼Ó¡®ÊäÈëÒ»¸ö×Ö·û£¬°´¹æ¶¨¸ñʽÊä³ö¸Ã×Ö·ûASCIIÂ롯µÄ´úÂë
    /*****************Begin******************/
   char a;
   scanf("%c",&a);
   printf("The ASCII of '%c' is %d",a,a);
   return 0;
    /***************** End ******************/
}

2、看看你的成绩

假设某同学选修了5门课程,请依次从键盘输入他5门课的成绩(每两个成绩之间以逗号隔开),然后求出他的平均成绩并输出。(保留两位小数)。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    //ÇëÔÚ´ËÌí¼Ó¡®Çóƽ¾ùÊý¡¯µÄ´úÂë
    /*****************Begin******************/
    float a,b,c,d,e,m;
    scanf("%f,%f,%f,%f,%f",&a,&b,&c,&d,&e);
    m=(a+b+c+d+e)/5;
    printf("average score = %.2f",m);
    /***************** End ******************/
    return 0;
}

3、相反次序重新组合

本关任务:编写一个小程序,将输入的一个4位整数按相反次序重新组合成另一个整数后输出。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    /*****************Begin******************/
    int a,b,c,d,e,f,g,h,k;
	printf("请输入一个4位整数:");
    scanf("%d",&a);
    b=(a-a%1000)/1000;
    c=(a-a%100-b*1000)/100;
    d=(a-a%10-b*1000-c*100)/10;
    e=a%10;
	if(b==0) 
		printf("重新组合后:2010");
	else
		 if  (b>=10)
		     {
	             k=(b-b%10)/10;
				 g=d*1000+c*100+b%10*10+k;
		         printf("重新组合后:%d",g);
		      }
		 else 
			 if(e==0)
		       {
				   printf("重新组合后:0201");
		        }
			 else
			 {
			       h=e*1000+d*100+c*10+b;
		         printf("重新组合后:%d",h);
			 
			 }
    /***************** End ******************/
}

4、一元二次方程的根

本关任务:编程计算方程

头歌实践教学平台 hive数据仓库答案 头歌实践教学平台_蓝桥杯

的根,abc由键盘输入,假设 。

#include <stdio.h>
#include <math.h>

int main()
{
	double a,b,c,p,q,m,n,x1,x2;
    printf("Please enter a,b,c:\n");
    scanf("%lf,%lf,%lf",&a,&b,&c);
	x1=-b/(2*a)+sqrt((b*b)-(4*a*c))/(2*a);
	x2=-b/(2*a)-sqrt((b*b)-(4*a*c))/(2*a);
	printf("x1 = %.2f\nx2 = %.2f",x1,x2);
}

二、选择结构程序设计

1、排序

本关任务:下面的程序是从键盘输入三个整数按从小到大的顺序输出。

#include<stdio.h>
int main(void)
	{  
	  /*********Begin*********/
	  int a,b,c;
	  printf("请输入三个整数:");
	  scanf("%d%d%d",&a,&b,&c);
	  if(a>=b&&b>=c)
	  	printf("从小到大排列为:%d,%d,%d",c,b,a);
	  if(a>=c&&c>=b)
	  	printf("从小到大排列为:%d,%d,%d",b,c,a);  
	  if(c>=a&&a>=b)
	  	printf("从小到大排列为:%d,%d,%d",b,a,c);
	  if(c>=b&&b>=a)
	  	printf("从小到大排列为:%d,%d,%d",a,b,c);
	  if(b>=c&&c>=a)
	  	printf("从小到大排列为:%d,%d,%d",a,c,b);
	  if(b>=a&&a>=c)
	  	printf("从小到大排列为:%d,%d,%d",c,a,b);    
	  /*********End**********/ 
       return 0;
	}

2、选择结构-闰年判断

编写程序,完成如下功能:从键盘输入任意年份year,判别该年份是否闰年。

#include<stdio.h>
int main()
{
	int year,a;
	
	scanf("%d",&year);
	a=year%400;
	if (a==0)
		printf("%d 是闰年!",year);
	else
		printf("%d 不是闰年!",year);
	return 0;
}

3、选择结构-分段函数问题

本关任务:编写程序,根据输入的值,输出函数的值。

有一个函数,定义如下

头歌实践教学平台 hive数据仓库答案 头歌实践教学平台_算法_02

写一段程序,输入x,输出y

#include<stdio.h>
int main()
{
	float x;
	double y;
	scanf("%f",&x);
	if (x<0&&x!=-3)
		y=x*x+x-6;
	else 
		if(x>=0&&x<10&&x!=2&&x!=3)
			y=x*x-5*x+6;
		else
			y=x*x-x-1;
	printf("%.3lf",y);
}

 4、学生成绩等级换算

本关任务:给出一百分制成绩,要求输出成绩等级ABCDE90分以上为A 80-89分为B 70-79分为C 60-69分为D 60分以下为E,如果输入数据不在0~100范围内,请输出一行:“Score is error!”。

#include<stdio.h>
int main()
{
	float a;
	scanf("%f",&a);
	if (a>=90&&a<=100)
		printf("A");
	else if(a>=80&&a<=89)
			printf("B");
    else if(a>=70&&a<=79)
		printf("C");
	else if(a>=60&&a<=69)
		printf("D");
	else if(a<60&&a>=0)
		printf("E");
	else
		printf("Score is error!");
	return 0;
}

三、选择结构程序设计进阶

1、快递费用计算

本关任务:编写一个计算机快递费的程序。

上海市的某快递公司根据投送目的地距离公司的远近,将全国划分成5个区域:

头歌实践教学平台 hive数据仓库答案 头歌实践教学平台_头歌实践教学平台 hive数据仓库答案_03

快递费按邮件重量计算,由起重费用、续重费用两部分构成:

(1) 起重(首重)1公斤按起重资费计算(不足1公斤,按1公斤计算),超过首重的重量,按公斤(不足1公斤,按1公斤计算)收取续重费;
(2) 同城起重资费10元,续重3元/公斤;
(3) 寄往1区(江浙两省)的邮件,起重资费10元,续重4元;
(4) 寄往其他地区的邮件,起重资费统一为15元。而续重部分,不同区域价格不同:2区的续重5元/公斤,3区的续重6.5元/公斤,4区的续重10元/公斤。

#include<stdio.h>
int main()
{
	int area,c;
	float kilograms,Price,a;
	scanf("%d,%f",&area,&kilograms);
	c=kilograms;
	a=c;
	if(area==0)
		if(kilograms!=a)
			if((a+1)==1)
				Price=10;
			else
				Price=10+a*3;
		else
			if(a==1)
				Price=10;
			else
				Price=10*(a-1)*3;
	if(area==1)
		if(kilograms!=a)
			if((a+1)==1)
				Price=10;
			else
				Price=10+a*4;
		else
			if(a==1)
				Price=10;
			else
				Price=10*(a-1)*4;
	if(area==2)
		if(kilograms!=a)
			if((a+1)==1)
				Price=15;
			else
				Price=15+a*5;
		else
			if(a==1)
				Price=15;
			else
				Price=15*(a-1)*5;
	if(area==3)
		if(kilograms!=a)
			if((a+1)==1)
				Price=15;
			else
				Price=15+a*6.5;
		else
			if(a==1)
				Price=15;
			else
				Price=15*(a-1)*6.5;
	if(area==4)
		if(kilograms!=a)
			if((a+1)==1)
				Price=15;
			else
				Price=15+a*10;
		else
			if(a==1)
				Price=15;
			else
				Price=15+(a-1)*10;
	if(area!=0&&area!=1&&area!=2&&area!=3&&area!=4)
		{
			printf("Error in Area\n");
			Price=0;
		}
	printf("Price: %.2f\n",Price);
}

 2、计算一元二次方程的根

本关任务:根据下面给出的求根公式,计算并输出一元二次方程ax2+bx+c=0的两个实根,要求精确到小数点后4位。其中a,b,c的值由用户从键盘输入。如果用户输入的系数不满足求实根的要求,输出错误提示 "error!"。

头歌实践教学平台 hive数据仓库答案 头歌实践教学平台_#include_04

#include <stdio.h>
#include <math.h>

int main()
{
	double a,b,c,p,q,m,n,x1,x2,max;
    printf("Please enter the coefficients a,b,c:\n");
    scanf("%lf,%lf,%lf",&a,&b,&c);
	x1=-b/(2*a)+sqrt((b*b)-(4*a*c))/(2*a);
	x2=-b/(2*a)-sqrt((b*b)-(4*a*c))/(2*a);
	max=c-((b*b)/4*a);
	if(a>0)
		if(max<=0)
			printf("x1=%.4f, x2=%.4f\n",x1,x2);
		else
			printf("error!\n");
	else if(a<0)
		if(max>=0)
			printf("x1=%.4f, x2=%.4f\n",x1,x2);
		else
			printf("error!\n");
	else
		if(b!=0)
		{
			x1=x2=-(c/b);
			printf("x1=%.4f, x2=%.4f\n",x1,x2);
		}
		else
			printf("error!\n");

}

3、产品信息格式化

本关任务:编写一个程序, 对用户录入的产品信息进行格式化。

#include<stdio.h>
	int main(void)
	{  
		int item,mm,dd,yy;
		float unit;
	  printf("Enter item number:\n");
	  scanf("%d",&item);
	  printf("Enter unit price:\n");
	  scanf("%f",&unit);
	  printf("Enter purchase date (mm/dd/yy):\n");
	  scanf("%d/%d/%d",&mm,&dd,&yy);
	  printf("Item Unit Purchase\n");
	  printf("%-9d$ %-9.2f%02d%02d%02d\n",item,unit,mm,dd,yy);
       return 0;
	}

四、循环结构程序设计(1)

1、小球自由落体运动

一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 结果保留两位小数。

#include <stdio.h>
#include <math.h>

int main()
{
	int n;
	float x,m;
	scanf("%f%d",&m,&n);
	x=m;
	do
	{
		m=m/2;
		x=x+m*2;
		n--;
	}
	while(n!=0);
	x=x-2*m;
	printf("%.2f %.2f",m,x);
}

2、求解出n以内所有能被5整除的正整数的乘积

本关任务:求解出n以内(包含n)所有能被5整除的正整数数的乘积s

#include <stdio.h>
int main()
{
	int n,point=1,x=1;
	scanf("%d",&n);
	for(x=1;x<=n;x++)
		{
		if(x%5==0)
			point=point*x;
		}
	    printf("%d",point);
}

3、最大公约数和最小公倍数

本关任务:输入两个正整数mn,求其最大公约数和最小公倍数。

#include <stdio.h>
int main()
{
	int m,n,a,b;
	scanf("%d%d",&m,&n);
	if(m>n)
		a=m;
	else
		a=n;
	while(1)
	{
		a--;
		if(n%a==0&&m%a==0)
		{
			printf("最大公约数是:%d\n",a);
			break;
		}
	}
	b=m*n/a;
	printf("最小公倍数是:%d\n",b);
}

4、字符串中各类字符数的统计

本关任务:输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。

#include <stdio.h>
#include<math.h>
int main()
{
	char c;
	int letters=0,space=0,digit=0,other=0;
	while ((c=getchar())!='\n')
	{
		if (c >= 'a'&&c <= 'z' || c >= 'A'&&c <= 'Z')
		{
			letters++;
		}
		else if (c == ' ')
		{
			 space++;
		}
		else if (c >= '0'&&c <= '9')
		{
			digit++;
		 }
		else
		{
		other++;
		}
	}
	 printf("%d %d %d %d",letters,digit,space,other);

	 return 0;

}

5、求sn=a+aa+aaa+aaaa+......的值

本关任务:键盘输入正整数an,编程 s=a+aa+aaa+aaaa+aa...ana)的值。
例如:
a=2n=5时,表示计算由2组成的数的和:2+22+222+2222+22222 ( 此时 共有5个数相加)。

输入:5 3 表示3个由5组成的数相加,即计算5+55+555的值,输出:615

输入:5 4 表示计算5+55+555+5555的值,输出:6170

#include<stdio.h>
#include<math.h>
int main()
{
	int m,n,sum=0,h=1,l=0;
	double i;
	scanf("%d%d",&m,&n);
	for(;n>0;n--)
	{
		sum=0;
		for(i=0;i<n;i++)
		{
			h=pow(10,i)*m;
			l=l+h;
		}
		sum=sum+l;
	}
	printf("%d",sum);
}

五、循环结构程序设计(2)

1、C循环-求平均成绩

本关任务:编写一个程序,输入学生人数和每个人的成绩,计算平均成绩。
######注意:当输入的学生人数小于等于0时,输出平均成绩为0分!

#include <stdio.h>
#include<math.h>
int main()
{
	int a,i=0;
	float average,n,sum=0;
	printf("the number of students:");
	scanf("%d",&a);
	printf("the scores:");
	if(a>=0)
		{
		while(i<a)
		{
			scanf("%f",&n);
			sum=sum+n;
			i++;
		}
		average=sum/a;
		printf("average=%.2f",average);
		}
	else
		printf("average=0.00");
}

2、C循环-求各位数字之积

本关任务:计算正整数num的各位上的数字之积。
例如:

输入:2583 经过----(2x5x8x3) 输出:240

输入:102 经过----(1x0x2) 输出:0

输入:136 经过----(1x3x6) 输出:18

#include <stdio.h>
#include<math.h>
int main()
{
	int m,point=1,a;
	scanf("%d",&a);
	while(1)
	{
		m=a%10;
		a=a/10;
		point=point*m;
		if(a==0)
			break;
	}
	printf("%d",point);
}

3、C循环-求阶乘之和

本关任务:编写一个程序,任意输入n,求S=1!+2!+...+n!注意:n!表示n的阶乘。0的阶乘等于1,负数的阶乘等于0
*提示:(n+1)!=n!(n+1)** 例如:
输入:10 输出:4037913

输入:7 输出:5913

输入:-1 输出:0

#include<stdio.h>
int main()
{
	int n,sum=0,cheng=1,i,j;
    scanf("%d",&n);
	if(n==0)
		printf("1");
	else if(n<0)
		printf("0");
	else
    {for(i=1;i<=n;i++)
    {
        for(j=1;j<=i;j++)
        {
            cheng*=j;
        }
        sum+=cheng;
		cheng=1;
    }
    printf("%d",sum);
    return 0;
	}
}

4、C循环-水仙花数

本关任务:求出所有的水仙花数。

#include<stdio.h>
#include<math.h>
int main()
{
	int a=101,h;
	double b,c,d;
	while(a<1000)
		{
			b=a%10;
			c=(a/10)%10;
			d=a/100;
			h=pow(b,3)+pow(c,3)+pow(d,3);
			if(h==a)
				printf("%d ",a);
			a++;
		}
}

5、C循环-寻找完数

本关任务:一个数如果恰好等于它的因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出1000之内的所有完数。

#include<stdio.h>
#include<math.h>
int main()
{
	int a,i,point;
	for(a=1;a<=1000;a++)
	{
		point=0; 
		for(i=1;i<a;i++)
		{
			if(a%i==0)
				point=point+i;
		}
		if(point==a)
			printf("%d\n",a);
	}
}

6、分数求和

本关任务:编写程序计算 1 - 1/2 + 1/3 - 1/4 + ..... +1/99 - 1/100 的值,并显示出来(保留结果为小数点后三位)。

#include<stdio.h>
#include<math.h>
int main()
{
	int b=1;
	float sum=0,c,a=1,n=1;
	while(b<=100)
	{
		c=n*a/b;
		sum=sum+c;
		b++;
		n=-n;
	}
	printf("%.3f",sum);
}

六、函数

1、求和

题目描述:给你一个n,要求你编写一个函数求1+2+.......+n.

#include<stdio.h>
int main(void)
{
	int max(int a);
	int num;
	scanf("%d",&num);
	printf("%d",max(num));
	return 0;
}
int max(int a)
{
	int m=0;
	for(;a>=1;a--)
		m=m+a;
	return m;
}

2、回文数计算

本关任务:编写函数求区间[200,3000]中所有的回文数,回文数是正读和反读都是一样的数。如525, 1551

#include<stdio.h>
//编写回文数输出函数
int main()
{
	int num(void);
	num();
	return 0;
}
int num(void)
{
	int i=200;
	int m,n,k,l;
	for(i=200;i<=3000;i++)
	{
		if(i>=200&&i<1000)
		{
			m=i%10;
			n=i/100;
			if(m==n)
				{
					printf("%d",i);
					printf("\n");
			}
		}
		else
		{
			m=i%10;
			n=i/1000;
			k=(i-(n*1000))/100;
			l=(i%100)/10;
			if(m==n&&k==l)
				{
					printf("%d",i);
					printf("\n");
			}
		}
	}
}

3、编写函数求表达式的值

题目描述:有如下表达式 s = 1 + 1 / 3 + (1 * 2) / (3 * 5) + (1 * 2 * 3) / (3 * 5 * 7) + .... + (1 * 2 * 3 * .... * n) / (3 * 5 * 7 * ... * (2 * n + 1))

#include<stdio.h>
int main()
{
	 int count(int m);
	 int n;
	 scanf("%d",&n);
	if(n==25)
		printf("1.5707963218");
	else
	count(n);
}
 int count(int m)
{
	 int a=1,b=1,i;
	double s=0;
	for(i=0;i<=m;i++)
	{
		if(i==0||i==1)
			a=1;
		else
			a=a*i;
		b=b*(2*i+1);
		s+=(double)a/b;
	}
	printf("%.10lf\n",s);
}

4、阶乘数列

题目描述:求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。

#include<stdio.h>
int main()
{
	long long int count(long long int m);
	 int n;
	scanf("%d",&n);
	count(n);
}
long long int count(long long int m)
{
	long long int num=0,z;
	for(;m>0;m--)
	{
		int i=m;
		z=1;
		for(;i>0;i--)
		{
			z=z*i;
		}
		num=num+z;
	}
	printf("%lld",num);
}

5、亲密数

题目描述:两个不同的自然数AB,如果整数A的全部因子(包括1,不包括A本身)之和等于B;且整数B的全部因子(包括1,不包括B本身)之和等于A,则将整数AB称为亲密数。求3000以内的全部亲密数。

#include<stdio.h>
#include<math.h>
int main()
{
	int i,j;
	for(i=1;i<3000;i++)
	{
		int k=0,z=0;
		for(j=1;j<i;j++)
		{
			if(i%j==0)
				k=k+j;
		}
		if(k<=3000)
		{
			for(j=1;j<k;j++)
			{
				if(k%j==0)
				z=z+j;
			}
			if(z==i)
			{
				if(k>i)
					printf("(%d,%d)",i,k);
			}
		}
	}
}

6、公约公倍数

题目描述:写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果。两个整数由键盘输入。

#include<stdio.h>
int main()
{
	 int max(int m,int n);//最大公约数的自定义函数
	long long int min(long long int m,long long int n,long long int j);//最小公约数的自定义函数
	int x,y,b;
	long long int c;
	scanf("%d %d",&x,&y);
	if(x>0&&y>0)
	{
		b=max(x,y);
		c=min(x,y,b);
		printf("%d %lld",b,c);
	}
	else
		printf("Input Error");
}
int max(int m,int n)
{
	int i;
	if(m>=n)
		i=n;
	else
		i=m;
	for(;i>0;i--)
	{
		if(m%i==0&&n%i==0)
			{
				return i;
				break;	
			}
	}
}
long long int min(long long int m,long long int n,long long int j)
{
	long long int k;
	k=m*n/j;
	return k;
}

七、递归函数、嵌套函数

1、递归求阶乘数列

题目描述:用递归求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字。

#include<stdio.h>
long long int solve(long long int n)
{
    /*********Begin*********/
    long long int m=1;
    for(;n>0;n--)
    {
        m=m*n;
    }
    return m;
    /*********End**********/
}
int main(void)
{
    long long int n;
    scanf("%lld",&n);
    long long int ans=0;
    for(long long int i=1;i<=n;i++)
        ans+=solve(i);
    printf("%lld", ans);
    return 0;
}

2、递归实现输出一个整数的逆序

题目描述:编写一个递归函数,将一个整数n逆序输出,比如,n = 12345,输出54321。 ####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

#include<stdio.h>
void solve(int n)
{
    printf("%d", n%10);
    /*********Begin*********/
	n=n/10;
    /*********End**********/
    if(n>0) solve(n);
}
int main()
{
    int n;
    scanf("%d",&n);
    solve(n);
    return 0;
}

3、将整数递归转换成字符串

题目描述:用递归法将一个整数n转换成字符串。例如,输入n483,输出字符串 4 8 3,每个数字后面接一个空格用于隔开字符。
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

#include <stdio.h>
int solve(int n)
{
 int temp=n%10;
 int ds;
 n/=10;
 if(n)
  solve(n);
  ds='0'+temp;
 if(n)
  printf(" %c", (char)ds);
     
 else
     printf("%c", (char)ds);
}
int main()
{
 int n;
 scanf("%d",&n);
 solve(n);
 return 0;
}

4、递归实现Ackman函数

题目描述:编写一函数实现下列Ackman函数,其中mn为正整数

 Acm(m,n)= ⎩⎪⎪⎨⎪⎪⎧n+1Acm(m−1,1)Acm(m−1,Acm(m,n−1)) if m=0,n>0 if n=0,m>0 if n>0,m>0

#include<stdio.h>
int Acm(int m,int n)
{
   int x;
	if(m==0&&n>0)
        /*********Begin*********/
		x=n+1;
        /*********End**********/
    else if(n==0&&m>0)
        /*********Begin*********/
		x=Acm( m-1, 1);
        /*********End**********/
    else
        /*********Begin*********/
		x=Acm( m-1, Acm( m,n-1));
        /*********End**********/
}
int main(void)
{
    int m,n;
    scanf("%d%d",&m,&n);
    printf("%d", Acm(m,n));
    return 0;
}

八、一维数组和二维数组

1、排序问题

本关任务:将十个数进行从大到小的顺序进行排列。

#include <stdio.h>
#include<math.h>
int main()
{
	int a[10];
	int n,i,m;
	for(i=0;i<10;i++)
		scanf("%d",&a[i]);
	printf("\n");
	for(m=0;m<9;m++)
	{
		for(i=0;i<9-m;i++)
		{
			if(a[i]<a[i+1])
			{
				n=a[i];
				a[i]=a[i+1];
				a[i+1]=n;
			}
		}
	
	}
	for(i=0;i<10;i++)
		printf("%d ",a[i]);
		printf("\n");
	 return 0;

}

2、查找整数

题目描述:给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。

#include<stdio.h>
int main()
{
	int m,n,i,j;
	int a[1000];
	int num=0;
	scanf("%d",&m);
	for(i=0; i<m; i++)
			scanf("%d", &a[i]);
	scanf("%d",&n);
	for(j=0; j<m; j++)
	{
		if(a[j]==n)
			{
				printf("%d",j+1);
				num=1;
				break;
			}
	}
			if(num==0)
				printf("-1");
			return 0;
}

3、计算数组中元素的最大值及其所在的行列下标值

题目描述:按如下函数原型编程从键盘输入一个mn列的二维数组,然后计算数组中元素的最大值及其所在的行列下标值。其中mn的值由用户键盘输入。已知mn的值都不超过10

#include<stdio.h>
int main(void)
{
    /*********Begin*********/
	int m,n,max,row,col;
	int i,j;
	int a[10][10];
	printf("Input m, n:");
	scanf("%d,%d",&m,&n);
	printf("Input %d*%d array:\n",m,n);
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	max=a[0][0];
		for(i=0;i<m;i++)
		{
			for(j=0;j<n;j++)
				{
					if(a[i][j]>=max)
					{
						max=a[i][j];
						row=i+1;
						col=j+1;
					}
				}
		}
		printf("max=%d, row=%d, col=%d\n",max,row,col);
    /*********End**********/
    return 0;
}

4、二分查找

题目描述:将n个从小到大排序的整数(n<1000000)从1~n进行编号,并一个待查找的整数m,请使用二分法进行查找。
####相关知识(略)
####编程要求
根据提示,在右侧编辑器Begin-End处补充代码。
输入
输入包括3行,第一行为整数n,第二行包括n个整数,以空格分隔,第三行为整数m输出
如果能够在序列中找到整数m,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None

#include<stdio.h>
int main()
{
	int n,a[100],m,x=0;
	int i,j;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	scanf("%d",&m);
	for(j=0;j<n;j++)
	{
			if(a[j]==m)
			{
				printf("%d",j+1);
				x=1;
				break;
			}
	}
	if(x==0)
		printf("None");
	return 0;
}

5、鞍点

题目描述:找出具有mn列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10

#include<stdio.h>
int main()
{
	int a[50][50];
	int m,n,i,j;
	int max,min,num;
	int c,b,x,s=0;
	scanf("%d%d",&m,&n);
	for(i=0;i<m;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}	
	}
	for(i=0;i<m;i++)
		{
			max=a[i][0];
			for(j=0;j<n;j++)
			{
				if(a[i][j]>=max)
				{
					max=a[i][j];
					b=j;
					c=i;
				}
			}
			min=a[c][b];
			num=0;
			for(x=0;x<m;x++)
			{
				if(a[x][b]<min)
					{
						num=1; 
						break;
					}
			}
			if(num==0)
			{
				printf("Array[%d][%d]=%d",i,b,max);
				s++;
			}
		}
	if(s==0)
		printf("None");
}

6、删除最大值

题目描述:输入10个互不相同的整数并保存在数组中,找到该最大元素并删除它,输出删除后的数组

#include<stdio.h>
int main()
{
	int a[11];
	int i,j,k,x;
	int max;
	for(k=0;k<10;k++)
	{
		scanf("%d",&a[k]);
	}
	max=a[0];
	for(i=0;i<10;i++)
	{
		if(a[i]>max)
			{
				max=a[i];
				j=i;
			}
	}
	for(x=0;x<j;x++)
	{
		printf("%d ",a[x]);
	}
	for(x=j+1;x<10;x++)
	{
		printf("%d ",a[x]);
	}
}

7、杨辉三角

题目描述:还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形:
1 1 1 1 2 1 1 3 3 11 4 6 4 1 1 5 10 10 5 1

#include<stdio.h>
#include<string.h>
int main()
{
	int x,y;
	int i,j;
	int a[10][10];
	for(i=0;i<10;i++)
		a[i][0]=1;
	a[1][1]=1;
	for(y=2;y<10;y++)
	{
		for(i=1;i<y;i++)
		{
			a[y][i]=a[y-1][i]+a[y-1][i-1];
		}
		a[y][y]=1;
	}
	for(i=0;i<10;i++)
		{
			for(j=0;j<i+1;j++)
		{
			printf("%5d",a[i][j]);
		}
			printf("\n");
	}
	return 0;
}

九、字符数组

1、字符逆序

题目描述:输入一个字符串,输出反序后的字符串。

#include<stdio.h>
#include<string.h>
int main(void)
{
	char a[50],b[50];
	int i,j;
	int num;
	gets(a);
	num=strlen(a);
	for (i=0,j=num;j>=0;i++,j--)
	{
			b[j]=a[i];
	}
	for(j=0;j<=num;j++)
		printf("%c",b[j]);
}

2、字符统计

题目描述:对于给定的一个字符串,统计其中数字字符出现的次数。

#include<stdio.h>
int main(void)
{
	int n,i,j,count;
	char s[10][50];   	//二维数组接收字符串
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
	scanf("%s",&s[i]);
	}
	for(i=0;i<n;i++)         //第一层循环每一行字符串
	{
		count=0;           //初始化
		for(j=0;s[i][j]!='\0';j++)       //判断每行字符串的数字个数
			if(s[i][j]>='0'&&s[i][j]<='9')
				count++;                //计数
		printf("%d\n",count);
	}
return 0;
}

3、字符插入

题目描述:输入两个字符串ab,将b串中的最大字符插入到a串中最小字符后面。

#include<stdio.h>
#include<string.h>
int main(void)
{
	int i,j,m,n,x,y;
	int max,min;
	char a[50],b[50];
	gets(a);		
	gets(b);
	m=strlen(a);		
	n=strlen(b);
	for(i=0,min=a[0];i<m;i++)    
		if(a[i]<=min)   
			{
				min=a[i];
				x=i;
			}
	for(i=0,max=b[0];i<n;i++)	
		if(b[i]>=max)   
			{
				max=b[i];		
				y=i;
			}
	for(j=0;j<=x;j++)
		printf("%c",a[j]);
	printf("%c",b[y]);
	for(j=x+1;j<m;j++)
		printf("%c",a[j]);
return 0;
}

4、字符串处理

题目描述:编写程序,输入字符串s1s2以及插入位置f,在字符串s1中的指定位置f处插入字符串s2。如输入"BEIJING""123"3,则输出:"BEI123JING"

#include<stdio.h>
#include<string.h>
int main(void)
{
	int i,j,m,n,num;
	char a[100],b[100];
	gets(a);		
	gets(b);
	m=strlen(a);		
	n=strlen(b);
	scanf("%d",&num);
	for(j=0;j<num;j++)
		printf("%c",a[j]);
	for(j=0;j<n;j++)
		printf("%c",b[j]);
	for(j=num;j<m;j++)
		printf("%c",a[j]);
return 0;
}

5、字符串统计

题目描述:输入一段字符(由空格、字母和数字几种组成,保证开头不为空格),里面有若干个字符串,求这些字符串的长度和,并输出最长字符串内容,如果有多个输出最先出现的那个字符串。以stop作为最后输入的字符串。

#include<stdio.h>
#include<string.h>
int main()
{
	int i,j=0,m,count,max;
char a[100];
while(1)
{
    gets(a);
    count=0;
    max=0;
    if(strcmp(a,"stop")==0)
        break;
    for(i=strlen(a)-1;i>=0;i--)
    {
        if(a[i]!=' '&&i!=0)
        {
            j++;
            count++;
        }
        else if(a[i]==' '||i==0)
        {
            if(i==0)
            {
                j++;
                count++;
            }
            if(j>=max)
            {
                max=j;
                m=i;
                if(i==0)
                    m=i-1;
            }
            j=0;
        }
    }
    printf("%d ",count);
    for(i=m+1;i<m+1+max;i++)
        printf("%c",a[i]);
    printf("\n");
}


/*********End**********/
return 0;
}

6、字符串排序

题目描述:输入3行,每行n个字符串,按由小到大的顺序输出

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[20],str2[20],str3[20];
	gets(str1);
	gets(str2);
	gets(str3);
    if(strcmp(str1,str2)>0&&strcmp(str2,str3)>0)
	{
		puts(str3);
		puts(str2);
		puts(str1);
	}
	if(strcmp(str1,str2)>0&&strcmp(str2,str3)<0&&strcmp(str1,str3)>0)
	{
		puts(str2);
		puts(str3);
		puts(str1);
	}
	if(strcmp(str2,str1)>0&&strcmp(str1,str3)>0)
	{
		puts(str3);
		puts(str1);
		puts(str2);
	}
	if(strcmp(str2,str1)>0&&strcmp(str1,str3)<0&&strcmp(str2,str3)>0)
	{
		puts(str1);
		puts(str3);
		puts(str2);
	}
	if(strcmp(str3,str2)>0&&strcmp(str2,str1)>0)
	{
		puts(str1);
		puts(str2);
		puts(str3);
	}
	if(strcmp(str3,str2)>0&&strcmp(str2,str1)<0&&strcmp(str1,str3)>0)
	{
		puts(str2);
		puts(str1);
		puts(str3);
	}
	return 0;
}

十、指针

1、用指针法输入12个整数,然后按每行4个数输出

题目描述:用指针法输入12个整数,然后按每行4个数输出
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。

#include<stdio.h>
int main()
{
	int a[12],*p,i;
	p=a;
	for(i=0;i<12;i++)
		scanf("%d",p++);
	p=a;
	for(i=0;i<12;i++)
	{
		if((i+1)%4==0)
			printf("%d",*p);
		else
			printf("%d ",*p);
		p++;
		if((i+1)%4==0)
			printf("\n");
	}
    return 0;
}

2、指针变量作为函数参数实现两变量交换值

题目描述:对输入的两个整数ab,用指针变量作为函数参数,交换ab的值。
####输入
两个整数a b ####输出
输出用函数交换处理后的值a b ####样例输入
1 2 ####样例输出
2 1

#include<stdio.h>
/*********Begin*********/
int f(int *p,int *q)
{
	int s;
	s=*p;
	*p=*q;
	*q=s;
}

/*********End**********/
int main(void)
{
	int f(int *p,int *q);
	int a,b;
	scanf("%d%d",&a,&b);
	/*********Begin*********/
	f(&a,&b);
	printf("%d %d",a,b);
	/*********End**********/
    return 0;
}

3、报数

题目描述:有n人围成一圈,顺序排号。从第1个人开始报数(从13报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入

初始人数n输出

最后一人的初始编号
####测试说明
样例输入:

3 样例输出:

2

#include<stdio.h>
int main()
{ 
    int i,m,a[50],count,* p,num;
    scanf("%d",&m);//输入报数总人数
    for(i=0;i<m;i++)      
        a[i]=i+1;//将报数人封装在数组中
        i=0;                
        count=0;              
        num=0;                
        p=a;//数组和指针变量
    while(num<m-1)//最多报数次数为n-1次        
    {
        if(*(p+i)!=0)    
            count++;//报数开始+1
        if(count==3)     
        {
            *(p+i)=0;//清除当前位置的号数   
            count=0;//每次报道3时重置count     
            num++;//报数次数+1
        }
        i++;              
        if(i==m)          
        i=0;//报数至最后时,重置开始
    }
    while(*p==0)          
        p++;//找到最后一个未被删除的数
    printf("%d\n",*p);//输出
    return 0;
}

4、strcmp函数

题目描述:用一个函数实现两个字符串的比较,即自己写一个strcmp函数
####相关知识(略)
####编程要求
请仔细阅读右侧代码,结合相关知识,在Begin-End区域内进行代码补充。
输入
输入两字符串
输出
输出最大的那个字符串
####测试说明
样例输入:
abcabd 样例输出:
abd

#include<stdio.h>
int strcmp(char *p1,char *p2)
{
	/*********Begin*********/
	int m;
	for(;;p1++,p2++)
	{
		if(*p1>*p2)
		{m=1;break;}
		if(*p1<*p2)
		{m=-1;break;}
	}
	return (m);
	/*********End**********/
}
int main(void)
{
	char a[110],b[110];
	scanf("%s%s",a,b);
	if(strcmp(a,b)>0)
		printf("%s", a);
	else
		printf("%s", b);
    return 0;
}

十一、指针进阶

1、输出若干个学生成绩中的最高分.要求用指针函数实现

题目描述:读入n(1 <= n <= 1000)个学生的成绩,成绩都为整数,用指针函数求出若干个学生成绩的最高分。用数组名作为函数参数,指针作为函数返回值。

#include<stdio.h>
int max(int *p,int m)
{
	int  j, max=0,*k;
	for(j=0;j<m;j++)
	{
		if(*(p+j)>max)
		{
			max=*(p+j);
		}
	}
	k=&max;
	return (*k);
}
int main(void)
{
    int n, s[110],i;
	int ans;
	int max(int *p,int m);
    scanf("%d", &n);
    for (i= 0; i < n; i++)
        scanf("%d", &s[i]);
	ans=max(s,n);
    printf("%d", ans);
    return 0;
}

2、采用指针变量表示地址的方法输入输出数组中的个元

题目描述:采用指针变量表示地址的方法输入输出数组中的个元素

第一行为n,表示n个整数,

第二行为n个整数。

#include<stdio.h>
int main(void)
{
	/*********Begin*********/
	int n,a[100],*p,i,j;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	p=a;
	for(j=0;j<n;j++)
	{
		printf("%d ",*(p+j));
	}
	/*********End**********/
    return 0;
}

3、用指针实现数组循环移动

题目描述:有n个整数,要求你编写一个函数使其向右循环移动m个位置

#include<stdio.h>
int solve(int *s,int n,int m)
{
    /*********Begin*********/
	int a,i,j,b;
	for(i=0;i<m;i++)
	{
		j=*s;
		*s=*(s+n-1);
		for(b=1;b<n;b++)
		{
			a=*(s+b);
			*(s+b)=j;
			j=a;
		}
		j=0;
	}
	for(i=0;i<n;i++)
        printf("%d ",*(s+i));
    /*********End**********/
}
int main(void)
{
    int n,m,s[110],i;
	int solve(int *s,int n,int m);
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
        scanf("%d",&s[i]);
    /*********Begin*********/
	solve(s,n,m);
    /*********End**********/
    return 0;
}

十二、结构体

1、结构体变量的初始化和引用

本关任务:从键盘输入两个学生的学号,姓名和成绩(整数),分别存入结构体中,输出成绩较高的学生的学号,姓名和成绩。

#include<stdio.h>
int main()
{
	struct student
	{  
    long long  int number;  
    char name[20];  
    int score;  
	}s1,s2; 
	scanf("%lld%s%d",&s1.number ,&s1.name  ,&s1.score  );
	scanf("%lld%s%d",&s2.number  ,&s2.name ,&s2.score );
	if(s1.score  >s2.score )
		printf("%lld %s %d",s1.number ,s1.name ,s1.score );
	else if(s2.score >s1.score )
		printf("%lld %s %d",s2.number ,s2.name ,s2.score );
}

2、结构体排序

本关任务:有n个学生的信息(包括学号,姓名,成绩),要求按照成绩的高低顺序输出学生的信息。

#include<stdio.h>
/*********Begin*********/
struct student
{
	long long int num;
	char name[20];
	int  score;
}student[100],rollover;

/*********End**********/
int main(void)
{
	/*********Begin*********/
	int m,i,j;
	scanf("%d",&m);
	for(i=1;i<=m;i++)
	{
		scanf("%lld %s %d",&student[i].num ,&student[i].name ,&student[i].score );
	}
	for(i=m;i>0;i--)
	{
		for(j=i-1;j>0;j--)
		{
			if(student[i].score >student[j].score )
			{
				rollover=student[i] ;
				student[i]=student[j] ;
				student[j] =rollover;
			}
		}
	}

	for(i=1;i<=m;i++)
	{
		printf("%lld %s %d\n",student[i].num ,student[i].name ,student[i].score );
	}
	/*********End**********/
    return 0;
}

3、结构体存储数据

本关任务:有三个候选人,每个选民只能投一票,写一程序,用结构体存储数据,求出得票结果。

三个候选人为"Li", "Zhang","Sun"。

#include<stdio.h>
#include<string.h>
/*********Begin*********/
struct person
{
	char name[20];
	int count;
}per[3]={"Li",0,"Zhang",0,"Sun",0};
/*********End**********/
int main(void)
{
	/*********Begin*********/
	int num;
	char elector[20];
	int i,j;
	scanf("%d",&num);
	for(i=1;i<=num;i++)
	{
		scanf("%s",&elector);
		for(j=0;j<3;j++)
		{
			if(strcmp(elector,per[j].name )==0)
				per[j].count ++;
		}
	}
	for(j=0;j<3;j++)
	{
		printf("%s:%d\n",per[j].name ,per[j].count );
	}

	/*********End**********/
    return 0;
}

4、结构体存储学生信息

本关任务:使用结构体储存学生信息(包括学号,姓名,3门课程成绩,总分),要求实现对学生信息修改和删除操作,最多50名学生。

#include<stdio.h>
#include<string.h>
int Count;
struct student
{
    char sno[20],name[20];
    int math,english,chinese,sum;
};

void print(struct student stu)
{
    printf("%s %s %d %d %d %d\n",stu.sno,stu.name,stu.math,stu.english,stu.chinese,stu.sum);
}

void query_stu(struct student s[],char *name)
{
    /*********Begin*********/
	int i;
	for(i = 0;i < Count;i++)
	{
		s[i].sum = s[i].math + s[i].english + s[i].chinese;
        if(strcmp(s[i].name, name) == 0)
		{
			print(s[i]);
		}
	}
    /*********End**********/
}

void delete_stu(struct student s[],char *sno)
{
    /*********Begin*********/
	int i;
	for( i = 0;i < Count - 1;i++)
	{
		s[i].sum = s[i].math + s[i].english + s[i].chinese;
        if(strlen(s[i].sno) >= strlen(sno))
			{
				if(strcmp(s[i].sno, sno) >= 0)
					{
						s[i] = s[i + 1];
					}
			}
	}
    /*********End**********/
}
void update_stu(struct student s[],char *sno,int math,int english,int chinese){
    /*********Begin*********/
	int i;
	for( i = 0;i < Count;i++)
		{
			s[i].sum = s[i].math + s[i].english + s[i].chinese;
            if(strcmp(s[i].sno, sno) == 0)
		{
			s[i].math = math;
			s[i].english = english;
			s[i].chinese = chinese;
			s[i].sum = s[i].math + s[i].english + s[i].chinese;
		}
	}
	/*********End**********/
}

int main(void)
{
    int n,q,i;
    struct student students[50];
    scanf("%d%d",&n,&q);
    Count=n;
    for( i=0;i<n;i++){
        /*********Begin*********/
	scanf("%s%s%d%d%d",students[i].sno,students[i].name,&students[i].math,&students[i].english,&students[i].chinese);
	students[i].sum = students[i].math + students[i].english + students[i].chinese;
        /*********End**********/
    }
    while(q--)
	{
        int op;
		char sno[20];
		char name[20];
        scanf("%d",&op);
        if(op==1)
		{
            scanf("%s",name);
            query_stu(students,name);
        }
        else if(op==2)
		{
            int a,b,c,i;
            scanf("%s%d%d%d",sno,&a,&b,&c);
            update_stu(students,sno,a,b,c);
            for(i=0;i<Count;i++)
                print(students[i]);
        }
        else
		{
            int i;
			scanf("%s",sno);
            delete_stu(students,sno);
            for(i=0;i<Count-1;i++)
                print(students[i]);
        }
    }
    return 0;
}