3.1 从初始化/赋值语句谈起
3.2 类型详述
3.2.1 类型描述
(1)存储所需尺寸
这里运用 sizeof( ) 函数可以查看一些类型所需要的空间。
#include<iostream>
int main()
{
int x = 10;
char y = 'a';
std::cout << sizeof(x) << '\n';
std::cout << sizeof(y) << '\n';
system("pause");
}
运行结果:
(2)取值空间
不同类型其都具有一定的空间范围,超过这个范围就会出现溢出。
这里分别查看了无符号整型和有符号整型的取值范围,以及超过了这个范围出现的上溢和下溢现象。
#include<iostream>
#include<limits>
int main()
{
std::cout << std::numeric_limits<int>::min() << '\n';//int 有符号整数
std::cout << std::numeric_limits<int>::max() << '\n';
std::cout << std::numeric_limits<unsigned int>::min() << '\n';//unsigned int 无符号整数
std::cout << std::numeric_limits<unsigned int>::max() << '\n';
unsigned int x = std::numeric_limits<unsigned int>::max();
unsigned int a = x + 1;
unsigned int b = x + 2;
std::cout << a << ' ' << b << '\n'; //这里无符号整型有上溢出
int y = std::numeric_limits<int>::max();
int c = y + 1;
int d = y + 2;
std::cout << c << ' ' << d << '\n'; //这里有符号整型有上溢出
int m = std::numeric_limits<int>::min();
int e = m - 1;
int f = m - 2;
std::cout << e << ' ' << f << '\n'; //这里有符号整型有下溢出
}
运行结果:
(3)对齐信息
系统在存储时都会按照类型进行对齐存储,比如 int 类型,4个字节,存储时一般不会出现 7999-8002这种,而是存储在8000-8003.
这里运用 alignof( ) 函数可以查看对齐信息。
#include<iostream>
struct Str
{
//8000
char x;
//8004-8007
int y;
};
int main()
{
std::cout << alignof(int) << '\n';//对其信息
std::cout << alignof(char) << '\n';//对其信息
std::cout << sizeof(Str) << '\n';
std::cout << alignof(Str) << '\n';
}
运行结果:
(4)类可以划分为基本类型和复杂类型
示例代码:
#include<iostream>
int main()
{
std::cout << sizeof(short) << '\n';
std::cout << sizeof(int) << '\n';
std::cout << sizeof(long) << '\n';
std::cout << sizeof(long long) << '\n';
std::cout << sizeof(float) << '\n';
std::cout << sizeof(double) << '\n';
std::cout << sizeof(long double) << '\n';
}
运行结果:
(5)与类型相关的标准未定义部分
3.2.2 字面值及其类型
例如:
#include<iostream>
int operator ""_ddd(long double x)
{
return (int)x*2;
}
int main()
{
int x=3.14_ddd;
std::cout<<x<<'\n';
}
结果:
3.2.3 变量及其类型
示例:
3.2.4 (隐式)类型转换
3.3 复合类型:从指针到引用
3.4 常量类型与常量表达式
3.5 类型别名与类型的自动推导
3.6 域与对象的生命周期
课后题:project 1(我的解答)
我相对小白,用的都是最基础的东西!!!
(1)对 project 1的解题思路
(2)示例代码
#include <iostream>
#include <cstdlib>
#include <ctime>
#include<vector>
#include<algorithm>
#include<numeric>
using namespace std;
void fun()
{
srand(time(0)); //设置时间种子
double result;
int score = 0;
int num = 0;
double time_cost;
vector<double> a;
vector<double> b;
vector<int> c;
vector<bool> d;
vector<double> time;
std::cout << "请输入答题的数目:";
cin >> num;
if (num >= 1)
{
for (int i = 1; i <= num; i++)
{
a.push_back(rand() % 100 + 1);
b.push_back(rand() % 100 + 1);
c.push_back(rand() % 4 + 1);
}
clock_t startTime;
clock_t endTime;
for (int i = 0; i < num; i++)
{
switch (c[i])
{
case 1:
cout << a[i] << " + " << b[i] << " =";
startTime = clock();
cin >> result;
endTime = clock();
time_cost = (double)(endTime - startTime) / CLOCKS_PER_SEC;
cout << "花费时间:" << time_cost << " s" << endl<<endl;
time.push_back(time_cost);
if (result == a[i] + b[i])
{
score = score + 1;
d.push_back(1);
}
else
{
d.push_back(0);
}
break;
case 2:
cout << a[i] << " - " << b[i] << " =" ;
startTime = clock();
cin >> result;
endTime = clock();
time_cost = (double)(endTime - startTime) / CLOCKS_PER_SEC;
cout << "花费时间:" << time_cost << " s" << endl<<endl;
time.push_back(time_cost);
if (result == a[i] - b[i])
{
score = score + 1;
d.push_back(1);
}
else
{
d.push_back(0);
}
break;
case 3:
cout << a[i] << " * " << b[i] << " =" ;
startTime = clock();
cin >> result;
endTime = clock();
time_cost = (double)(endTime - startTime) / CLOCKS_PER_SEC;
cout << "花费时间:" << time_cost << " s" << endl<<endl;
time.push_back(time_cost);
if (result == a[i] * b[i])
{
score = score + 1;
d.push_back(1);
}
else
{
d.push_back(0);
}
break;
case 4:
cout << a[i] << " / " << b[i] << " =" ;
startTime = clock();
cin >> result;
endTime = clock();
time_cost = (double)(endTime - startTime) / CLOCKS_PER_SEC;
cout << "花费时间:" << time_cost << " s" << endl << endl;
time.push_back(time_cost);
if (result == a[i] / b[i])
{
score = score + 1;
d.push_back(1);
}
else
{
d.push_back(0);
}
break;
default:
break;
}
}
cout << "分数为:" << score << endl<<endl<<endl;
sort(time.begin(), time.end());
cout << "最短用时:" << time[0] << " s"<<endl<<endl;
cout << "平均用时:" << accumulate(time.begin(), time.end(), 0) / num <<" s"<< endl<<endl;
for (int i = 0; i < num; i++)
{
if (d[i] == 0)
{
switch (c[i])
{
case 1:
cout <<"正确的运算应为:" << a[i] << " + " << b[i] << " =" << a[i] + b[i]<< endl;
break;
case 2:
cout << "正确的运算应为:" << a[i] << " - " << b[i] << " =" << a[i] - b[i] << endl;
break;
case 3:
cout << "正确的运算应为:" << a[i] << " * " << b[i] << " =" << a[i] * b[i] << endl;
break;
case 4:
cout << "正确的运算应为:" << a[i] << " / " << b[i] << " =" << a[i] / b[i] << endl;
break;
default:
break;
}
}
}
}
else
{
cout << "输入错误"<<endl;
}
}
int main()
{
fun();
system("pause");
}
(3)运行结果
(4)一些不熟悉的知识点
a)产生随机数
如果只用 rand( )函数,产生的是伪随机数,每次的结果都一样。利用srand( )函数设置随机数种子之后,就可以产生不同的数字了。
srand(time(0)) ;//先设置种子
rand();//然后产生随机数
其中 time(0)
是指系统当前时间,这样每次运行时,因为系统当前时间不一样,产生的随机数也就不同了。
使用rand( )函数产生1-100以内的随机整数:int number1 = rand()%100+1;
如果直接int number2 =rand()%100;
表示的是产生0-99的随机数。
注意:记得添加头文件 #include <cstdlib>
b)vector 容器
- 代码我用vector来保存产生的随机数,其用法是:
首先要记得添加头文件:#include<vector>
- vector的定义方式:
vector<类型> 名称;
,例如:vector<int> c;
这里定义了一个vector容器c,其内部存储的元素为int类型。 - vector 添加元素,利用其内置的函数push_back( )进行尾插,例如:
vector<int> a;
a.push_back(100);
这样就在vector容器a中插入了一个元素100。
- vector 容器内部元素的读取:这个和数组类似,可以用方括号读取,例如:
cout<<a[2]<<endl;
输出该容器中的第三个元素。(注意:索引是从0开始的)。
c)排序
因为项目中涉及到输出最短时间,所以我也创立了一个容器用来保存时间,并且调用了sort( )函数对该容器内部的元素进行了排序。
sort( )函数调用方式:sort(起始地址,结束地址);例如:
vector<double> time;
...
sort(time.begin(), time.end());
这里begin()代表返回一个迭代器(iterator),指向vector地第一个元素;end() 返回一个迭代器,指向vector的最后一个元素的后一个位置(注意:这个不是最后一个元素的地址)。
注意:调用sort( )函数的前提是要加入头文件:#include<algorithm>
d)求和
项目中有一个步骤是求取平均时间,代表着要把容器中的时间求和,在除以元素个数。其中的求和,我这里用的是 accumulate( )函数。
accumulate( )函数的前两个参数指定累加的范围,第三个参数为累加的初值,第四个参数为进行的操作,默认为累加。例如: accumulate(time.begin(), time.end(), 0)
注意:使用accumulate( )函数要添加#include<numeric>
e)设置时间
项目中有获取答题所用的时间,我这里用的是clock( )函数。
clock_t clock(void) 返回程序执行起(一般为程序的开头),处理器时钟所使用的时间。为了获取 CPU 所使用的秒数,需要除以 CLOCKS_PER_SEC。例如:
clock_t startTime;
clock_t endTime;
startTime = clock();
...
endTime = clock();
double time_cost = (double)(endTime - startTime) / CLOCKS_PER_SEC;
注意要添加头文件:#include <ctime>
优秀作业展示
我觉得我写的代码太散了,没有把其中的各个部分封装成小函数,看着特别乱。。。。。下次努力。