程序设计第九周

定义表示平面点的结构体类型,成员有x坐标和y坐标,数据类型用float。定义计算两个点的距离的函数,计算两个平面点的距离,返回float。主函数中定义两个平面点的结构体变量,输入点的坐标,调用函数求距离,显示它们的距离(输出%f)。
输入:四个实数,前两个表示一个点的x,y坐标;后两个表示另一个点的x,y坐标.
输出:两个点的距离。
注意,距离函数的参数是结构体类型!!!
【输入输出样例】
输入:
2 2 1 1
输出:
1.414214

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

typedef struct{
	float x;
	float y;	
}Point;

float dist(Point p1, Point p2);
float sum(Point* p1, Point* p2);

int main()
{
	Point p1;
	Point p2;
	scanf("%f%f%f%f",&p1.x ,&p1.y, &p2.x, &p2.y);
	float res = dist(p1,p2);
	printf("%f",res);
	return 0;
}
float dist(Point p1, Point p2)
{
	float xd = (p1.x - p2.x) * (p1.x - p2.x);
	float yd = (p1.y - p2.y) * (p1.y - p2.y);
	return (float)sqrt(xd + yd);		
} 

定义表示复数的结构体类型,成员为实部和虚部,float。定义函数计算两个复数的和,返回复数。定义函数显示复数格式为:1+1j ,1-1j,如果是0,显示0+0j。
输入:两行,每行表示一个复数的实部和虚部。
输出:一行,两个复数的和。
【输入输出样例】
输入:
-1 -2
-3 -4
输出:
-4-6j

提示:主函数从如下:
int main()
{
COMPLEX a,b,c;
scanf("%f%f",&a.real,&a.imag);
scanf("%f%f",&b.real,&b.imag);
c=add(a,b);
show(c);
return 0;
}

输出格式%g.

#include<stdio.h>

typedef struct{
	float real;
	float imag;
}COMPLEX;
COMPLEX add(COMPLEX c1, COMPLEX c2);
void show(COMPLEX c);
int main()
{
	COMPLEX a,b,c;
	scanf("%f%f",&a.real,&a.imag);
	scanf("%f%f",&b.real,&b.imag);
	c=add(a,b);
	show(c);
	return 0;
}
COMPLEX add(COMPLEX c1, COMPLEX c2)
{
	COMPLEX res;
	res.real = c1.real + c2.real;
	res.imag = c1.imag + c2.imag;
	return res;	
}
void show(COMPLEX c)
{
	// 这里输出的时候,要判断 a + bj 中 ab的值的情况 
	if(c.imag == 0 && c.real == 0)
	{
		printf("%g+%gj",c.real,c.imag);
	}
	else if(c.real == 0 && c.imag != 0)
	{
		printf("%gj",c.imag);
	}
	else if(c.real != 0 && c.imag == 0)
	{
		printf("%g",c.real);	
	}
	else
	{
		if(c.imag < 0)
		{
			printf("%g%gj",c.real,c.imag);
		}
		else
		{
			printf("%g+%gj",c.real,c.imag);
		}
		
	} 	
}

有四个候选人zhao,qian,sun,wang参加评选,编写计票程序,统计每个人的得票数量,按得票从多到少的顺序显示每个人的名字和得票数。
输入:若干行、若干列的合理人名,人名间用空格隔开,最后是000表示结束。
输出:四行,每行是一个人的名字和得票数,中间用一个空格隔开。
【输入输出样例】
输入:
zhao qian sun wang wang wang wang
sun sun qian 000
输出:
wang 4
sun 3
qian 2
zhao 1

