7-9 閱覽室 (20分)
天梯圖書閱覽室請你撰寫一個簡單的圖書借閱統計程式。當讀者借書時,管理員輸入書號并按下S鍵,程式開始計時;當讀者還書時,管理員輸入書號并按下E鍵,程式結束計時。書號為不超過1000的正整數。當管理員將0作為書號輸入時,表示一天作業結束,你的程式應輸出當天的讀者借書次數和平均閱讀時間。
注意:由于線路偶爾會有故障,可能出現不完整的紀錄,即只有S沒有E,或者只有E沒有S的紀錄,系統應能自動忽略這種無效紀錄。另外,題目保證書號是書的唯一標識,同一本書在任何時間區間內只可能被一位讀者借閱。
輸入格式:
輸入在第一行給出一個正整數N(≤10),隨后給出N天的紀錄。每天的紀錄由若干次借閱操作組成,每次操作占一行,格式為:
書號([1, 1000]內的整數) 鍵值(S或E) 發生時間(hh:mm,其中hh是[0,23]內的整數,mm是[0, 59]內整數)
每一天的紀錄保證按時間遞增的順序給出。
輸出格式:
對每天的紀錄,在一行中輸出當天的讀者借書次數和平均閱讀時間(以分鐘為單位的精確到個位的整數時間)。
輸入樣例:
3
1 S 08:10
2 S 08:35
1 E 10:00
2 E 13:16
0 S 17:00
0 S 17:00
3 E 08:10
1 S 08:20
2 S 09:00
1 E 09:20
0 E 17:00
輸出樣例:
2 196
0 0
1 60//
這是題目 然后我寫的代碼如下
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{ float minute(int p,int q,int x,int y); //定義函式
int day;
char t[50][2];//序號
int l[50][2];//時間
float w=0;//讀者個數
int o,ok=1;//標記
float k=0;float c;
scanf("%d",&day);int ii=0;int i=0;
for(ii=0;ii<day;ii++)//輸入日期并回圈
{ok=1;//標記重置
memset(t,0,sizeof(t)); memset(l,0,sizeof(l)); //陣列清空
while(ok){
scanf(" %c %c %d:%d",&t[i][0],&t[i][1],&l[i][0],&l[i][1]);//輸入一組資料
if (t[i][0]!=48)//判斷首位是否等于零
{for(o=i;o>=0;o--)
{if (t[i][0]==t[o][0]&&t[i][1]=='E'&&t[o][1]=='S')//尋找歷史資料,判斷是否符合第一位相等且第二位分別為E或S,若是則進行下一步運算,否則繼續尋找歷史資料
{k=k+minute(l[i][0],l[i][1],l[o][0],l[o][1]);w=w+1;}};//加和讀者個數以及閱讀時間
i=i+1;}//陣列加一
else {
if (w==0) {//判斷讀者個數是否為0, 若是則直接輸出0,若不是則進行運算
printf("0 0\n");}
else {c=round(k/w);
printf("%.0f %.0f\n",w,c);}
w=0; k=0;ok=0;}}//資料重置,跳出回圈
}
return 0;
}
float minute(int p,int q,int x,int y)
{float min;
min = (p-x)*60+(q-y);//轉化時間
return min;
}
//
他給的資料輸入是正確的 但是PTA檢測以后 只有一組答案顯示正確 兩組答案錯誤和一組段錯誤 實在是不懂了 求大神幫忙
uj5u.com熱心網友回復:
#include<stdio.h>
#include<string.h>
#include<math.h>
float minute(int p,int q,int x,int y); //定義函式
int main()
{
int day;
char t[50][2];//序號
int l[50][2];//時間
float w=0;//讀者個數
int o,ok=1;//標記
float k=0;float c;
scanf("%d",&day);
int ii=0;int i=0;
for(ii=0;ii<day;ii++)//輸入日期并回圈
{
ok=1;//標記重置
memset(t,0,sizeof(t)); memset(l,0,sizeof(l)); //陣列清空
while(ok){
scanf(" %c %c %d:%d",&t[i][0],&t[i][1],&l[i][0],&l[i][1]);//輸入一組資料
if (t[i][0]!=48)//判斷首位是否等于零
{
for(o=i;o>=0;o--)
{
if (t[i][0]==t[o][0]&&t[i][1]=='E'&&t[o][1]=='S')//尋找歷史資料,判斷是否符合第一位相等且第二位分別為E或S,若是則進行下一步運算,否則繼續尋找歷史資料
{
k=k+minute(l[i][0],l[i][1],l[o][0],l[o][1]);
w=w+1;
}
};//加和讀者個數以及閱讀時間 //這兒為啥加;分號
i=i+1;
}//陣列加一
else {
if (w==0) {//判斷讀者個數是否為0, 若是則直接輸出0,若不是則進行運算
printf("0 0\n");
}
else {
//c = round(k/w); //round for double roundf() for float
c = roundf(k/w);
printf("%.0f %.0f\n",w,c);
}
w=0; k=0;ok=0;
}
}//資料重置,跳出回圈
}
return 0;
}
float minute(int p,int q,int x,int y)
{
float min;
min = (p-x)*60+(q-y);//轉化時間
return min;
}
供參考~
懷疑是round的問題,但是不確定。
不過樓主的代碼風格確實很獨特,代碼不長但是看著費勁呢。自己沒感覺到嗎?
uj5u.com熱心網友回復:
我是本科生啊 剛學兩個月C語言 確實不是很熟練

不過朋友給我改完以后還是不對 仍然有兩組答案錯誤和一組段錯誤 不知道怎么回事
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98834.html
標籤:C語言
