怎样做C语言课程设计?(三)

    (续二)


    好吧,之前说过,C语言课程设计是对课程知识的覆盖式应用,所以不妨来翻翻书。控制流语句,有;数组,有;函数,有;指针,有;结构体,没有;文件,没有。理论上,应该还是可以继续改进的。

    把结构体纳入程序其实很容易,当我们看到加法的时候,很自然的就会联想到四则运算,同时,考虑到除法的特殊性(整数/整数=整数),应该将数据类型从int修改为double。
    写到这的时候,我已经不太想写了,因为需要对现有的程序做伤筋动骨的大修改......算了,谁让咱命苦呢!


    设计4:

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define MAXSIZE 20

/* 结构体 */
struct compute
{
    double a;
    double b;
    char op;
    double r;
};  /* a op b = r */

/* 四则运算 */
double plus(double a, double b)
{
    return a+b;
}
double minus(double a, double b)
{
    return a-b;
}
double multi(double a, double b)
{
    return a*b;
}
double divide(double a, double b)
{
    return (b==0?0:a/b);
}

/* 输入两个整数,计算其和 */
void inputData(struct compute *px)
{
    printf("请输入表达式:");
    scanf("%lf%c%lf", &px->a, &px->op, &px->b);
}
void process(struct compute *px)
{
    double (*pf)(double, double);
    switch(px->op)
    {
        case '+':   pf=plus;    break;
        case '-':   pf=minus;   break;
        case '*':   pf=multi;   break;
        case '/':   pf=divide;  break;
    }
    px->r = pf(px->a, px->b);
}
void outputData(struct compute x)
{
    printf("%.2lf %c %.2lf = %.2lf\n", x.a, x.op, x.b, x.r);
}

/* 随机生成n个整数,计算其和 */
int randomNum(int low, int high)
{
    int t;
    t=rand();
    while(t<0)    t=rand();
    return low+t%(high-low+1);
}
void inputBatch(int *pn)
{
    do {
        printf("请输入计算次数(1-%d):", MAXSIZE);
        scanf("%d", pn);
    }while(*pn<1 || *pn>MAXSIZE);
}
void processBatch(struct compute ax[], int n)
{
    int i, t;
    for(i=0; i<n; ++i)
    {
        ax[i].a=randomNum(0,100);
        ax[i].b=randomNum(0,100);
        t=randomNum(0,3);
        switch(t)
        {
            case 0:  ax[i].op='+';  break;
            case 1:  ax[i].op='-';  break;
            case 2:  ax[i].op='*';  break;
            case 3:  ax[i].op='/';  break;
        }
        process(&ax[i]);
    }
}
void outputBatch(struct compute ax[], int n)
{
    int i;
    for(i=0; i<n; ++i)
        outputData(ax[i]);
}

void showMenu()
{

    struct compute xVal, xArr[MAXSIZE];
    int n;
    int in, exitFlag=0;
    srand((unsigned)time(NULL));  /* 以当前时间做随机数种子 */
    while(1)
    {
        system("cls");
        printf("***************************************\n");
        printf("*************** 欢迎使用 **************\n");
        printf("***************************************\n");
        printf("请选择:\n");
        printf("    1----输入一个表达式,计算结果\n");
        printf("    2----输入多个表达式,批量计算结果\n");
        printf("    0----结束程序\n");
        printf("请输入(1,2,0):");
        scanf("%d", &in);
        switch(in)
        {
        case 1:
             inputData(&xVal);
             process(&xVal);
             outputData(xVal);
             system("pause");  break;
        case 2:
             inputBatch(&n);
             processBatch(xArr,n);
             outputBatch(xArr,n);
             system("pause");  break;
        case 0:    exitFlag=1;  break;
        }
        if (exitFlag)
        {
        printf("***************************************\n");
        printf("********* 感谢您的使用,再见!*********\n");
        printf("***************************************\n");
        break;
        }
    }
    system("pause");
}

main()
{
    showMenu();
}


    这里同样思考一个问题:把数据类型从int修改为double,是不是跑题了?答案是没有,因为程序中随机数生成的仍然是整数,所以只能算是扩展了课题要求。


    (未完待续)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章