PTA结构体经典编程题
目录
第一题:计算平均成绩
第二题:平面向量加法
第三题:查找书籍
第四题:通讯录排序
第五题:计算职工工资
第一题:计算平均成绩
思路:看到一个学生的基本信息,所以定义一个结构体变量,然后呢,不知道人数的多少,这里用vector设立一个动态数组,接着遍历所有的学生,输入信息。将学生的成绩累加起来,接着求解平均值。然后判断遍历输出即可
#include <iostream>
#include <iomanip>
#include <vector>
using namespace std;
struct Student {
string id;
string name;
int score;
};
int main() {
int N;
cin >> N;
vector<Student> students(N);
double sum = 0.0;
for (int i = 0; i < N; i++) {
cin >> students[i].id >> students[i].name >> students[i].score;
sum += students[i].score;
}
double average = sum / N;
printf("%.2lf\n", average);
for (int i = 0; i < N; i++) {
if (students[i].score < average) {
cout << students[i].name << " " << students[i].id << endl;
}
}
return 0;
}
第二题:平面向量加法
思路:
简单定义见结构体变量,最后if(fabs(v.x)<0.05)
的判断是为了解决浮点数精度问题。在实际计算中,由于浮点数的表示方式和计算精度的限制,可能会导致一些微小的误差。因此,当两个浮点数本应为零但实际上非常接近零时,为了避免输出 -0.0
这样不符合要求的格式,可以通过判断绝对值小于一个很小的阈值(比如 0.05
)来将其修正为零。
#include<stdio.h>
#include<math.h>
struct ping {
double x;
double y;
};
int main(){
struct ping v,v1,v2;
scanf("%lf%lf%lf%lf",&v1.x,&v1.y,&v2.x,&v2.y);
v.x=v1.x+v2.x;
v.y=v1.y+v2.y;
if(fabs(v.x)<0.05) v.x=fabs(v.x);
if(fabs(v.y)<0.05) v.y=fabs(v.y);
printf("(%.1f, %.1f)",v.x,v.y);
return 0;
}
第三题:查找书籍
查找书籍
思路:这个题的细节还是蛮多的。整体思路很简单,定义结构体变量,然后输入每本书的书名和价格,但是,要注意在输入书的价格的时候,cin不读取最后的\n,这里必须要把\n给处理掉,这里在c++可以用cin.ignore,如果在c可以用getchar,如果不处理,那么\n一直在缓冲区,那么下一次\n就会被geiline给读取,影响结果。接着由于不知道最低价格多少,我们就令第一本书为最低价,然后遍历判断即可,最后输出书名的时候也要注意格式,如用printf输出string类型的时候,必须在变量名后加.c_str(),否则不能输出。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct Book {
string name;
double price;
};
int main() {
int n;
cin >> n;
cin.ignore(); // 忽略第一个换行符
vector<Book> books(n);
for (int i = 0; i < n; i++) {
getline(cin, books[i].name);
cin >> books[i].price;
cin.ignore(); // 忽略每个价格后面的换行符
}
double maxPrice = books[0].price;
double minPrice = books[0].price;
string maxBook = books[0].name;
string minBook = books[0].name;
for (int i = 1; i < n; i++) {
if (books[i].price > maxPrice) {
maxPrice = books[i].price;
maxBook = books[i].name;
}
if (books[i].price < minPrice) {
minPrice = books[i].price;
minBook = books[i].name;
}
}
printf("%.2lf, %s\n", maxPrice, maxBook.c_str());
printf("%.2lf, %s", minPrice, minBook.c_str());
return 0;
}
第四题:通讯录排序
思路:
这个题的关键是,要判断年龄的大小,这里我们不要想复杂,直接通过日期数的大小来判断,数越小,年龄越大。然后就是根据年龄大小来排序
#include<bits/stdc++.h>
using namespace std;
struct friends {
string name;
int birthday;
string phone;
};
bool comparebirthday(friends friend1, friends friend2);
int main()
{
int n;
cin >> n;
vector<friends>list(n);
for (int i = 0; i < n; i++)
{
cin >> list[i].name;
cin >> list[i].birthday;
cin >> list[i].phone;
}
//sort
sort(list.begin(), list.end(), comparebirthday);
//shuchu
for (int i = 0; i < n; i++)
{
cout<< list[i].name << ' ' << list[i].birthday << " " << list[i].phone << endl;
}
return 0;
}
bool comparebirthday(friends friend1, friends friend2)
{
return friend1.birthday < friend2.birthday;
}
第五题:计算职工工资
思路:按步就班,先定义后输入然后输出,注意格式即可,
#include<bits/stdc++.h>
using namespace std;
struct salry
{
string name;
float gz1;
float gz2;
float zc;
};
int main()
{
int n;
cin >> n;
vector<salry>worker(n);
for (int i = 0; i < n; i++)
{
cin >> worker[i].name >> worker[i].gz1 >> worker[i].gz2 >> worker[i].zc;
}
vector<float>sj(n);
for (int i = 0; i < n; i++)
{
sj[i] = worker[i].gz1 + worker[i].gz2 - worker[i].zc;
}
for (int i = 0; i < n; i++)
{
printf("%s %.2lf\n", worker[i].name.c_str(), sj[i]);
}
return 0;
}