深蓝C++学习 第三章 对象与基本类型

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>

优秀作业展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我觉得我写的代码太散了,没有把其中的各个部分封装成小函数,看着特别乱。。。。。下次努力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值