车票根据题意两两站点连线生成,金额和数量分别用随机数。
数据存储:站点,车票,用户分别为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种票)nn",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 ticketn")
printf("(2) Refund ticketn")
printf("(3) Remove ticketn")
printf("(4) Display all ticketsn")
printf("(0) Exitn")
while(n<0 || n>4)
scanf("%d",&n)
switch(n)
{
case 0: return 0
case 1: if(!buyTicket(uifo,tkts)) return 0break
case 2: if(!reTicket(uifo,tkts)) return 0break
case 3: if(!delTkts(uifo,1,tkts)) return 0break
//这里删除功能,用户多名,要传数组首地址,由于演示只有一个用户(len=对应用户数),所以只传该用户地址(len=1)
case 4: disAllTickets(tkts)break
}
showMenu(uifo,tkts)
return 1
}
int disAllTickets(TKT *tkts)
{
int i
for(i=0i<cnti++)
printf("编号:%2d 路程:%s-%s 票价:%3d 剩余票数:%dn",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(index>len-1) return -1
for(i=indexi<len-1i++)
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=0i<uifo->cnti++)
{
for(j=0j<cntj++)
if(tkts[j].tid==uifo->btids[i]) index=j
printf("--车票编号:%d,起末站:%s-%s,购买票数:%dn",uifo->btids[i],tkts[index].ssP->sName,tkts[index].tsP->sName,uifo->btNum[i])
}
printf("请输入要退票的车票id及票数:"),scanf("%d%d",&tid,&n)
for(i=0i<uifo->cnti++)
if(uifo->btids[i]==tid &&uifo->btNum[i]>=n)
{
for(j=0j<cntj++)
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=0i<cnti++)
printf("编号:%2d 路程:%s-%s 票价:%3d 剩余票数:%dn",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=0i<cnti++)
if(strcmp(tkts[i].ssP->sName,spn)==0 &&strcmp(tkts[i].tsP->sName,tpn)==0)
{
printf("车票%s-%s 票价:%3d 剩余票数:%dn",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].number<n)
printf("错误:车票数量不足或者输入数值超出范围!请重新输入!n"),n=-1
}
for(i=0i<uifo->cnti++)//检查用户购买记录,重复票累加购买数量,不同票新增记录
{
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=0i<uifo->cnti++)
printf("--车票编号:%d,购买票数:%dn",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=0i<cnti++)
printf("编号:%2d 路程:%s-%s 票价:%3d 剩余票数:%dn",tkts[i].tid,tkts[i].ssP->sName,tkts[i].tsP->sName,tkts[i].value,tkts[i].number)
printf("请输入要删除的车票编号:"),scanf("%d",&tid)
for(i=0i<cnti++)
if(tid==tkts[i].tid)
{
index=i
flag=1
for(j=0j<lenj++)//检查所有用户购买记录
{
for(k=0k<uifos[j].cntk++)
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=indexi<cnti++)
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=0i<MSi++,id++)
{
sprintf(stns[i].sid,"车站%03d",id)
sprintf(stns[i].sName,"SN%03d",id)
printf("----站点名:%s。站点ID:%sn",stns[i].sid,stns[i].sName)
}
printf("计算所有站点连线,生成车票(票是往返,所以一次生成往返两组票):n")
for(i=0i<MSi++)
for(j=i+1j<MSj++)
{
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
}
//答题不易,如采纳的,请不要无故删除问题。
单项选择题(每小题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语言搜题app。大学c语言搜题app原名叫做菜鸟学C语言是一款非常好用的学习c语言的手机软件
软件功能
1、选择题:按照考点分类的选择题习题,并有答案解析。
2、错题库:可自动加练习过程中错题加入收藏,以便反复练习。
3、上机操作题:300道上机操作题,程序填空题、程序修改题、程序设计题。
软件优势
1、选择题:按照考点分类的选择题习题,并有答案解析。
2、上级操作题:300道上机操作题,程序填空题、程序修改题、程序设计题。
3、最新押题:最新考试押题3套。
4、考点汇总:包含复习的考点。
5、错题库:可自动加练习过程中错题加入收藏,以便反复练习。
6、收藏夹:可在练习过程中自行收录题目到收藏夹,形成自己的小题库,针对性练习,提高通过率。
软件特色
1、随时随地都能够学习,而且还支持下载保存你学习内容离线继续学习。
2、同学们能够直接通过搜索引擎来查询寻找你感兴趣对你内容。
3、解答问题的办法非常多,可以选择通过拍照来答题,也可以选择输入题目来解答。
一、选择题
1、C语言规定,在一个源程序中,main()函数的位置(C )。
A) 必须在最开始 B)必须在最后
C) 可以任意 D) 必须在系统调用的库函数后面
这题你死记就行,你看看这个
任何一个C++程序都必须定义一个main函数,它的返回类型总是int类型。这个函数由操作系统来调用,在main函
数执行完以后,程序也就终止了。 main也可以使用return向操作系统返回一个值,使用操作系统的命令可以检测
main的返回值。一般约定在main返回0时,表示程序运行过程中没有出现错误,其它非零值表示程序出现异常情况。
若没有为main指定返回值,这样返回值是任意的。
2、若x和y都是int 型变量,x=100,y=200,且有以下程序段,printf(“%d”,(x,y))则其输出结果是( A)。
A) 200 B) 100 C) 100 200 D) 输出不确定值
(x,y)这是个逗号表达式,表达式的值为最后一个逗号后面表达式的值,因为前面有一个%d,所以输出 的是y的
值
3、合法的C语法字符常量是(C )。
A) “A” B) 65 C) ‘t’ D) A
字符都是由两个单引号括起来的,死记,a)为字符串
4、表达式“3!=4”的值是(A )。
A) 1 B) 0 C) T D) F
!=是c语言的逻辑运算符,3!=4为真,多以得1, 3=4为假,值为0
5、 int a=1,b=2,c=3,d=4,执行下列程序后x的值为( C)。
if(a>b) x=1else if (c>d) x=2else x=3
A) 1 B) 2 C) 3 D) 4
如果a>b,1>2为假,不执行x=1,执行else if(c>d),判断:3>4为假,不执行x=2,执行=3,完
6、以下程序的输出结果是(D)。
Int x=10,y=3,zprintf(“%dn”,z=(x%y,x/y))
A)1 B) 0 C) 4 D) 3
逗号表达式,x%y,10%3,商3余1,模取余数1,x/y,10/3,商3余1,除法取商3,逗号表达式,表达式的值为最后一
个逗号后面表达式的值
7、为表示x≥y≥z,应使用C语言表达式(A )。
A) (x>=y)&&(y>=z) B) (x>=y) AND (y>=z)
C) (x>=y>=z) D) (x>=y) &(y>=z)
关系运算符,x>=y与y>=z必须是同时成立的,因此要用逻辑运算符&&,&&与的意思
8、合法的数组定义是( a )。
A) int a[ ]=”string”B) int a[5]={0,1,2,3,4,5}
C) char a=”string”D) char a[ ]={“01234”}
a不指定数组长度定义,正确
b数组长度为5,就是里面有5个数组元素,多了一个数组元素
c定义a不是数组而是一个变量,素组应该是a[]
d是错的,字符串是这样定义的:char a[ ]={'0','1','2','3','4','0'}
[4]中数字是数组长度,说明里面有几个元素
9、设x和y均为int型变量,则语句“x+=yy=x-yx-=y;”的功能是(D)。
A) 把x和y按从小到大排列 B)把x和y按从大到小排列
C)无确定结果 D)交换x和y中的值
x+=y等同于x=x+y,把x加y的值赋给x,x现在存的是x与y的和
y=x-y把x减y的值赋给y,x现在存的是x与y的和 (x+y)-y=x,把x的值给y,y存x的值
x-=y等同于x=x-y,把x减y的值赋给x,(x+y)-y=x,现在的后面的y存的是x的值,做完后x里存的值是y,完成交换
10、若已定义x和y为double类型,则表达式“x=1,y=x+3/2”的值是(C)。
A) 1 B)2 C) 2.0 D) 1.0
逗号表达式,先让x=1在算y=x+3/2,得2,因为是double类型,所以有小数点
11、下列条件语句中,功能与其他语句不同的是 (D)
A) if(a) printf("%dn",x)else printf("%dn",y)
B) if(a==0) printf("%dn",y)else printf("%dn",x)
C) if (a!=0) printf("%dn",x)else printf("%dn",y)
D) if(a==0) printf("%dn",x)else printf("%dn",y)
a 如果a为真输出x,如果a为假输出y
b 如果a==0,也就是为假,输出y,a为真输出x,同a
c 如果a!=0为真,输出x,a为假输出y同上
d 如果a为假输出x,如果a为真输出y,与以上的都不同
12、以下能正确定义二维数组的是 (C)
A) int a[][3]B) int a[][3]=2{2*3}
C) int a[][3]={0}D) int a[2][3]={{1},{2},{3,4}}
a 没有给数组赋初值
b {}里不能有*
c 正确,记住第一个[]中可以为空,第二个[]不能为空,死记
d a[2][3] 的意思是有两个一维数组,每个一维数组里有3个元素,{{1},{2},{3,4}}她的意思是三个数组,{}中的每一个{}代表一个数组,里边的数为数组元素
13、用C语言编写的代码程序 (B)
A)可立即执行 B)是一个源程序
C)经过编译即可执行 D)经过编译解释才能执行
死记
以上就是关于大一C语言编程题?全部的内容,如果了解更多相关内容,可以关注,你们的支持是我们更新的动力!
版权声明:我们致力于保护作者版权,注重分享,被刊用文章【大一C语言编程题?】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!;
工作时间:8:00-18:00
客服电话
电子邮件
beimuxi@protonmail.com
扫码二维码
获取最新动态
