这篇是本作者刚刷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;
}