Lesson20 PoEdu培训第二课 C语言篇(12) 分支 随堂作业
文章类别: 培训作业 0 评论

Lesson20 PoEdu培训第二课 C语言篇(12) 分支 随堂作业

文章类别: 培训作业 0 评论

老师未批改

作业

完成如下程序题:
1. 算牌是一种提高21点获胜几率的方法,在发牌时不断更新计数,玩家就可以计算出下大注和下小注的最佳时机。计算牌面的点数。 点数在3到6之间计数加1。 是10、J、Q、K计数减1。每更新计数
2. 用户输入三角形的3边长度,计算是三角形类型(等边,直角,普通)
3. 输入10个数值,计算平均值
4. 1台苹果7现价6888,第一年年折旧25%,之后3年每年递增10%,什么时候能够折价到1000以下
5. 从键盘输入一指定金额(以元为单位,如345.78),然后显示支付该金额的各种面额人民币数量,要求显示100元、50元、10元、5元、2元、1元、1角、5分、1分各多少张。
6. 用户输入生日计算出是周几 
``

## 作答

### 第一题

include <stdio.h>

include <math.h>

include <windows.h>

define Random(x) (rand() % x) // 通过取余取得指定范围的随机数

define POKER_NUM 1 // 扑克牌数量

define POKER_CLASS_MAX 4 // 扑克花色最大数量

define POKER_INDEX_MAX (13 * POKER_NUM) // 每种扑克牌花色的牌的最大数量

define MAX_POKER_NUM (POKER_CLASS_MAX * POKER_INDEX_MAX) // 最大的扑克牌数

// 定义每副牌的花色
// 本程序中使用enum, 宏定义可以不看了

define POKER_HONGTAO 0

define POKER_HEITAO 1

define POKER_FANGPIAN 2

define POKER_MEIHUA 3

typedef enum _POKER_CLASS {

_HONGTAO = 0,
_HEITAO = 1,
_FANGPIAN,
_MEIHUA,
_GHOST = 10

} POKER_CLASS;

//////////////////////////////////////////////////////////////////////////
// 转换扑克牌花色
int ConvertPokerClass(int iPokerClass, char* strPokerClass)
{

switch (iPokerClass)
{
case _HONGTAO:
    sprintf_s(strPokerClass, sizeof("红桃"), "%s", "红桃");
    break;
case _HEITAO:
    sprintf_s(strPokerClass, sizeof("黑桃"), "%s", "黑桃");
    break;
case _FANGPIAN:
    sprintf_s(strPokerClass, sizeof("方片"), "%s", "方片");
    break;
case _MEIHUA:
    sprintf_s(strPokerClass, sizeof("梅花"), "%s", "梅花");
    break;
case _GHOST:
    sprintf_s(strPokerClass, sizeof("大王小王"), "%s", "大王小王");
    break;
default:
    sprintf_s(strPokerClass, sizeof("未知的新牌种"), "%s", "未知的新牌种");
    break;
}
return 0;

}
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// 转换扑克牌的值
int ConvertPokerIndex(char cPoker, char* strPokerIndex)
{

switch (cPoker)
{
case '0':
    sprintf_s(strPokerIndex, 3, "%s", "10");
    break;
default:
    sprintf_s(strPokerIndex, 3, "%c", cPoker);
    break;
}
return 0;

}
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// 计分规则
// 扑克牌数是 3, 4, 5, 6 时, 点数加1
// 扑克牌数是 A, 7, 8, 9 时, 点数加0
// 扑克牌数是 10, J, Q, K 时, 点数减1
int GetNumByPoker(char cPoker)
{

switch (cPoker)
{
case '3':
case '4':
case '5':
case '6':
    return 1;
case 'A':
case '7':
case '8':
case '9':
    return 0;
default:
    return -1;
}

}
//////////////////////////////////////////////////////////////////////////

