昨天学校期中考试,今天更新。
完成进度:
1.语法基础课第二讲(if条件)课后习题已做完
2.打算今晚再看一下408数据结构的6.3_1图的广度优先遍历和6.3_2图的深度优先遍历
做题总结:
1.如何描述 “一个数是另一个数的整数倍”
*if( a % b == 0)
2.若出现像python中的字典样式的,如何通过不用if来描述(一般不用if会更简洁)
见【AcWing 660. 零食】
#include <cstdio>
int main() {
int x, y;
double price[6] = {0, 4, 4.5, 5, 2, 1.5};
scanf("%d %d", &x, &y);
printf("Total: R$ %.2f", price[x] * y);
return 0;
}
因为x与price是一一对应的,所以可以通过数组来用x索引price,妙!
3.用printf()输出字符串的注意事项
在用%s占位的基础上,输出内容要写成.c_str()
例:想打印字符串x,则写为
printf("%s",x.c_str());
4.if()与else if()含有继承性,如果if()里的不满足,那么随后的 else if()自动要求取if()里面的反面。
5.在printf()中,想要打印%,要连续输出2个%%。
6.很多if()可以存储类似于二叉树的信息表(虽然408没讲过,我也不确定这样总结对不对)
见【AcWing 670. 动物】
7.还是用2个数组模拟python中的字典,(为什么要2个数组呢,第2条不是只用了1个数组吗?)
(因为在第二点中,x的索引是有规律的,而在本例中,x因为无规律则必须借助数组。
2个数组的纽带是他们对应序号的x与地名相同。)
(先找到a[]中x所在的i位置,然后对应查找b[i]所对应的地名)
见【AcWing 671. DDD】
#include<iostream>
#include<string>
using namespace std;
int main()
{
int x;
cin >> x ;
int a[] ={61,71,11,21,32,19,27,31};//务必在定义数组时确保两数组对应位置相同
string b[]={"Brasilia","Salvador","Sao Paulo","Rio de Janeiro","Juiz de Fora","Campinas",
"Vitoria","Belo Horizonte"};
string t="a"; //工具变量t,存在目的:确定输入的x是否在a数组中;
int i ;
for(i=0;i<8;i++) {
if(x == a[i]) {
t = b[i]; //将a与b联系起来
break; //程序运行过程中满足if则运行break结束循环,在这里结束for循环;提高运行效率。
}
}
if(t == "a") printf("DDD nao cadastrado");
else cout<<t;
return 0;
}
8.三目运算符也可简化if形式(头一次见把 三目运算符用到后面的 cout<<)
很骚~
int main()
{
double x,y;
cin >> x >>y;
if(x==0 && y==0) cout<<"Origem";
else if(x * y ==0) cout<< (x==0 ? "Eixo Y" : "Eixo X"); // 在坐标轴上
else if(x > 0) cout<< (y > 0 ? "Q1" : "Q4");
else cout<< (y > 0 ? "Q2" : "Q3"); // 等价于 else if((x < 0)
}
9.交换位置的函数swap()
本质是3个杯子倒水。
//交换A与C的值
if (C > B && C >A){
swap = A;
A = C;
C =swap;
}
第一步.有水的一杯(A)先倒给空杯(swap)
第二步.刚倒完的杯子(A)一定要接住另一杯没动过的。(A = C)
第三步.把中介杯子送给空杯(C=swap)[ps:实际上不恰当,杯子倒完水后还有水]
10.在主函数main()中,可以在其中的一个if(){写return 0;}直接运行结束(像break)
11.今天才知道cout<<后面可以无限叠加 <<
12.1个printf()的多行输出
printf("%d\n"
"%d\n"
"%d\n",a,b,c);
13.(今天的最重点:sort()函数)
#include <algorithm> // 需要包含这个头文件
sort(first, last, compare);
first 和 last 是迭代器,定义了要排序的范围 [first, last)。last 指向的是序列尾部之后的位置。
compare 是一个可选参数,是一个函数或函数对象,用于定义排序规则。如果省略,则默认按升序排序。
例子:
include <iostream>
#include <algorithm> // 包含 sort
using namespace std;
int main() {
int arr[] = {5, 3, 6, 8, 9, 1};
int n = sizeof(arr) / sizeof(arr[0]);
sort(arr, arr + n); // 默认升序排序
for (int i = 0; i < n; ++i) {
cout << arr[i] << " ";
}
return 0;
}
std::greater 作为一个比较器,用于判断第一个参数是否应该排在第二个参数之前,基于的是“大于”的关系。因此,当使用 std::greater 作为 std::sort 的比较器时,它会将较大的元素放在较小的元素之前,从而实现降序排列。
如果你希望对一个 std::vector 或其他容器进行升序排列,你应该使用 std::less 作为比较器,或者直接调用 std::sort 而不指定第三个参数,因为默认情况下 std::sort 使用的就是 std::less,即按升序排列。
PS:屯个仓,这个greater的仿函数的代码现在看不懂,先贴在这里,以后学到函数再来反攻。
//AI给的解释
template< class T = void >
struct greater : binary_function <T,T,bool> {
bool operator()(const T& x, const T& y) const {
return x > y;
}
};
从上面的定义可以看出,std::greater 是一个模板类,它重载了 operator(),
接受两个参数 x 和 y,并返回 x > y 的结果。这正好符合 std::sort 所需的比较器形式,
即给定两个元素,返回 true 如果第一个应该放在第二个前面。