#include<stdio.h>
#include<string.h>
typedef struct{
	char* name;
	int count;
}Person;
void sort(Person p1, Person p2, Person p3, Person p4);
int main()
{
	Person p1, p2, p3, p4;
	p1.name = "zhao";
	p1.count = 0;
	p2.name = "qian";
	p2.count = 0;
	p3.name = "sun";
	p3.count = 0;
	p4.name = "wang";
	p4.count = 0;
	char str[10] = { '\0' };
	scanf("%s",str);
	//printf("%s ",str);
	while(strcmp(str,"000") != 0)
	{
		if(strcmp(str,"zhao") == 0)
		{
			p1.count++;	
		}
		else if(strcmp(str,"qian") == 0)
		{
			p2.count++;	
		}
		else if(strcmp(str,"sun") == 0)
		{
			p3.count++;	
		}
		else if(strcmp(str,"wang") == 0)
		{
			p4.count++;
		}
		scanf("%s",str);
		//printf("%s ",str);
	}
	//printf("%s %d %s %d %s %d %s %d\n",p1.name,p1.count,p2.name,p2.count,p3.name,p3.count,p4.name,p4.count);
	sort(p1, p2, p3, p4);	
	return 0;
	
}
void sort(Person p1, Person p2, Person p3, Person p4)
{
	Person p[4] = {p1, p2, p3, p4};
	int i, j;
	for(i = 0; i < 4; i++)
	{
		for(j = 0; j < 3 - i; j++)
		{
			if(p[j].count < p[j + 1].count)
			{
				int tn = p[j].count;
				char* ts = p[j].name;
				//printf("%d %s of now\n",tn,ts);
				p[j].name = p[j + 1].name;
				p[j].count = p[j + 1].count;
				p[j + 1].name = ts;
				p[j + 1].count = tn;		
			}	
		}
	}
	for(i = 0; i < 4; i++)
	{
		printf("%s %d\n",p[i].name,p[i].count);
	}
}

定义表示日期的结构体类型,成员包括年、月、日,都用整数表示。编写函数,计算一个结构体类型的日期是本年中的第几天(要考虑闰年),如2018年1月1日是当年(2018)年的第1天。
编写主函数,定义结构体变量。输入结构体变量的年、月、日,调用函数计算天数并显示。
【输入输出样例】
输入:
2019 4 15
输出:
105
提示:主函数如下:
int main()
{
DATE d1;
scanf("%d %d %d",&d1.year,&d1.month,&d1.day);
printf("%d\n",daysofyear(d1));
return 0;
}

#include<stdio.h>
typedef struct{
	int year;
	int month;
	int day;
}DATE;
int daysofyear(DATE d); 
int main()
{
	DATE d1;
	scanf("%d %d %d",&d1.year,&d1.month,&d1.day);
	printf("%d\n",daysofyear(d1));
	return 0;
}
int daysofyear(DATE d)
{
	// 判断是不是闰年
	int res = 0;
	switch(d.month)
	{
		case 1:{
			res = d.day;
			break;
		}
		case 2:{
			res = 31 + d.day;
			break;
		}
		case 3:{
			res = 31 + 28 + d.day;
			break;
		}
		case 4:{
			res = 31 + 28 + 31 + d.day;
			break;
		}
		case 5:{
			res = 31 + 28 + 31 + 30 + d.day;
			break;
		}
		case 6:{
			res = 31 + 28 + 31 + 30 + 31 +  d.day;
			break;
		}
		case 7:{
			res = 31 + 28 + 31 + 30 + 31 + 30 + d.day;
			break;
		}
		case 8:{
			res = 31 + 28 + 31 + 30 + 31 + 30 + 31 + d.day;
			break;
		}
		case 9:{
			res = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + d.day;
			break;
		}
		case 10:{
			res = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + d.day;
			break;
		}
		case 11:{
			res = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + d.day;
			break;
		}
		case 12:{
			res = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + d.day;
			break;
		}	
	}
	// 下面还要判断是不是闰年
	// 闰年的判定:能整除4但是不能整除100, 或者能整除400也是闰年 
	if((d.year % 4 == 0 && d.year % 100 != 0) || (d.year % 400 == 0))
	{
		if(d.month > 2)
		{
			res++;	
		}	
	}
	return res; 
}

编写程序,输入一个日期和一个正整数k,计算k天以后是哪天。例如,输入的日期为2019年5月15日,k为16,则2019年4月15日的16天后 是2019年5月1日,输出2019-5-1。
输入:四个整数,前三个分别表示年、月、日 ,后一个标识天数k
输出:k天之后的日期,数据间用英文减号隔开。

【输入输出样例】
输入:
2019 4 15 16
输出:
2019-5-1

提示:(1)日期用结构体。
(2)先考虑加1一天的函数。
(3)函数可以返回结构体。
(4)主函数如下:
int main()
{
DATE d1,d2;
int k;
scanf("%d %d %d",&d1.year,&d1.month,&d1.day);
scanf("%d",&k);
d2=adddays(d1,k);
print(d2);
return 0;
}

