您的位置:

大一c语言入门题目,大一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、C源程序文件的扩展名是( .C );编译后生成的文件名后缀是( .OBJ );经过连接后生成文件

名后缀是( .exe ); 在VC++6.0中用Run命令运行当前程序时,运行的程序扩展名是( .exe )。

2、结构化程序的三种基本结构是( 顺序、选择 、循环 )。

3、整型常量有三种表示方法,它们是( 十进制整数 )、( 八制整数 )、( 十六整数 )。

4、表达式3.5+1/2+56%10 的值是( 9.5 );10/10和10%10的值各是(1和0)。

5、表达式3%3*3的值是( 0 );5/3*3的值是( 3 );3*6%4的值是( 2 )。

6、设int x=12;执行x+=x-=x*x后,x 的值是( -264 )。

7、表达式k=7,k+=k-=k+1的值是( -2 )。

8、语句"printf("%x,%o",16,12);"的输出结果是( 10,14 )。

9、设short x,y; y=(x=3,x+2,++x,x++*2);则x,y的值各是( 5 , 8 )。

10、设int x,y,z,t; x=y=z=1; t=++x||++y++z;则y的值是( 1 )。

11、条件10=x20 或x=0的C语言表达式是( x=10x20||x=0 )

12、设a=1,b=2,c=3,d=4;表达式ab?a:cd?a:d的值是( 1 )。

13、在 C 程序中,用( 1)表示逻辑值“真”。

14、表示“x≥y≥z”的C表达式是 ( x=yy=z )。

15、设x为int型变量,请写出一个关系表达式( (x%21==0) ),用以判断x同时为3和7的倍数时

,关系表达式的值为真。

16、 设ch是字符型变量,判断ch为英文字母的表达式是: (

ch='z'ch='a'||ch='A'ch='Z' )。

17、在C语言中参数的传递总是采用( 单向 )传递。

18、如果return 表达式;中”表达式”的类型与函数类型不一致,则以( 函数类型 )的类型为准

自动转换;如果实际参数的类型与形式参数的类型不一致, 则以( 形式参数 )的类型为准自动转

换。

19、函数形式参数在( 调用 )时分配内存,( 调用结束 )时释放内存。

20、系统总是为数组分配( 连续 )的一块内存。

21、字符串的结束标志是(ASCII码的0 )。

22、TC系统为任何指针变量分配的内存是( 4 )字节。

23、若有定义:double x[3][5]; 则x数组中行下标的下限为( 2 ),列下标的上限为( 4 )。

24、若有定义int x=3,*p;则使p指向变量x的赋值语句为( p=x )。

25、在C 语言程序中,在函数内部定义的变量称为( 局部变量)。

26、char a[2][10]={“123”,”123456789”}, *p[2]={“123”,”123456789”}; 则(前者 )

占用内存多。

27、struct st { char num[5]; int a[4]; float ave; } a,*p; 则变量a和p在内存各

占( 25和4 )字节。

28、union un { int i; char c;} ;

struct st { int v[4]; double t; union un k; }w, *pw; pw=w;

变量w占用( 28 )字节; 通过w 访问v[0]的形式是( w.v[0] );通过w访问成员c的形式是(w.k.c

);通过pw访问v[0]的全部形式有( pw-v[0] ,*(pw-v) );通过pw访问成员c的全部形式有(

(pw-k.c) )。(实验验证,pw-k-c这种书写有错误直接用.也是错误)

29、设fp是文件指针,要把字符变量ch的内容写入文件,可用的语句有(

fputc(ch,fp);fwrite(ch,1,1,fp); )。

30、fputs(str, fp)函数的功能是( 将数据str写入fp文件流中 )。

{29题不能用 fputs(ch,fp);由于ch只有一个字符,如果用这句的话,会因为没有字符串结束标

志而写入很长的数据。从实验中得出。}

涉及到穷举的题目,像28、29可能没有列举完全其他题目都是经过vc++6.0验证过的。

大一C语言题目求解

c=n[0][j]+n[1][j]-2*’0’;——把对应字符相加变成了数字相加,如第一次是'0'+'8'-2*'0'结果就是数字0+8==8。第二次得到'8'+'9'-2*'0'==17,相应地第三次是10,最后一次是17。后面n[0][j]=c%10+’0’;又相应地把第一次的得数8+了'0'变成了字符'8'并存储到n[0]的最后一位,并且如果结果大于等于10时只取个位(由c%10实现);所以第二次得到的是'7',第三次得到的是'0',最后得到的是'7'。所以最后输出是7078和9198。