c++实训 结构

第一关

注意各种情况的分类讨论

#include <iostream>
using namespace std;

struct rationalNumber{
    int fenzi; // 分子
    int fenmu; // 分母
};

// 函数reduction:有理数化简,对传入的有理数n进行化简
// 参数:n-有理数
// 返回值:无化简后的有理数
rationalNumber reduction(rationalNumber n);

int main()
{
    char c;
    rationalNumber x, y;
    cin >> x.fenzi >> c >> x.fenmu;   // 输入有理数,首先读入分子,然后是/,最后是分母
    y = reduction(x);   // 有理数化简
    // 输出化简的结果
	
    if(y.fenmu == 1)
        cout << y.fenzi << endl;
	else
        cout << y.fenzi << "/" << y.fenmu << endl;
    return 0;
}

rationalNumber reduction(rationalNumber n)
{
    // 请在这里补充代码,实现函数reduction
    /********** Begin *********/
    
	int ma;
	bool flag=false;//判断正负
	if (n.fenzi==0){
		n.fenzi=0;
		n.fenmu=1;
		return n;
	}
	if (n.fenzi<0){
		n.fenzi=0-n.fenzi;
		flag=true;
	}
	
	int s=min(n.fenzi,n.fenmu);
	for (int i=1;i<=s;i++){
		if(n.fenzi%i==0 && n.fenmu%i==0){
			ma=i;
		}
	}
	
    if(flag)n.fenzi=0-n.fenzi;
	n.fenzi=n.fenzi/ma;
	n.fenmu=n.fenmu/ma;
	return n;
    
    
    /********** End **********/
}

第二关

先通分相加,再化简。可以调用之前的函数,减小工作量

#include <iostream>
using namespace std;

struct rationalNumber{
    int fenzi; // 分子
    int fenmu; // 分母
};

// 函数rnAdd:两个有理数相加
// 参数:x,y-两个有理数
// 返回值:x+y的最简分数形式
rationalNumber rnAdd(rationalNumber x, rationalNumber y);
rationalNumber reduction(rationalNumber n);
int main()
{
    char c;
    rationalNumber x, y, z;
    // 输入两个有理数
    cin >> x.fenzi >> c >> x.fenmu;
    cin >> y.fenzi >> c >> y.fenmu;
    z = rnAdd(x,y);     // 有理数相加
    // 输出相加的结果
    if(z.fenmu == 1)
        cout << z.fenzi << endl;
    else
        cout << z.fenzi << "/" << z.fenmu << endl;
    return 0;
}

// 请在此添加代码,实现函数rnAdd
/********** Begin *********/
rationalNumber rnAdd(rationalNumber x, rationalNumber y)
{
	rationalNumber m;
	m.fenzi=x.fenzi*y.fenmu+y.fenzi*x.fenmu;
	m.fenmu=y.fenmu*x.fenmu;
	//cout<<
	m=reduction( m);
    return m;
    
    /********** End **********/
}



rationalNumber reduction(rationalNumber n)
{
	int ma;
	bool flag=false;
	if (n.fenzi==0){
		n.fenzi=0;
		n.fenmu=1;
		return n;
	}
	if (n.fenzi<0){
		n.fenzi=0-n.fenzi;
		flag=true;
	}
	
	int s=min(n.fenzi,n.fenmu);
	for (int i=1;i<=s;i++){
		if(n.fenzi%i==0 && n.fenmu%i==0){
			ma=i;
		}
	}
	
    if(flag)n.fenzi=0-n.fenzi;
	n.fenzi=n.fenzi/ma;
	n.fenmu=n.fenmu/ma;
	return n;
}

第三关

使用之前的函数调用即可

#include <iostream>
using namespace std;

struct rationalNumber{
    int fenzi; // 分子
    int fenmu; // 分母
};