#include<stdio.h>
typedef struct{
	int year;
	int month;
	int day;
}DATE;
void adddays(DATE *d, int k);
void print(DATE d);
int main()
{
	DATE d1,d2;
	int k;
	scanf("%d %d %d",&d1.year,&d1.month,&d1.day);
	scanf("%d",&k);
	// 没有按题目的思路,我用递归来做了,直接更改值就可以 
	adddays(&d1,k);
	print(d1);
	return 0;
}
// 这里用一个递归函数来进行,每次只加一天 
void adddays(DATE *d,int k)
{
	if( k == 0)
	{
		return;	
	}
	int year = d->year;
	int month = d->month;
	int day = d->day;
	switch(month)
	{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:{
			if(day == 31)
			{
				d->day = 1;
				d->month = d->month + 1;
			}
			else
			{
				d->day = d->day + 1;
			}
			break;
		}
		case 2:{
			if((year % 4 == 0 && year % 100 != 0) || (year % 400) == 0)
			{
				if(day == 29)
				{
					d->month = d->month + 1;
					d->day = 1;
				}
				else
				{
					d->day = d->day + 1;
				}
			}
			break;
		}
		default :{
			if(day == 30)
			{
				d->day = 1;
				d->month = d->month + 1;
			}
			else
			{
				d->day = d->day + 1;
			}
			break;
		}	
	}
	// 到这里可能要计算一下有没有超月份
	if(d->month == 13)
	{
		d->year = d->year + 1;
		d->month = 1;	
	}
	adddays(d,k - 1); 
}
void print(DATE d)
{
	printf("%d-%d-%d",d.year,d.month,d.day);
}

定义结构体表示一个人的信息,包括学号、姓名、数学成绩、语文成绩、外语成绩、总成绩。编写程序,输入4个人的基本信息(不含总成绩),计算每个人的总成绩,按总成绩从高到低排序,再输出。
输入:4行,每行是一个人的信息。成绩的数据类型均用int。
输出:4行,排序后的结果,含总成绩,一行中的数据间以一个空格隔开,末尾无空格。

【输入输出样例】
输入:
001 zhang 61 62 63
002 wang 60 70 80
003 sun 70 80 75
004 zhang 54 88 90
输出:
004 zhang 54 88 90 232
003 sun 70 80 75 225
002 wang 60 70 80 210
001 zhang 61 62 63 186

#include<stdio.h>
typedef struct{
	char sid[11];
	char name[11];
	int score[3];
	int sum;
}Student;
void getSum(Student s[]);
int main()
{
	Student *stu = (Student*) malloc(4 * sizeof(Student));
	int i;
	for(i = 0; i < 4; i++)
	{
		scanf("%s%s%d%d%d",stu[i].sid, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
		//printf("%s %s %d %d %d",stu[i].sid, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);	
	}	
	getSum(stu);
	sort(stu);
	print(stu);
	return 0;
}
void getSum(Student* s)
{
	int i;
	for(i = 0; i < 4; i++)
	{
		s[i].sum = s[i].score[0] + s[i].score[1] + s[i].score[2];
	}
}
void sort(Student* stu)
{
	int i, j;
	for(i = 0; i < 4; i++)
		for(j = 0; j < 4 - i -1 ; j++)
		{
			if(stu[j].sum < stu[j + 1].sum)
			{
				Student temp = stu[j];
				stu[j] = stu[j + 1];
				stu[j + 1] = temp;
			}
		}
}
void print(Student* stu)
{
	int i;
	for(i = 0; i < 4; i++)
	{
		printf("%s %s %d %d %d %d\n",stu[i].sid, stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2],stu[i].sum);
	}
}

请利用嵌套循环输出平行四边形,平行四边形行数为n,每行的“*”的数目也为n,n由键盘输入。
示例输入:
5
示例输出:
*****
*****
*****
*****
*****
(注意此处显示有问题,应该是输出一个平行四边形,第二行前面1个空格,第三行前面2个空格,以此类推)

#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	int i, j, k;
	for(i = 0; i < n; i++)
	{
		for(j = 0; j < i; j++)
		{
			printf(" ");
		}
		for(k = 0; k < n; k++)
		{
			printf("*");
		}
		printf("\n");
	}	
}

输入一个3*5矩阵,求出每一行每一列的最小值,将这些最小值中的最大值输出。(例如行和列的最小值为11 1 6 1 2 3 4 5,这8个最小值中11最大)
示例输入
11 12 13 14 15
1 2 3 4 5
7 8 9 6 10
示例输出
11

