“C++ 编程入门班” 练习四

来自汉语教学技术研究与应用
跳转到导航 跳转到搜索


预习练习

自行输入【例4-1】、【例4-2】,编辑至运行通过。

【例4-1】数组的定义、赋值和遍历

#include <iostream>
using namespace std;

int main()
{
	int a[3]; //定义数组 
	a[0]= 1; //通过索引引用,并赋值。注意索引是从0开始的。 
	a[1]= 2;
	a[2]= 3;
	
	int b[3]= {5,6,7}; 	//定义数组并同时赋值。注意括号是花括号。 
	
	for(int i=0;i<3;i++)
	{
		cout << a[i] << endl;		
	}
	
	//计算数组b的长度,为什么要用这种方法呢?	
	//如果改成  int lenth = sizeof(b);
	// lenth的值会是多少呢? 
	int lenth = sizeof(b)/sizeof(int);
	
	for(int i=0;i<lenth;i++)
	{
		cout << b[i] << endl;	
	}
	
	return 0;	
}

【例4-2】数组排序

#include <iostream>
#include <stdlib.h>
#include <time.h>
#define random(x) (rand()%x)
using namespace std;

int main()
{
	int a[10];
	srand((int)time(0));//用系统时间来做种子 
		
	for(int i=0;i<10;i++) 
	{
		  
		a[i] = random(100); // 取100以内的随机数 		
	}
	
	//原始顺序 
	for(int i=0;i<10;i++) 
	{		 
		cout << a[i] << ","; // 逐个输出 		
	}
	cout << endl;
	
	for(int i=0;i<10;i++) 
	{		 
		for(int j=i+1;j<10;j++) 
		{
			if(a[i]>a[j])
			{
				//交换
				int temp =  a[i];
				a[i] = a[j];
				a[j] = temp;				
			} 
		}
				
	}
	
	//排序以后的顺序 
	for(int i=0;i<10;i++) 
	{		 
		cout << a[i] << ","; // 逐个输出 		
	}
	cout << endl;	
	
	
	return 0;	
}

algorithm_compare_sort_w600.gif

知识点

数组的赋值方式

方法一:逐个赋值。注意索引值从0开始。

方法二:批量赋值。


数组的遍历

1、获得数组的长度

2、使用循环语句,逐个访问数组的元素。

冒泡排序算法

【例4-3】冒泡排序

#include <iostream>
#include <stdlib.h>
#include <time.h>
#define random(x) (rand()%x)

using namespace std;


int main()
{
	int a[10];
	srand((int)time(0));//用系统时间来做种子 
		
	for(int i=0;i<10;i++) 
	{
		  
		a[i] = random(100); // 取100以内的随机数 		
	}
	
	//原始顺序 
	for(int i=0;i<10;i++) 
	{		 
		cout << a[i] << ","; // 逐个输出 		
	}
	cout << endl;
	
	int n = sizeof(a)/sizeof(int);
	
	for(int i=0;i<n-1;i++) 
	{		 
		for(int j=0;j<n-i;j++) 
		{
			if(a[j]>a[j+1])
			{
				//交换
				int temp =  a[j];
				a[j] = a[j+1];
				a[j+1] = temp;				
			} 
		}
				
	}
	
	//排序以后的顺序 
	for(int i=0;i<10;i++) 
	{		 
		cout << a[i] << ","; // 逐个输出 		
	}
	cout << endl;	
	
	
	return 0;	
}

假设共有10个数

第一轮:

1、从第1个数开始,将第1个数和第2个数比较,如果第1个数比第2个数大,交换两者。

2、将第2个数和第3个数比较,如果第2个数比第3个数大,交换两者。

3、将第3个数和第4个数比较,如果……

……

9、将第9个数和第10个数比较,如果第9个数比第10个数大,交换两者。

经过这一轮的比较,最大的数就是第10个。

第二轮:

与第1轮相同(可以只比较到第9个数)经过比较,最大的数是第10个,第二大的数是第9个。

第三轮:

与之前的相同(可以只比较到第8个数),经过比较,最大的数是第10个,第二大的数是第9个,第二大的数是第8个。


第十轮: 与之前的相同(可以只比较到第2个数)。

到此,经过不断比较和交换,最小的数不断上升,大的数逐个下沉,完成了从小到大的排序。
整个过程像气泡上升一样,所以也称为“冒泡排序”。

冒泡排序动画演示:

algorithm_bubble_sort_w600.gif

http://www.bilibili.com/video/av18176281/


扩展

【例4-1】的数组遍历,可以改用while 循环语句实现吗?

【例4-2】是按从小到大排序的,如果要改成从大到小排序,应该怎么修改?

【例4-2】和【例4-3】的排序有什么不同?

在各个例子的多个for 循环语句中,都使用了相同的int i,这些i之间是什么关系?互相会有影响吗?