第7周:阅读教材第6章(p164-200),主要内容是指针,完成第7周上机任务;
实践内容:
1. (数组的排序) 按模板中的要求,用指向数组的指针变量作为形式参数编写函数,完成冒泡排序。重点体会:(1)冒泡排序算法;(2)用指向数组的指针变量作为形式参数,用数组名(即数组的地址)作为实际参数,函数中对于形参的改变实质上也就是对实参对应内存单元的改变;(3)形式参数中不指定数组大小,实际数组的大小也一并作为参数传递。
#include <iostream> using namespace std; void bubble_sort(int *p, int num); //不要对自定义函数的声明有任何改动 void output_array(int*, int); int main( ) //不要对main函数有任何改动 { int a[20]={86,46,22,18,77,45,32,80,26,88,57,67,20,18,28,17,54,49,11,16}; int b[15]={27,61,49,88,4,20,28,31,42,62,64,14,88,27,73}; bubble_sort(a,20); //用冒泡法按降序排序a中元素 output_array(a,20); //输出排序后的数组 bubble_sort(b,15); //用冒泡法按降序排序b中元素 output_array(b,15); //输出排序后的数组 return 0; } //下面定义自定义函数
2. 编写函数 int fun(int x, int *pp)。其功能是,求出x的所有奇数因子,并按照从小到大的顺序放在pp指向的内存中,函数返回值为这些整数的个数。若x的值为30, 数组中的数为1,3,5,15,函数返回4。
下面是该程序main()函数的部分代码作为参考。
int main(void) { int a[50],x,n; ____________; n=fun(x,a); cout<<x<<”的奇因子共有”<<n<<”个,分别是:” for(int i=0;i<n;i++) _________________; cout<<endl; ______________; }
3. 编写程序,要判断两个有序数组中是否存在相同的数字
#include<iostream> using namespace std; bool commmonNum(int *a,int n1,int *b,int n2) { //要完成的代码 } int main() { int a[]={1,4,7,8}; int b[]={2,5,6,9,10}; int n1=sizeof(a)/sizeof(a[0]); int n2=sizeof(b)/sizeof(b[0]); bool flag=commmonNum(a,n1,b,n2); if(flag==true) cout<<"两个有序数组中存在相同的数字!\n"; else cout<<"两个有序数组中不存在相同的数字!\n"; return 0; }
4. 给定以下三个函数原型:
void sortl(int*, int*, int*); void sort2(int&,int&,int&); void sort3(int,int,int);它们的功能都是把三个整数按升序排列。编写程序实现这三个函数,并且写main()函数调用它们,验证这三个函数的正确性。
思考并验证:(1)三个函数有何不同,应该如何调用?(2)以函数sort1(int*, int*, int*)为例说明指针传递参数的过程。
5. 实现函数fun(char* str1, char* str2, int m),将字符串str1中从第m个字符开始的全部字符复制到另一个字符串str2中,当m值大于str1的长度时,输出空字符串。
#include <iostream> using namespace std; void fun(char*, char*, int); int main() { char str1[100]="I am a student",str2[100]; int m; cin>>m; fun(str1,str2,m); cout<<str2<<endl; return 0; } //fun函数的定义
6. 用指针编写函数fun(char* str1,char* str2,int m, int n),调用后,str2中获得str1中从m位置开始的n个符号构成的子串。编写函数fun,并编制main()函数调用,展示其功能。
7. 从键盘输入若干行文字(每行不起过80个字符),统计其中出现的单词数目。
提示:这个任务可以做成若干个版本,逐渐增强功能
(1)一行英文句子中的单词数目中间的空格决定,如I am a boy.这是4个单词。本题中若干行句子形成一篇文章,可以统计一篇文章的词数。word中有此功能,好强!
(2)cin函数输入字符串时,一旦遇到空格就会结束读取,不能用于读一行。在此,可以cin对象的getline方法完成(详见课本p434)。
格式:cin.getline(字符数组(或字符指针),字符个数)
例如:
char ch[81]; //除'\n'外,还可以存放80个字符 cin.getline(ch,81); //读80个字符或遇'\n'结束(3)行数可以先由键盘输入或者设定一个特殊的符号作为结束,如果多行文字(对应一篇文章)有困难,可以先做统计一行功能。
(4)如果结合文件,读入的数据来自文件,这个功能将更强,用于统计文件中的单词数目。
(5)上面默认输入的文字中没有多余的空格(即不会出现两个连续空格,句首和句末没有空格,每个标点符号左右两边出现仅只出现一个空格)。如果程序功能更强大些,允许有多余空格的情况,需要在读入后、统计前,清除多余空格。