#include<stdio.h>
#define INT_MAX 0xffffff
int main()
{
	int num[3][5];
	int res[8];
	int i, j;
	for(i = 0; i < 3; i++)
	{
		int min = INT_MAX;
		for(j = 0; j < 5; j++)
		{
			// 在输入行的时候就可以先找出改行的最小值 
			scanf("%d",&num[i][j]);
			if(num[i][j] < min)
			{
				min = num[i][j];
			}
		}
		res[i] = min;
	}
	// 再从列里面找出该列的最小值
	int k = 3;
	for(i = 0; i < 5; i++)
	{
		int min = INT_MAX;
		for(j = 0; j < 3; j++)
		{
			if(num[j][i] < min)
			{
				min = num[j][i];
			}
		}
		res[k++] = min;
	}
	// 到这里就全部找出来了,开始找最大值
	int max = res[0];
	for(i = 1; i < 8; i++)
	{
		if(res[i] > max)
		{
			max = res[i];
		}
	}
	printf("%d",max); 
	return 0;
}

编写一个函数int sum(int *p, int n)计算一组数据的和,在main函数中输入5个int型数并放入数组,调用sum函数计算并输出该5个数的和。
示例输入
1 3 5 7 9
示例输出
25

#include<stdio.h>
int sum(int *p, int n);
int main()
{
	int *p = (int *) malloc(5 * sizeof(int));
	int i;
	for(i = 0; i < 5; i++)
	{
		scanf("%d",&p[i]);
	}
	printf("%d",sum(p,5));
	return 0;
}
int sum(int *p, int n)
{
	int i, sum = 0;
	for(i = 0; i < n; i++)
	{
		sum += p[i];
	}
	return sum;
}

用户从键盘依次输入6种农副产品的信息,编写程序按照销售额由小到大的顺序输出各个农副产品的信息。要求:
(1)定义农副产品信息的结构体fruitinfo,包括产品编号(正整数),产品名称(由不含空格的26个英文字母的大小写构成,不超过20个字符)、销量及单价,其中销量和单价是浮点数;
(2)定义void set( struct fruitinfo *t )函数,用来输入一种农副产品的数据;
(3)定义void print( struct fruitinfo *t )函数,用来输出一种农副产品的数据(其中浮点数保留小数点后2位);
(4)定义void sortfruit( struct fruitinfo *t )函数,用来对所有农副产品按照销售额(销售额等于单价乘以销量)从小到大排序(销售额相同时保持原来顺序);
(5)在主函数中调用set、sortfruit和print函数。
示例输入
1001 Apple 300.5 2.0
1002 Banana 100.5 3.5
1003 Lemon 205.2 2.5
1004 cherry 70.65 16.2
1005 grape 500.62 6.6
1006 orange 10000.2 5.15
示例输出(各数据项用英文空格隔开,数值数据保留两位小数,每行最后一个数据项没有空格)
1002 Banana 100.50 3.50
1003 Lemon 205.20 2.50
1001 Apple 300.50 2.00
1004 cherry 70.65 16.20
1005 grape 500.62 6.60
1006 orange 10000.20 5.15

#include<stdio.h>
typedef struct{
	int id;
	char name[20];
	float num;
	float price;
	float sum;
}fruitinfo;
void set(  fruitinfo *t );
void print(  fruitinfo *t );
void sortfruit(  fruitinfo *t );
int main()
{
    fruitinfo *t = (fruitinfo*) malloc(6 * sizeof(fruitinfo));
	set(t);
	sortfruit(t);
	print(t);
	return 0;	
}
void set( fruitinfo *t )
{
	int i;
	for(i = 0; i < 6; i++)
	{
		scanf("%d%s%f%f",&t[i].id, t[i].name, &t[i].num, &t[i].price);
		t[i].sum = t[i].num * t[i].price;
	}
}
void sortfruit( fruitinfo *t )
{
	int i, j;
	for(i = 0; i < 6; i++)
	{
		for(j = 0; j < 5 - i; j++)
		{
			if(t[j].sum > t[j + 1].sum)
			{
				fruitinfo temp = t[j];
				t[j] = t[j + 1];
				t[j + 1] = temp;
			}
		}
	}
}
void print( fruitinfo *t )
{
	int i;
	for(i = 0; i < 6; i++)
	{
		printf("%d %s %.2f %.2f\n",t[i].id, t[i].name, t[i].num, t[i].price);
	}
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值