试题一以及约瑟夫环

论述C/C++程序预处理、编译、连接到执行的过程

1、从源文件到可执行文件需要经历四个步骤<预处理、汇编、编译、连接>
2、gcc -o test.i -E test.cpp
3、gcc -o test.s -S test.i
4、gcc -o test.o -c test.s
5、gcc -o test test.o
1 源文件hello.c(文本)–à预处理器----àhello.i(文本)

预处理器:将#include 包含的文件内容插入该命令处,检查全文处理#define宏定义,处理条件编译命令 #if #endif 将不需要的code屏蔽掉,处理完毕后生成修改后的源代码hello.i.

2 hello.i(文本)----à编译器------àhello.s(汇编程序 文本)

编译器:词法分析语法分析,生成一条条的汇编语句如mov ax,bx,相当于是优化后的汇编语言的源文件。
3 hello.s(汇编文本)------à汇编器----àhello.o(目标文件 二进制)
汇编器:将汇编源文件翻译成对应的机器指令,而且还写入一些东西与机器指令打包成可重新定位目标程序格式的文件hello.o
4 hello.o(目标文件二进制)----à连接器----àhello.exe(可执行目标文件 二进制)
连接器:比如说hello.o里调用了标准库里函数eg prinf ,连接器的工作就是找到prinf所在的目标文件xx.o或是xx.lib然后将该程序插入到我们的hello.o中,具体来说,其细节是什么,如何找到xx.o呢?是不是只并入用到的函数呢?
5 关于hello.exe执行:

在OS下运行程序时候,比如说我们double click一个xx.exe的图标,先是OS调用它一个叫做Loader加载器的函数,它读取分析可执行文件中的相关信息后,将其代码和数据拷贝到Memory中,然后进行一些操作后(?)将控制转移到这个程序。

5 论述C/C++中的堆、栈、自由存储区、全局、静态存储区和常量存储区

一个由c/c++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。

输入www.baidu.com
1、NDS解析域名得到ip地址
2、http 方法名+URL+版本
3、应答
4、页面

约瑟夫环:m个数,第k个跳出,循环,求输出队列

void Ysf_Cirle(int m, int k)
{
	//建立循环链表的环
	list<int> mylist;
	for (int i = 1; i <= m; ++i)
	{
		mylist.push_back(i);
	}

	//
	list<int>::iterator pos = mylist.begin(); //pos是起始位置
	while (mylist.size() != 1)
	{
		for (int j = 0; j < k - 1; ++j)
		{
			pos++;
			if (pos == mylist.end()) //跳过头结点
				pos++;
		}
		cout << *pos << " ";
		pos = mylist.erase(pos);
		if (pos == mylist.end())  //跳过头结点
			pos++;
	}
	cout << *pos << endl;
}

//约瑟夫环
int main()
{
	int m, k;
	cout << "input 人数:>";
	cin >> m;
	cout << "input 间隔:>";
	cin >> k;

	Ysf_Cirle(m, k);
	return 0;
}
#if 0
void ysfcircle(int *space, int m, int k)
{
	for (int i = 0; i < m; ++i)
	{
		space[i] = i + 1;
	}
	int pos = 0;
	while (m > 1)
	{
		for (int j = 0; j < k - 1; ++j)
		{
			pos = (pos + 1) % m;
		}
		cout << space[pos] << " ";
		for (int n = pos; n < m - 1; ++n)
			space[n] = space[n + 1];
		m--;
	}
	cout << space[pos] << endl;
}

int main()
{
	int *space;
	int m, k;
	cout << "input 人数:>";
	cin >> m;
	cout << "input 间隔:>";
	cin >> k;
	space = (int*)malloc(sizeof(int)*m);
	ysfcircle(space,m,k);
	free(space);
	return 0;
}
#endif
发布了39 篇原创文章 · 获赞 10 · 访问量 747

猜你喜欢

转载自blog.csdn.net/weixin_43393776/article/details/99341965