C语言:车票问题!!!要求只能用大一知识,不能太复杂!!好的加双倍分!!

发布时间:2024-05-18 06:08 发布:上海旅游网

问题描述:

1.假设某线路的公共汽车共设置26个车站,准备了1元、2元…6元的车票,收费标准为:6站以内票价为1元,每4站票价增加1元。现在随机生成一些乘客的上车站与下车站,显示每位乘客应付的票价和单程售出的总票价,并统计几元的车票卖得最多。
2.游戏随机产生4个0-9的数字,请用户猜4个数字的值和位置顺序。用户输入4个数字后,游戏提示用户当前这4个数字猜对几个,以及几个数字位置正确(要求不能显示哪位是正确的),用户再猜,直到猜对这4个数字的值和位置顺序,此时提示用户游戏结束。要求在文件中记录用户每次所猜的数字及结果。

如果第二踢\题也做了.再加!!
希望可以是比较简单的,加到两百分了,有人可以做吗??

问题解答:

GOGOGO!
随便给点吧,以下程序已编译通过。
/* 猜数游戏 */
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
{
int rdigit,rdigit1,num,num1,count,flag;
int i,j,k,t,l[4]; /*j:数字正确的位数 k:位置正确的位数*/
/*l[]:数字相同时,人所猜中数字的正确位置*/
srand((unsigned int)time(NULL));
rdigit=1000+rand()%9000; /*计算机想一个四位随机数*/

printf("The number is: %d\n",rdigit);/*这就是计算机想的数,这一行可以去掉*/
printf("I have a number with 4 digits in mind,please guess it.\n\n");
for(count=1;;count++) /*count: 猜数次数计数器*/
{
printf("Enter a number with 4 digits:");
scanf("%d",&num); /*请人猜*/
rdigit1=rdigit;
j=0;
k=0;
l[0]=l[1]=l[2]=l[3]=0;
for(i=1;i<5;i++) /*i:原数中的第i位数。个位为第一位,千位为第4位*/
{
num1=num;
flag=1;
for(t=1;t<5;t++) /*人所猜想的数*/
{
if(num1%10==rdigit1%10) /*若人猜的第t位与计算机想的第i位相同*/
{
if(flag&&t!=l[0]&&t!=l[1]&&t!=l[2]&&t!=l[3])
{
j++;flag=0;l[j-1]=t; /*若该位置上的数字尚未与其它数字“相同”*/
} /*记录相同数字时,该数字在所猜数字中的位置*/

if(i==t) k++; /*若位置也相同,则计数器k加1*/
}
num1/=10;
}
rdigit1/=10;
}
printf("Correctly guessed %d digits,",j);
printf("and guessed %d digits in exact position.\n\n",k);
if(k==4) break; /*若位置全部正确,则人猜对了,退出*/
}
printf("Now correctly guessed the whole number after %d times.\n",count);

system("pause");
return 0;
}

typedef struct _Guest
{
int up ; // 上车
int down ; // 下车
int pay; // 票价
struct _Guest * pNext;
struct _Guest * pPrev;
} Guest;

int AddGustNode(Guest **pHead, Guest *pNew)
{
int iCount = 0;
Guest *p = *pHead;
Guest *pLast = NULL;

if (p == NULL)
{
pNew->pNext = NULL;
pNew->pPrev = NULL;
*pHead = pNew;
return 1;
}

while(p->pNext != NULL)
{
iCount ++;
p = p->pNext;
}

pNew->pNext = NULL;
pNew->pPrev = p;
p->pNext = pNew;

return iCount +2;
}
void RemoveGuestNode(Guest **pHead, Guest *pRemove)
{
if (*pHead == NULL)
{
return;
}
// 是首节点。
if (pRemove->pPrev == NULL)
{
(*pHead) = pRemove->pNext;
if (pRemove->pNext != NULL)
pRemove->pNext->pPrev = NULL;
}
else
{
pRemove->pPrev->pNext = pRemove->pNext;
if (pRemove->pNext != NULL)
pRemove->pNext->pPrev = pRemove->pPrev;
}
pRemove->pNext = NULL;
pRemove->pPrev = NULL;

}

int AddGuest(Guest **pHead, int UpNo, int down, int pay)
{
Guest *pNew = new Guest;
pNew->down = down;
pNew->up = UpNo;
pNew->pay = pay;
pNew->pNext = NULL;
pNew->pPrev = NULL;

return AddGustNode(pHead, pNew);

}

void DisplayList(Guest *pHead)
{
while(pHead != NULL)
{
printf("%c:%d\n", pHead->up, pHead->down);
}
}

int CalcTicket(int up, int down)
{
int len =down - up;
int pay;
if (len <= 6)
{
return 1;
}
pay = 1 + (len - 6) / 4 ;
if ((len - 6) % 4 > 0)
{
pay ++;
}
return pay;
}

#define MAX_GUEST_UP 10

int _tmain(int argc, _TCHAR* argv[])
{

Guest *pInBus = NULL;
Guest *pDown = NULL;
int iCountInBus;
for(int i = 1; i <= 26; i ++)
{
printf("到第%d站了!\n", i);
// 开始处理下车
Guest *p = pInBus;
int iDownCount = 0;
while(p!= NULL)
{
// 设为五分之一的机会下车,终点全部下车。
if (rand() % 5 == 0 || i == 26)
{
Guest *pTmp = p->pNext;
// 计算票价
p->down = i;
p->pay = CalcTicket(p->up, p->down);
//移除当前的节点,
RemoveGuestNode(&pInBus, p);
// 移到已经下车的乘客上。
AddGustNode(&pDown, p);

iDownCount ++;

p = pTmp;
}
else
{
p= p->pNext;
}

}
printf("刚刚下车了%d人!\n", iDownCount);

if (i < 26 )
{
// 不是最后一站,开始上车
int iUp = rand() % MAX_GUEST_UP; // 随机上这么多个人
for(int i = 0; i < iUp; i ++)
{
iCountInBus = AddGuest(&pInBus, i, -1, 0);

}
printf("刚刚上车了%d人,车上现在有%d人!\n", iUp, iCountInBus);
}
}

// 开始统计
{
int PayCount[6] = {0,0,0,0,0,0};
int PaySum = 0;
iCountInBus = 0;
Guest *p = pDown;
while(p!= NULL)
{
PayCount[p->pay] ++;
iCountInBus ++;
PaySum += p->pay;
printf("第%d位乘客,从第%d上,%d站下,车票费:%d\n", iCountInBus, p->up, p->down, p->pay);
p = p->pNext;
}

printf("共收了%d元.\n", PaySum);
for(int i =0; i < 6; i ++)
{
printf("%d元面额的,使用了%d张。\n", i, PayCount[i]);
}
}

return 0;
}

热点新闻