int main()
{

printf("欢迎来玩21点!\n");

printf("我们使用一副扑克牌, 2个人来玩~~~\n");
printf("系统随机出牌, 不用人为干预.\n");
printf("请按任意键开始游戏~\n");
_getch();

// C语言不能动态分配数组~~
// 暂时按照1副牌赋初值
char cPokers[POKER_CLASS_MAX][POKER_INDEX_MAX] = { {'A', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K'},
    {'A', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K' },
    {'A', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K' },
    {'A', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'J', 'Q', 'K' }
};

// 初始化随机数种子
srand((unsigned)time(NULL));

int iPokerClass = -1;
int iPokerIndex = -1;
int iNum = 0;

for (int i = 0; i < MAX_POKER_NUM; i++)
{
    // 随机出没出过的扑克牌
    do 
    {
        // 先随机从4个花色中随机一个
        iPokerClass = Random(POKER_CLASS_MAX);
        // 在随机出牌, 如果牌出过了, 在继续随机~~
        iPokerIndex = Random(POKER_INDEX_MAX);
    } while (cPokers[iPokerClass][iPokerIndex] == '\0');
    
    // 记录随机出来的扑克牌
    char cPoker = cPokers[iPokerClass][iPokerIndex];
    // 将出过的牌去掉
    cPokers[iPokerClass][iPokerIndex] = '\0';

    // 出牌, 计算技术
    char strPokerIndex[4] = { '\0' };
    char strPokerClass[50] = { '\0' };

    ConvertPokerClass(iPokerClass, strPokerClass);
    ConvertPokerIndex(cPoker, strPokerIndex);

    printf("当前第[%d]次发牌, 本次发牌:[%s%s]\t", i + 1, strPokerClass, strPokerIndex);
    iNum += GetNumByPoker(cPoker);
    printf("====>当前计数为:[%d]\n", iNum);
    Sleep(100);
}

printf("游戏结束!\n请按任意键退出程序!");
_getch();
return 0;

}


> 运行效果:  
![Alt 运行效果](http://www.hxhlb.net/uploads/node20hw/1.gif)

### 第二题

/*

> 文件名: lesson20.hw.02.c
> 作者: 花心胡萝卜
> 邮箱: hxhlb@hxcarrot.com 
> 创建时间: 2016-09-24 14:17:32

**/

include <stdio.h>

define TRUE 1

int main() {


int iA = 0, iB = 0, iC = 0;
do {
    printf("请输入三角形的三条边的边长:\n");
    int iRet = 0;
    while((iRet = scanf_s("%d%d%d", &iA, &iB, &iC)) < 3) {
        printf("请输入正确的数字![%d]\n", iRet);
        // 清空输入缓冲区
        while(getchar() == EOF);
    }

    // 判断是否能形成三角形  任意两边之和>第三边
    if ((iA + iB > iC) && (iA + iC > iB) && (iB + iC > iA) 
            && iA > 0 && iB > 0 && iC > 0) {
        // 能够成三角形
        // 判断是什么三角形
        if (iA == iB && iA == iC) {
            printf("这是个等边三角形!\n");
        } else if (iA == iB || iA == iC || iB == iC) {
            printf("这是个等腰三角形!\n");
        } else if ((iA == iB || iA == iC || iB == iC)
                && ((iA * iA + iB * iB == iC * iC)
                || (iA * iA + iC * iC == iB * iB)
                || (iB * iB + iC * iC == iA * iA))) {
            printf("这是一个等腰直角三角形!\n");
        } else if ((iA * iA + iB * iB == iC * iC)
                || (iA * iA + iC * iC == iB * iB)
                || (iB * iB + iC * iC == iA * iA)) {
            printf("这是个直角三角形!\n");
        } else {
            printf("这是个普通三角形!\n");
        }
    } else {
        printf("您输入的不能构成三角形!\n");
    }
    printf("还要继续吗? 输入任意非数字退出.\n");
    char ch = '\0';
    if ((int)(ch = _getch()) < 48 || ch > 57) {
        break;
    }
} while (TRUE);

return 0;

}


> 运行效果:  
![Alt 运行效果](http://www.hxhlb.net/uploads/node20hw/2.png)

### 第三题

/*

> 文件名: lesson20.hw.03.c
> 作者: 花心胡萝卜
> 邮箱: hxhlb@hxcarrot.com 
> 创建时间: 2016-09-24 15:36:40

**/

include <stdio.h>

int main() {

int iInputVal[10] = { 0 };
printf("请输入10个数字!\n");
for (int i = 0; i < 10; i++) {
    printf("请输入第[%d]个:", i + 1);
    int iRet = 0;
    while((iRet = scanf_s("%d", &iInputVal[i])) <= 0) {
        printf("请输入正确的数字![%d]\n", iRet);
        // 清空输入缓冲区
        char ch;
        while((ch = getchar()) != EOF && ch != '\n');
    }
        printf("正确的数字![%d]\n", iRet);
}

int iSum = 0;
printf("您输入的数字为:\n");
for (int i = 0; i < 10; i++) {
    printf("[%d] ", iInputVal[i]);
    iSum += iInputVal[i];
}

printf("\n您输入的这些数字的平均值为:[%g]\n", (double)iSum / 10.0);

return 0;

}


> 运行效果:  
![Alt 运行效果](http://www.hxhlb.net/uploads/node20hw/3.png)

### 第四题

/*

> 文件名: lesson20.hw.04.c
> 作者: 花心胡萝卜
> 邮箱: hxhlb@hxcarrot.com 
> 创建时间: 2016-09-24 16:58:25

**/

include <stdio.h>

define IPHONE_PRICE 6888.0

define IPHONE_MIN_PRICE 1000.0

int main() {


double iPhonePrice = IPHONE_PRICE;
int iYears = 1;

while (iPhonePrice > IPHONE_MIN_PRICE) {
    if (iYears == 1) {
        iPhonePrice = iPhonePrice * 0.75;
    } else {
        iPhonePrice = iPhonePrice * 0.9;
    }
    iYears++;
}

printf("在第[%d]年, iPhone7的价格低于1000元, 价格为[%g]元\n", 
        iYears, iPhonePrice);
return 0;

}


> 运行效果:  
![Alt 运行效果](http://www.hxhlb.net/uploads/node20hw/4.png)

### 第五题

/*

> 文件名: lesson20.hw.05.c
> 作者: 花心胡萝卜
> 邮箱: hxhlb@hxcarrot.com 
> 创建时间: 2016-09-24 17:16:05

**/

include <stdio.h>

int main() {


printf("请给一些钱吧(元): ");
double dInputVal = 0.0;

while (scanf_s("%lf", &dInputVal) <= 0) {
    printf("不要小气, 给钱要给的正确才好啊~~~\n继续, 给点钱吧(元): ");
    // 清空输入缓冲区
    char ch;
    while ((ch = getchar()) != EOF && ch != '\n');
}

printf("感谢您的支持!\n");
printf("共有百元大钞[%d]张\n", (int)(dInputVal / 100));
printf("共有50元大钞[%d]张\n", (int)(dInputVal / 50));
printf("共有20元大钞[%d]张\n", (int)(dInputVal / 20));
printf("共有10元大钞[%d]张\n", (int)(dInputVal / 10));
printf("共有5元大钞[%d]张\n", (int)(dInputVal / 5));
printf("共有2元大钞[%d]张\n", (int)(dInputVal / 2));
printf("共有1元大钞[%d]张\n", (int)(dInputVal / 1));
printf("共有5角大钞[%d]张\n", (int)(dInputVal * 10 / 5));
printf("共有2角大钞[%d]张\n", (int)(dInputVal * 10 / 2));
printf("共有1角大钞[%d]张\n", (int)(dInputVal * 10 / 1));
printf("共有5分大钞[%d]张\n", (int)(dInputVal * 100 / 5));
printf("共有1分大钞[%d]张\n", (int)(dInputVal * 100 / 1));

return 0;

}


> 运行效果:  
![Alt 运行效果](http://www.hxhlb.net/uploads/node20hw/5.png)

### 第六题

/*

> 文件名: lesson20.hw.06.c
> 作者: 花心胡萝卜
> 邮箱: hxhlb@hxcarrot.com 
> 创建时间: 2016-09-24 17:34:51

**/

include <stdio.h>

int main() {


// 基姆拉尔森计算公式  
// W = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) mod 7  
// 在公式中d表示日期中的日数,m表示月份数,y表示年数
// 把一月和二月看成是上一年的十三月和十四月,
// 例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。


printf("请输入您的生日(分别输入年份、月份、日子哦~):\n");

int iYear = 0, iMonth = 0, iDay = 0;

while (scanf_s("%d%d%d", &iYear, &iMonth, &iDay) < 3) {
    printf("好好的, 输入正确的~~~\n在来输入:\n");
    // 清空输入缓冲区
    char ch;
    while ((ch = getchar()) != EOF && ch != '\n');
}

// 进行1月和2月的转换
switch(iMonth) {
    case 1:
    case 2:
        iMonth += 12;
        iYear--;
        break;
    default:
        break;
}

int iWeekDay = (iDay + 2 * iMonth + 3 * (iMonth + 1) / 5 + iYear + iYear / 4 - iYear / 100 + iYear / 400) % 7;

iWeekDay++;

char strResult[20] = { '\0' };

switch(iWeekDay) {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    case 6:
        sprintf_s(strResult, 20, "%s%d", "星期", iWeekDay);
        break;
    case 7:
        sprintf_s(strResult, 20, "%s", "星期日");
        break;
    default:
        break;
}

printf("您出生那天是[%s]\n", strResult);

return 0;

}


> 运行效果:  
![Alt 运行效果](http://www.hxhlb.net/uploads/node20hw/6.png)


回复