C语言习题2

题目描述1
三角形面积=SQRT(S*(S-a)(S-b)(S-c)) 其中S=(a+b+c)/2,a、b、c为三角形的三边。 定义两个带参的宏,一个用来求area, 另一个宏用来求S。 写程序,在程序中用带实参的宏名来求面积area。
输入
a b c三角形的三条边,可以是小数。
输出
三角形面积,保留3位小数
样例输入
3 4 5

#include<iostream>
#include<math.h>
#include<iomanip>
using namespace std;
#define s(a,b,c) {S=((a)+(b)+(c))/2;}
#define sarea(a,b,c,S){ area=sqrt(S*(S-a)*(S-b)*(S-c));}
int main()
{
	float a,b,c,S,area;//要定义t 
	cin>>a>>b>>c;
	s(a,b,c);
	sarea(a,b,c,S);
    cout<<fixed<<setprecision(3)<<area<<endl;
	
}

题目描述2
已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。

输入
第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两部分组成

输出
按照学号升序排列的数据

样例输入
2 3
5 100
6 89
3 82
4 95
2 10
样例输出
2 10
3 82
4 95
5 100
6 89


#include <iostream>
using namespace std;
struct list1{
	int number;
	int grade;
};
int main( )
{
	
	int a,b;

	list1 n[1000],m[1000],h[1000];
	cin>>a>>b;
	for(int i=0;i<a;i++)
	{
		cin>>n[i].number>>n[i].grade;
	//	cout<<n[i].number<<" "<<n[i].grade<<endl;
		
	}
	for(int i=a;i<b+a;i++)
	{
		cin>>m[i].number>>m[i].grade;
	//	cout<<m[i].number<<" "<<m[i].grade<<endl;
	}
	for(int i=0;i<a+b;i++)
	{
		if(i<a)
		{
			
			h[i].number=n[i].number;
			h[i].grade=n[i].grade;
		
		}
		else if(a<=i&&i<a+b)
		{
			h[i].number=m[i].number;
			h[i].grade=m[i].grade;
			
		
		}
	}
	for(int i=0;i<a+b;i++)
	{
		//cout<<h[i].number<<" "<<h[i].grade<<endl;
	}
	for(int i=0;i<a+b;i++)
	{
		for(int j=0;j<a+b-1;j++)
		{
			int t,t1;
			if(h[j].number>h[j+1].number)
			{
				t=h[j+1].number; 
				t1=h[j+1].grade; 
				h[j+1].number=h[j].number;
				h[j+1].grade=h[j].grade;
				h[j].number=t;
				h[j].grade=t1;
				
			}
		}
	}
	for(int i=0;i<a+b;i++)
	{
		cout<<h[i].number<<" "<<h[i].grade<<endl;
	}
	
}

题目描述3
有N个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入N个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩)
输入
学生数量N占一行每个学生的学号、姓名、三科成绩占一行,空格分开。
输出
各门课的平均成绩 最高分的学生的数据(包括学号、姓名、3门课成绩)
样例输入
2
1 blue 90 80 70
b clan 80 70 60
样例输出
85 75 65

#include<iostream>
using namespace std;
struct stu{
	string number;
	string name;
	int a[3];
	
};
int main()
{
	int n;
	cin>>n;
	stu b[n];
	int sum=0; 
	int sum1=0;
	int sum2=0;
	int count=0;
	int count1=0;
	int c[n];
	for(int i=0;i<n;i++)
	{
		cin>>b[i].number>>b[i].name;
		for(int j=0;j<3;j++)
		{
			cin>>b[i].a[j];
		}
	}
	for(int i=0;i<n;i++)
	{
	
		sum=sum+b[i].a[0];
		
	}
	sum=sum/n;
	cout<<sum<<" ";
	for(int i=0;i<n;i++)
	{
	
		sum1=sum1+b[i].a[1];
		
	}
	sum1=sum1/n;
	cout<<sum1<<" ";
	for(int i=0;i<n;i++)
	{
	
		sum2=sum2+b[i].a[2];
		
	}
	sum2=sum2/n;
	cout<<sum2<<" ";
	
	cout<<endl;
	for(int i=0;i<n;i++)
	{
		count=0;
		for(int j=0;j<3;j++)
		{
			count=count+b[i].a[j];
		}
		c[i]=count;
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n-1;j++)
		{
			int t;
			if(c[j]>c[j+1])
			{
				t=c[j+1]; 
				c[j+1]=c[j];
				c[j]=t;
			}
		}
	}	
	for(int i=0;i<n;i++)
	{
	    count1=0;
		for(int j=0;j<3;j++)
		{
			count1=count1+b[i].a[j];
		}
		if(count1==c[n-1])
		{
			cout<<b[i].number<<" "<<b[i].name<<" ";
			for(int j=0;j<3;j++)
		   {
			  cout<<b[i].a[j]<<" ";
		   }
		   break;
		}
	}
	
	
 } 

题目描述4
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?

输入
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。

输出
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。

样例输入
3
10
81
0
样例输出
1
5
40

#include<iostream>
#include<cmath>
#include<iomanip> 
using namespace std;
int main()
{
	int n;
	while(cin>>n&&n!=0)
	{
		int sum=0;
		int t;
		t=n%3;
		while(1)
		{
			 if(n==1)
			 {
			 	
			 	break;
			 }
			 else if(n%3==0)
			 {
			 	n=n/3;
			 	sum=sum+n;
			 }
			 	else if(n==2)
			 {
			 	sum=sum+1;
			 	break;
			 	
			 }
			 else if(n%3!=0)
			 {
			 	int h=n%3;
			 	n=n/3;
			 	sum=sum+n;
			 	n=h+n;
			 }
		
		}
	    cout<<sum<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/zhl11112222/article/details/87899935