目录
第一题:计算平均成绩
第二题:平面向量加法
第三题:查找书籍
第四题:通讯录排序
第五题:计算职工工资
第一题:计算平均成绩
思路:看到一个学生的基本信息,所以定义一个结构体变量,然后呢,不知道人数的多少,这里用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;}//sortsort(list.begin(), list.end(), comparebirthday);//shuchufor (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;
}