C++简单程序设计-2

实验结论:

  1.验证性实验部分

①函数声明和函数定义各自的作用及二者的区别:

  如果编译器在调用一函数时,发现在之前未定义便会报错,而函数声明就是告诉编译器“在后面有这个函数”,编译器便会向下继续寻找。当然在调用之前就将函数定义好也是可以的,所以我认为函数定义兼有函数声明的功能。

举一个知乎上看到的比喻:

小明,你去把窗子开一下。(谁是小明?报错了。)
所以要写成:
小明是身份证号为XXXXX的同学。//定义
小明,你去把窗子开一下。  //调用
或者写成:
有一个小明  //声明
小明,你去把窗子开一下。 //调用
小明是身份证号为XXXXX的同学。 //定义
作者:[已重置]
链接:https://www.zhihu.com/question/54655761/answer/141337226
来源:知乎
 
②什么是形参?什么是实参?函数参数和返回值在函数中起到什么作用?
  
    差不多就这样吧……
 
③函数参数传递过程中,值传递和引用传递区别
  值传递仅仅传递的是值,就如我上图所示。引用传递,传递的是内存地址,修改后会改变内存地址对应储存的值。
 
  2.编程实验部分
(1)2-28
#include <iostream>
using namespace std;                     //if……else  break contiue版本

int main()
{
    char select = 0;
    while (true)                         //构建循环
    {
        cout << "Menu: Add Delete Sort Quit,select one:";
        cin >> select;
        if (select == 'A')
        {
            cout << "数据已增加" << endl;
            continue;
        }
        else if (select == 'D')
        {
            cout << "数据已删除" << endl;
            continue;
        }
        else if (select == 'S')
        {
            cout << "数据已排序" << endl;
            continue;
        }
        else if (select == 'Q')
            break;
        else cout << "ERROR" << endl;          //输入其他数据返回error
    }
    return 0;
}            
#include <iostream>
using namespace std;                   //switch版本

int main()
{
    char select=0;
    while(true)                         //构建循环
    {
    cout<<"Menu: Add Delete Sort Quit,select one:";
    cin>>select;
    switch (select)
    {
    case 'A':cout<<"数据已增加"<<endl;continue;
    case 'D':cout<<"数据已删除"<<endl;continue;
    case 'S':cout<<"数据已排序"<<endl;continue;
    case 'Q':break;
    }
    break;
    }
    return 0;
}        

 

(2)2-29
判断质数算法:
  从2到要判断的数字的一半,进行取余数的操作,如果结果有为0,则不是质数。
#include <iostream>
using namespace std;                    //for循环

int main()
{
    int num,i,status;                          
    for (num = 2; num<=100; num++)
    {
        status = 1;                            //条件判断
        for (i = 2; i <= (num/2); i++)         //从2到数字的一半进行穷举
        {
            if (num%i == 0)
            {
                status = 0;                    //如果不是素数,条件判断为假,跳出循环
                break;
            }
        }
        if (status)                            //当判断为真时,即为素数时,输出这个数
            cout << num << endl;
    }
   return 0;
}
#include <iostream>
using namespace std;                    //while循环

int main()
{
    int num, i, status;
    num = 2;
    while(num<=100)
    {
        status = 1;                            //条件判断
        i = 2;
        while ( i <= (num / 2))                //从2到数字的一半进行穷举
        {
            if (num%i == 0)
            {
                status = 0;                    //如果不是素数,条件判断为假,跳出循环
                break;
            }
            i++;
        }
        if (status)                            //当判断为真时,即为素数时,输出这个数
            cout << num << endl;
        num++;
    }
    return 0;
}
#include <iostream>
using namespace std;                    //do……while循环

int main()
{
    int num, i, status;
    num = 2;
    do
    {
        status = 1;                            //条件判断
        i = 2;
        do                                       //从2到数字的一半进行穷举
        {
            if (num%i == 0&&num!=2)            //因为do……while先执行语句,想出的笨方法
            {
                status = 0;                    //如果不是素数,条件判断为假,跳出循环
                break;
            }
            i++;
        } while (i <= (num / 2));
        if (status)                            //当判断为真时,即为素数时,输出这个数
            cout << num << endl;
        num++;
    } while (num <= 100);
    return 0;
}

 

(3)2-32

 

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;                                                   //while循环

int main()
{
    int num, guess;
    srand((unsigned int)time(NULL));                               //调用时间函数传送不同的seed值
    num = 1 + rand() % 100;                                        //生成每次不同的随机数
    while (1)
    {
        cout << "Enter the number you guess:";
        cin >> guess;
        if(num==guess)                                              //对两个数字进行判断
        {
            cout << "Congratulations!!" << endl;
            break;
        }
        if (num < guess)
        {
            cout << "Too large……" << endl;
            continue;
        }
        if (num > guess)
        {
            cout << "Too small……" << endl;
            continue;
        }
    }
    return 0;
}
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;                                                   //do while循环

int main()
{
    int num, guess;
    srand((unsigned int)time(NULL));                               //调用时间函数传送不同的seed值
    num = 1 + rand() % 100;                                        //生成每次不同的随机数
    do
    {
        cout << "Enter the number you guess:";
        cin >> guess;
        if(num==guess)                                              //对两个数字进行判断
        {
            cout << "Congratulations!!" << endl;
            break;
        }
        if (num < guess)
        {
            cout << "Too large……" << endl;
            continue;
        }
        if (num > guess)
        {
            cout << "Too small……" << endl;
            continue;
        }
    } while (1);
    return 0;
}

 

(4)2-34

思路:两种

1.参照书本例3-9,利用递归的方法实现不同组合

2.利用for循环,检验每种情况,是否满足颜色不同后输出

#include <iostream>
using namespace std;                                 //思路1
int comm(int, int);

int main()
{
    int n, k;
    n=5;k=3                                          //5种颜色,摸3个
    cout << comm(n, k) << endl;
    return 0;
}

int comm(int n, int k)
{
    if (k > n)
        return 0;
    else if (k == 0 || n == k)                   //递归结束条件是n=k或k=0
        return 1;                                //此时值为1
    else
        return comm(n - 1, k) + comm(n - 1, k - 1);
} 

#include <iostream>
using namespace std;                                        //思路2
enum color{Red,Yellow,Blue,White,Black};             //定义枚举

int main()
{
    int i, j, k, n = 0;                                       //n代表种数
    for (i = Red; i<=Black; i++)
        for (j = i + 1; j<=Black; j++)
            for (k = j + 1; k <=Black; k++)
            {
                if (i != j && j != k && k != i)     //3球颜色不相同
                    cout << i << " " << j << " " << k<<endl;
                n++;
            }
    cout << n << endl;
    return 0;
}

 

实验总结与体会:

  在本次的实验中,题目2-32中使用了时间函数作为rand()的seed值,省去了手动输入,并提高了猜数游戏的可玩性。在实验2-34中,在使用递归后,在网上又看见了使用for循环进行枚举的方法,并自己尝试了一下。

  收获不少,因为在自己写完程序后,程序肯定不是最优的,需要与别人的代码进行比较和参考,了解了别人的思路,才能写出最好的。自己也任然有很多地方需要加强,比如在2-29中的do while语句中采用了比较笨的方法解决do while先执行后判断的特点。

posted @ 2018-03-25 11:21  质壁分离  阅读(471)  评论(10编辑  收藏  举报