BJFUOJ-顺序存储结构

这篇是本作者刚刷BJFUOJ题遇到的问题及其详解,太久没敲代码了生疏了,如有更简洁的思路,欢迎交流。

1. 结构体数组的输入输出

定义结构体数组,字符串和浮点数的输入,有要求的输出。一以下C语言

#include <stdio.h>
typedef struct Book{
    char name[40];//书名
    char bno[100];//书号
    double price;//书价
};

int main() {
    struct Book books[1024]; //结构体数组
    int i=0;
    do {
        scanf("%s %s %lf",books[i].bno,books[i].name,&books[i].price);//字符串输入 %s 双精%lf
        i++;
    } while (books[i-1].price!=0&&books[i-1].name!=0&&books[i-1].bno!=0);

    printf("%d",i-1);
    for (int j = 0; j < i-1; ++j) {
        printf("\n%s %s %.2lf",books[j].bno,books[j].name,books[j].price);//保留剩余两位小数%.2lf
    }
    return 0;
}

2. 结构体排序

使用C++语言编写的

#include <iostream>
#include <algorithm> //引用快速排序所在的库

using namespace std;//定义命名空间

struct Book{
    char name[40];
    char bno[100];
    double price;
};

bool cmp(Book a,Book b){  //定义快速排序的比较方法 从大到小
    return a.price>b.price;
}


int main() {
    struct Book books[1024]; 
    int i=0;

    do {
        cin >> books[i].bno >> books[i].name >> books[i].price;
        i++;
    } while (books[i-1].price!=0&&books[i-1].name!=0&&books[i-1].bno!=0);

    sort(books,books + i - 1,cmp); //快排 始-终
    for (int j = 0; j < i-1; ++j) {
        cout << books[j].bno << ' ' << books[j].name << ' ';
        printf("%.2lf",books[j].price);
        cout << endl;
    }
    return 0;

}

3. 去重

多一个是否重复的属性字段,双循环暴力破解。

#include <iostream>
#include <cstring>

using namespace std;

struct Book{
    char name[40];
    char bno[100];
    double price;
    bool one = true;
};

int main() {
    Book books[1024];
    int n,m = 0;
    
    cin >> n;
    for (int j = 0; j < n; ++j) {
        cin >> books[j].bno >> books[j].name >> books[j].price;
    }

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < i; ++j) {
            if (strcmp(books[i].bno,books[j].bno)==0&&strcmp(books[i].name,books[j].name)==0&&books[i].price==books[j].price) {
            /**需要注意
            strcmp()函数:该函数用于比较两个字符串是否相等。
            	如果两个字符串完全相同(包括大小写),则返回0;
            	如果第一个字符串在字典序上小于第二个字符串,则返回一个负值;反之,返回正值。
            ==运算符:这种方式适用于比较两个字符串是否相等。当两个字符串内容完全相同时,返回true;否则返回false。
            */
                books[i].one = false;m++;
            }
        }
    }

    cout << n - m <<endl;
    for (int i = 0; i < n; ++i) {
        if (books[i].one){
            cout << books[i].bno << ' ' << books[i].name << ' ';
            printf("%.2lf\n", books[i].price);
        }

    }

    return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值