C02-程序设计基础提高班(C++)第7周上机任务-指针

7周:阅读教材第6章(p164-200),主要内容是指针,完成第7周上机任务;

(回到C02-程序设计基础提高班(C++)学习安排)


实践内容:

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)上面默认输入的文字中没有多余的空格(即不会出现两个连续空格,句首和句末没有空格,每个标点符号左右两边出现仅只出现一个空格)。如果程序功能更强大些,允许有多余空格的情况,需要在读入后、统计前,清除多余空格。

上一篇:C++中的unordered_map和map区别


下一篇:C++中push_back和emplace_back的区别