本文目錄一覽:
- 1、大一C語言編程題?
- 2、大一c語言考試題(急)
- 3、大一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=10×20||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。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/185351.html