本文目录一览:
-
6、大一c语言编程题
大一C语言编程题?
车票根据题意两两站点连线生成,金额和数量分别用随机数。
数据存储:站点,车票,用户分别为3个结构体,用于对应数据库。
购买流程:检查输入数值有效性-检查车票库存-购买成功同步修改用户购买流水及车票库存。(这里题目需求不明确,没有指明用户购买方式),我的代码允许一个用户同时购买多种票,每种票可分批购买多张。购买流水记录自动增加和更新。
退票流程:检查输入和用户购买记录,同步更新用户及车票信息。
删除流程:选择删除没有被用户购买的票(函数检查所有用户,虽然本题只要一个用户,实际传参用户数组首地址)。
PS: 这个题目涉及到增删改,用链表来写更好,但考虑你学习范围,没有使用链表而是动态数组,动态数组删除,考虑内存占用,不仅要需循环移位还要释放多余地址。
另外整体程序,异常的处理我只是单纯返回0或者1或者-1区分基本的成功与失败。你如想对个别异常进行特殊处理,自行修改返回值,接收判断。
下面是代码:
#include stdio.h
#include stdlib.h
#include string.h
#include time.h
#include windows.h
#include conio.h
#define MS 5//最大站点数
typedef struct station
char sid[10];
char sName[20];
}STN;
typedef struct ticket
int tid;//票编号
STN *ssP;//起始站
STN *tsP;//终点站
int value;//票价
int number;//数量
}TKT;
typedef struct userInfo//用户
char uid[20];//身份证号
int cnt;//购买的票种类数量
int *btids;//购买的所有票id数组
int *btNum;//购买的所有票数量数组
}UIFO;
int init(STN stns[MS],TKT **tkts);//初始化车站、票数据
int disAllTickets(TKT *tkts);
int buyTicket(UIFO *uifo,TKT *tkts);//异常返回0
int reTicket(UIFO *uifo,TKT *tkts);//异常返回0
int showMenu(UIFO *uifo,TKT *tkts);
int delIntByIndex(int *nums,int len,int index);//通过下标index删除动态整型数组nums对应元素,并释放多余地址,返回删除后的数组长度,异常返回-1
int delTkts(UIFO *uifos,int len,TKT *tkts);//删除指定票(检查用户组,只要有一个用户购买,无法删除)
int cnt;//票种类数量
int main()
STN stns[MS];
TKT *tkts=NULL;
UIFO uifo={"321002199902050614",0,NULL,NULL};
srand(time(NULL));
cnt=init(stns,tkts);
printf("共生成%d组票(每组往返两种票,共%d种票)\n\n",cnt/2,cnt);
printf("按任意键继续。。。。\n"),getch();
system("cls");
showMenu(uifo,tkts);
return 0;
int showMenu(UIFO *uifo,TKT *tkts)
int n=5;
printf("(1) Buy ticket\n");
printf("(2) Refund ticket\n");
printf("(3) Remove ticket\n");
printf("(4) Display all tickets\n");
printf("(0) Exit\n");
while(n0 || n4)
scanf("%d",n);
switch(n)
case 0: return 0;
case 1: if(!buyTicket(uifo,tkts)) return 0;break;
case 2: if(!reTicket(uifo,tkts)) return 0;break;
case 3: if(!delTkts(uifo,1,tkts)) return 0;break;
//这里删除功能,用户多名,要传数组首地址,由于演示只有一个用户(len=对应用户数),所以只传该用户地址(len=1)
case 4: disAllTickets(tkts);break;
showMenu(uifo,tkts);
return 1;
int disAllTickets(TKT *tkts)
int i;
for(i=0;icnt;i++)
printf("编号:%2d 路程:%s-%s 票价:%3d 剩余票数:%d\n",tkts[i].tid,tkts[i].ssP-sName,tkts[i].tsP-sName,tkts[i].value,tkts[i].number);
printf("按任意键继续。。。。\n"),getch();
system("cls");
return 1;
int delIntByIndex(int *nums,int len,int index)
int i,*temp=NULL;
if(indexlen-1) return -1;
for(i=index;ilen-1;i++)
nums[i]=nums[i+1];
len--;
if(len)
temp=(int *)realloc(nums,sizeof(int)*len);
if(!temp) return -1;
nums=temp;
else
free(nums);
return len;
int reTicket(UIFO *uifo,TKT *tkts)
int i,j,tid,n,index,len,flag=0;
printf("当前用户购买记录:\n");
for(i=0;iuifo-cnt;i++)
for(j=0;jcnt;j++)
if(tkts[j].tid==uifo-btids[i]) index=j;
printf("--车票编号:%d,起末站:%s-%s,购买票数:%d\n",uifo-btids[i],tkts[index].ssP-sName,tkts[index].tsP-sName,uifo-btNum[i]);
printf("请输入要退票的车票id及票数:"),scanf("%d%d",tid,n);
for(i=0;iuifo-cnt;i++)
if(uifo-btids[i]==tid uifo-btNum[i]=n)
for(j=0;jcnt;j++)
if(tkts[j].tid==uifo-btids[i]) tkts[j].number+=n;//同步修改对应车票剩余票数
uifo-btNum[i]-=n;//用户购买记录修改
if(uifo-btNum[i]==0)//某种车票全部退完,删除该条记录
len=delIntByIndex(uifo-btNum,uifo-cnt,i);
if(len==-1) return 0;
len=delIntByIndex(uifo-btids,uifo-cnt,i);
if(len==-1) return 0;
uifo-cnt=len;
flag=1;
break;
if(flag)
printf("退票成功!\n");
else
printf("无此购买记录或输入数量不符合\n");
printf("按任意键继续。。。。\n"),getch();
system("cls");
return 1;
int buyTicket(UIFO *uifo,TKT *tkts)
char spn[20],tpn[20];
int i,n=-1,index=-1,*temp=NULL;
for(i=0;icnt;i++)
printf("编号:%2d 路程:%s-%s 票价:%3d 剩余票数:%d\n",tkts[i].tid,tkts[i].ssP-sName,tkts[i].tsP-sName,tkts[i].value,tkts[i].number);
printf("请输入始发站站名和终点站站名:"),scanf("%s%s",spn,tpn);
for(i=0;icnt;i++)
if(strcmp(tkts[i].ssP-sName,spn)==0 strcmp(tkts[i].tsP-sName,tpn)==0)
printf("车票%s-%s 票价:%3d 剩余票数:%d\n",tkts[i].ssP-sName,tkts[i].tsP-sName,tkts[i].value,tkts[i].number);
index=i;
break;
if(index==-1)
printf("购买失败!无此路程的车票\n");
else
while(n=0)
printf("请输入要购买的数量(大于0):"),scanf("%d",n);
if(tkts[index].numbern)
printf("错误:车票数量不足或者输入数值超出范围!请重新输入!\n"),n=-1;
for(i=0;iuifo-cnt;i++)//检查用户购买记录,重复票累加购买数量,不同票新增记录
if(uifo-btids[i]==tkts[index].tid)
printf("该票已购买了%d张,现再次购买%d张,累计购买了%d张\n",uifo-btNum[i],n,uifo-btNum[i]+n);
uifo-btNum[i]+=n;
tkts[index].number-=n;
break;
if(i==uifo-cnt)//未检查到重复记录,新增
if(!uifo-btids)
uifo-btids=(int *)malloc(sizeof(int));
if(!uifo-btids) return 0;
uifo-btNum=(int *)malloc(sizeof(int));
if(!uifo-btNum) return 0;
else
temp=(int *)realloc(uifo-btids,sizeof(int)*(uifo-cnt+1));
if(!temp) return 0;
uifo-btids=temp;
temp=(int *)realloc(uifo-btNum,sizeof(int)*(uifo-cnt+1));
if(!temp) return 0;
uifo-btNum=temp;
uifo-btids[uifo-cnt]=tkts[index].tid;
printf("该票购买了%d张\n",(uifo-btNum[uifo-cnt]=n));
tkts[index].number-=n;
uifo-cnt++;
printf("用户购买记录:\n");
for(i=0;iuifo-cnt;i++)
printf("--车票编号:%d,购买票数:%d\n",uifo-btids[i],uifo-btNum[i]);
printf("本次成功购买了%s-%s的票%d张!\n",tkts[index].ssP-sName,tkts[index].tsP-sName,n);
printf("按任意键继续。。。。\n"),getch();
system("cls");
return 1;
int delTkts(UIFO *uifos,int len,TKT *tkts)//len:所有购买的用户数量
int i,j,k,tid,flag=0,index;
for(i=0;icnt;i++)
printf("编号:%2d 路程:%s-%s 票价:%3d 剩余票数:%d\n",tkts[i].tid,tkts[i].ssP-sName,tkts[i].tsP-sName,tkts[i].value,tkts[i].number);
printf("请输入要删除的车票编号:"),scanf("%d",tid);
for(i=0;icnt;i++)
if(tid==tkts[i].tid)
index=i;
flag=1;
for(j=0;jlen;j++)//检查所有用户购买记录
for(k=0;kuifos[j].cnt;k++)
if(uifos[j].btids[k]==tid)
flag=0;
printf("该票已被用户购买,无法删除,需先完成退票!\n");
break;
if(!flag)
break;
break;
if(!flag) printf(" 删除失败,输入数值超出范围或不可删除!\n");
else
cnt--;
if(cnt==0)
free(tkts[index].ssP);
free(tkts[index].tsP);
free(tkts[index]);
else
free(tkts[index].ssP);
free(tkts[index].tsP);
for(i=index;icnt;i++)
tkts[i]=tkts[i+1];
tkts[cnt].ssP=NULL;
tkts[cnt].tsP=NULL;
free(tkts[cnt]);
printf(" 删除成功!\n");
printf("按任意键继续。。。。\n"),getch();
system("cls");
return 1;
int init(STN stns[MS],TKT **tkts)
TKT *tTemp=NULL;
int i,j,n,v,cnt=2;
static int id=1;
printf("生成站点:\n");
for(i=0;iMS;i++,id++)
sprintf(stns[i].sid,"车站%03d",id);
sprintf(stns[i].sName,"SN%03d",id);
printf("----站点名:%s。站点ID:%s\n",stns[i].sid,stns[i].sName);
printf("计算所有站点连线,生成车票(票是往返,所以一次生成往返两组票):\n");
for(i=0;iMS;i++)
for(j=i+1;jMS;j++)
if(!(*tkts))
*tkts=(TKT *)malloc(sizeof(TKT)*2);
if(!(*tkts)) return -1;
else
tTemp=(TKT *)realloc((*tkts),sizeof(TKT)*cnt);
if(!tTemp) return -1;
*tkts=tTemp;
n=rand()%4+2;//每种票随机2~5张(保证总数大于20)
v=rand()%201+50;//随机生成票价50~250
(*tkts)[cnt-1].tid=cnt;
(*tkts)[cnt-1].ssP=stns[i];
(*tkts)[cnt-1].tsP=stns[j];
(*tkts)[cnt-1].value=v;
(*tkts)[cnt-1].number=n;
(*tkts)[cnt-2].tid=cnt-1;
(*tkts)[cnt-2].ssP=stns[j];
(*tkts)[cnt-2].tsP=stns[i];
(*tkts)[cnt-2].value=v;
(*tkts)[cnt-2].number=n;
printf("----%s和%s的之间往返票各生成%d张,票价为%d(随机)\n",stns[i].sName,stns[j].sName,n,v);
cnt+=2;
return cnt-2;
//答题不易,如采纳的,请不要无故删除问题。
大一c语言编程题目!!!!加急!!!!
题目:求1+2!+3!+...+20!的和
1.程序分析:此程序只是把累加变成了累乘。
2.程序源代码:
main()
float n,s=0,t=1;
for(n=1;n=20;n++)
t*=n;
s+=t;
printf("1+2!+3!...+20!=%e\n",s);
3、设*最多的一行为第N行,编程实现:输入任意正数N输出相应*阵(如N=3
#include"stdio.h"
main()
int i,j,k;
for(i=0;i=3;i++)
for(j=0;j=2-i;j++)
printf(" ");
for(k=0;k=2*i;k++)
printf("*");
printf("\n");
for(i=0;i=2;i++)
for(j=0;j=i;j++)
printf(" ");
for(k=0;k=4-2*i;k++)
printf("*");
printf("\n");
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
1.程序分析:采取逆向思维的方法,从后往前推断。
2.程序源代码:
main()
int day,x1,x2;
day=9;
x2=1;
while(day0)
{x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/
x2=x1;
day--;
printf("the total is %d\n",x1);
谁有大一C语言考试题?快考试了,跪求题库··
单项选择题(每小题2分,共50分)
1、一个C程序的执行是从___A__。
A、本程序的main函数开始,到main函数结束
B、本程序的main函数开始,到本程序文件的最后一个函数结束
C、本程序文件的第一个函数开始,到本程序文件的最后一个函数结束
D、本程序文件的第一个函数开始,到本程序main函数结束
2、C语言程序的基本单位是___C___。
A、程序行 B、语句
C、函数 D、字符
3、请选出可用作C语言用户标识符的一组标识符___B___。
A、void B、a3_b3 C、For D、2a
define _123 -abc DO
WORD IF ase sizeof
主要特点
C语言是一种结构化语言,它有着清晰的层次,可按照模块的方式对程序进行编写,十分有利于程序的调试,且c语言的处理和表现能力都非常的强大,依靠非常全面的运算符和多样的数据类型,可以轻易完成各种数据结构的构建,通过指针类型更可对内存直接寻址以及对硬件进行直接操作,因此既能够用于开发系统程序,也可用于开发应用软件。
以上内容参考:百度百科-c语言
大一C语言编程题!!
好好考试,老弟。
#include stdio.h
#include stdlib.h
#include string.h
#pragma warning(disable: 4996)
int main()
char input[1024];
scanf("%s", input);
int numCnt = 0;
char max = input[0];
char min = max;
int len = strlen(input);
for (int i = 0; i len; i++)
if (input[i] = '0' input[i] = '9')
numCnt++;
if (input[i] min)
min = input[i];
if (input[i] max)
max = input[i];
printf("numCnt: %d\n", numCnt);
printf("min: %c\n", min);
printf("max: %c\n", max);
return 0;
大一C语言编程题(要详细),谢谢!
建立一个数组aa[256],全初始化为0,
2)从头读字符串,每一个是存c中,在相应的aa[c]加1
3)如果aa中的奇数,大于1个,说明不可能是回文数
4)现在就是找最小的交换次数了,也就是把aa中的字每一个拿一半加上哪个奇数减1的一半,来作排列组合,这样最后要的字符串就定下来了,每个字符在这字符串中的号是定下来的,把这个号,和输入的字符串关联起来,来进行冒泡排序 ,如果交换就增加一次交换次数,最后比较所有的排列组合哪个次数最小,就完成
大一c语言编程题
#include stdio.h
int main()
int n,a,b,c;
scanf("%d",n);
if(n100||n999)
printf("Input error!");
else
a=n/100;
b=n/10%10;
c=n%10;
printf("%d",a*a*a+b*b*b+c*c*c);
return 0;