老师未批改
作业
完成如下程序题:
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;}
> 运行效果:

### 第二题/*
> 文件名: 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;}
> 运行效果:

### 第三题/*
> 文件名: 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;}
> 运行效果:

### 第四题/*
> 文件名: 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;}
> 运行效果:

### 第五题/*
> 文件名: 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;}
> 运行效果:

### 第六题/*
> 文件名: 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;}
> 运行效果:

本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2016-10-06 at 03:15 pm