第17讲 课后自主学习及实践方案 源代码


【项目1-数组的排序】
按给定部分程序的要求,用指向数组的指针变量作为形式参数编写函数,完成排序。

#include <iostream>
using namespace std;
void sort(int *p, int num);  //不要对自定义函数的声明有任何改动
void output(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};
 sort(a,20);   //用冒泡法按降序排序a中元素
 output(a,20);   //输出排序后的数组
 sort(b,15);   //用冒泡法按降序排序b中元素
 output(b,15);   //输出排序后的数组
 return 0;
}
//下面定义自定义函数

【项目2-用指针玩字符串】

  示例:字符串连接(任务1)的完成
  (1)用数组名作形参方案,其核心是实现char *astrcat(char str1[], const char str2[])
//字符串连接函数实现和测试示例
#include <iostream>
using namespace std;
char *astrcat(char str1[], const char str2[]);
int main(){
    char s1[50]="Hello world. ";
    char s2[50]="Good morning. ";
    char s3[50]="vegetable bird! ";
    astrcat(s1,s2);
    cout<<"连接后:"<<s1<<endl;
    cout<<"连接后:"<<astrcat(s2,s3)<<endl;  //返回值为char*型,可以直接显示
    return 0;
}
//作为示例,本函数采用了形参为数组,在实现中,直接用下标法进行访问
//实际上,在实现中,完全可以用指针法访问
char *astrcat(char str1[], const char str2[])
{
    int i,j;
    //请理解:以下所有str1[i]可以替换为*(str1+i),str2[j]可以……
    for(i=0; str1[i]!='\0'; i++); //找到str1的结束
    for(j=0; str2[j]!='\0'; i++,j++) {
        str1[i]=str2[j];
    }
    str1[i]='\0';//切记!!
    return str1;
}
  (2)用指针作形参,其核心是实现char *pstrcat(char *str1, const char *str2)函数。
  pstrcat函数的实现如下所示,main函数作为测试函数,请自行设计。
//在下面的实现中,str1用指针法访问,而str2用下标法访问
//在实际工程中,这种风格并不好,要尽可以用同一种方式,一般而言,指针法效率更高
//此处str2用下标法访问,除了作为示例的考虑外,还有一个难言之隐
//如果声明char *q,并用q=str2、q++等操作,这是非法的,因为str2有const的限制,从而赋值不兼容
//如何修改,请思考
char *pstrcat(char *str1, const char *str2)
{
    char *p;
    //char *q=str2;  //如果这样会出现错误,如何改程序,可有多种改法
    int i;
    for(p=str1; *p!='\0'; p++); //找到str1的结束
    for(i=0; *(str2+i)!='\0'; i++,p++)  //如果q的定义通过,可以用*(q+i)代替*(str2+i)
    {
        *p=*(str2+i);
    }
    *p='\0';//切记!!
    return str1;
}

【项目3-用函数指针调用函数】
将下面的程序补充完整(包括定义函数),使其能够完成图示的功能。请使用已有程序的风格。
void eat();
void sleep();
void  hitdoudou();
void run(void (*f)());
int main()
{
    int iChoice;
    do
    {
        cout<<"请选择(1-吃;2-睡;3-打;其他-退)";
        cin>>iChoice;
        if(iChoice==1)
            run(eat);
        else if(...)
             ...
    }
    while(true);
    return 0;
}

【项目4-为动态数组扩容】
下面的程序,利用动态数组保存学生的成绩。当再有一批学生成绩需要保存时,要为之扩容(和吃自助一样,用多少,取多少,这好),请补充完整下面的程序,实现如图所示的功能。
int main( ){
    int num,i,addNum;  //num是小组人数
    cout<<"输入学生人数: ";
    cin>>num;
    int *score = new int[num];
    cout<<"请输入学生成绩: ";
    //输入num名同学的成绩
    for(i=0; i<num; i++)
        cin>>score[i]; //*(score+i)
    cout<<"需要增加多少名学生? ";
    cin>>addNum;   //addNum是需要增加的人数
    //下面的程序完成对数组的扩容,并输入另外的成绩
    ……
    cout<<"现在共有" << num << "名同学,他们的成绩是: "<<endl;
    for(i=0; i<num; i++)
        cout<<score[i]<<"  ";
    cout<<endl;
    delete []score;
    return 0;
}

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