// 函数rnMean:计算n个有理数的平均数
// 参数:a-存放有理数的数组,n-有理数的个数
// 返回值:n个有理数的平均数
rationalNumber rnMean(rationalNumber a[], int n);
rationalNumber rnAdd(rationalNumber x, rationalNumber y);
rationalNumber reduction(rationalNumber n);
int main()
{
    char c;
    rationalNumber a[100],z;
    int n, i;
    cin >> n;     // 输入有理数个数
    // 输入n个有理数
    for(i = 0; i < n; i++)
        cin >> a[i].fenzi >> c >> a[i].fenmu;
    z = rnMean(a,n);     // 计算有理数平均数
    // 输出平均数
    if(z.fenmu == 1)
        cout << z.fenzi << endl;
    else
        cout << z.fenzi << "/" << z.fenmu << endl;
    return 0;
}

// 请在此添加代码,实现函数rnMean
/********** Begin *********/
rationalNumber rnMean(rationalNumber a[], int n)
{
    for (int i=0;i<n-1;i++){
		a[i+1]=rnAdd( a[i],  a[i+1]);
		
	}
	a[n-1].fenmu=a[n-1].fenmu*n;
	a[n-1]=reduction(a[n-1]);
	return a[n-1];
    
    
}
/********** End **********/
rationalNumber rnAdd(rationalNumber x, rationalNumber y)
{
	rationalNumber m;
	m.fenzi=x.fenzi*y.fenmu+y.fenzi*x.fenmu;
	m.fenmu=y.fenmu*x.fenmu;
	m=reduction(m);
    return m;
}
rationalNumber reduction(rationalNumber n)
{
	int ma;
	bool flag=false;
	if (n.fenzi==0){
		n.fenzi=0;
		n.fenmu=1;
		return n;
	}
	if (n.fenzi<0){
		n.fenzi=0-n.fenzi;
		flag=true;
	}
	
	int s=min(n.fenzi,n.fenmu);
	for (int i=1;i<=s;i++){
		if(n.fenzi%i==0 && n.fenmu%i==0){
			ma=i;
		}
	}
	
    if(flag)n.fenzi=0-n.fenzi;
	n.fenzi=n.fenzi/ma;
	n.fenmu=n.fenmu/ma;
	return n;
}

第四关

第四关的难度比较大,首先对于输入的获取比较有难度,在一个是三体那本书的价格要是整数,而其它书则是保留一位,因此我不得不把三体这本书单列出来

include<iostream>
#include<string.h>  //getchar()
#include<algorithm>  //sort
using namespace std;


//结构体的定义
struct book{
	char name[50];
	double price;
}b[100];

//书本价格的比较
bool cmp(book a,book b){
	return a.price<b.price;
}

int main(){
	//书本数目
	int n ; 
	cin>>n;
    //书本信息的输入
	for(int i=0;i<n;i++)
	{
		getchar(); //换行用getchar()吸收 
		cin.getline(b[i].name,50);
		cin>>b[i].price;		
	}
	
	//书本价格的排序
	//Sort函数有三个参数:
//(1)第一个是要排序的数组的起始地址。
//(2)第二个是结束的地址(最后一位要排序的地址)
//(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
	sort(b,b+n,cmp);
	
	//书本名字长度的比较
	for(int i=0; i<n; i++)
    {
        for(int j=i+1; j<n; j++)
        {
            if(b[i].price==b[j].price && strlen(b[j].name)<strlen(b[i].name))
            {
                book x=b[i];
                b[i]=b[j];
                b[j]=x;
            }
        }

    }
    //输出,三体要输出整数,没办法
	for(int i=0;i<n;i++){
		if (b[i].price==28.000000){
			printf("%d, %s\n",int(b[i].price),b[i].name);
		}
		else {printf("%.1f, %s\n",b[i].price,b[i].name);}
	}
	return 0;
}

本关参考了(1条消息) 7-4 书籍排序 (10分)_DDouble-的博客-CSDN博客

    本人是在这边文章的基础上完成,借鉴了获取输入的方法,这个价钱的排序不引入库函数也是能做的,但引入后确实方便,可以少打很多代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值