第12周程式設計總結
第12周程式設計總結
題目12-1 程式設計列印空心字元菱形 (10 分)
本題目要求讀入菱形起始字母和菱形的高度,然後輸出空心字元菱形。所謂“空心菱形”是指:每行由兩端為字母、中間為空格的字串構成,每行的字串中心對齊;上半部分相鄰兩行字串長度差2,且字母從給定的起始字母逐一遞增;下半部分與上半部分對稱。
1) 實驗程式碼
#include<stdio.h>
int main(){
int n,i,j,m,k;
char ch;
k=1;
scanf("%c %d",&ch,&n);
getchar();
//printf("%c %d",ch,n);
m=(n+1)/2;
for(i=0;i<m;i++)
{
for(j=0;j<m-i-1;j++){
printf(" ");
}
printf("%c",ch);
if(i==0){
ch++;
printf("\n");
continue;
}
for(j=0;j<2*i-1;j++){
printf(" ");
}
printf("%c",ch++);
printf("\n");
}ch=ch-2;
for(i=n-m;i>0;i--){
for(j=0;j<k;j++){
printf(" ");
}k++;
printf("%c",ch);
for(j=0;j<2*i-3;j++){
printf(" ");
}
if(i==1){
printf("\n");
break;
}
printf("%c\n",ch--);
}
return 0;
}
2) 設計思路
第一步 使用for迴圈輸出空格
第二步 繼續使用for迴圈輸出字元
第三步 考慮特殊情況最中間的那一行字元
3) 本週除錯過程遇到的問題及解決方法
最中間的那一行屬於特殊情況需要特殊考慮
4) 執行結果截圖
題目12-2 跟奧巴馬一起畫方塊 (15 分)
美國總統奧巴馬不僅呼籲所有人都學習程式設計,甚至以身作則編寫程式碼,成為美國曆史上首位編寫計算機程式碼的總統。2014年底,為慶祝“電腦科學教育周”正式啟動,奧巴馬編寫了很簡單的計算機程式碼:在螢幕上畫一個正方形。現在你也跟他一起畫吧!
1) 實驗程式碼
#include<stdio.h>
int main()
{
int i,j;
int n;
char c;
scanf("%d",&n);
getchar();
scanf("%c",&c);
for(i=1;i<=(int)(n/2.0+0.5);i++)
{ for(j=1;j<=n;j++)
{
printf("%c",c);
}
printf("\n");
}
return 0;
}
2) 設計思路
第一步 使用getchar接收字元,使用for迴圈來輸出行數
第二步 再巢狀一個for迴圈來輸出字元
第三步 輸出得到結果
3) 本週除錯過程遇到的問題及解決方法
在看到別人的程式碼時,在使用for迴圈輸出行數時一直不明白別人的式子為什麼要加上那個0.5.通過討論得出,0.5的作用就是四捨五入
4) 執行結果截圖
題目12-3 輸出三角形字元陣列 (15 分)
本題要求編寫程式,輸出n行由大寫字母A開始構成的三角形字元陣列。
1) 實驗程式碼
#include<stdio.h>
int main()
{
int n, count = 0;
scanf("%d", &n);
for (int i = n; i > 0; i--) {
for (int j = 0; j < i; j++) {
printf("%c ", 'A' + count);
count++;
}
printf("\n");
}
return 0;
}
2) 設計思路
第一步 運用for迴圈輸出行數
第二步 巢狀一個for迴圈輸出字母
第三步 在迴圈外界輸出空格
3) 本週除錯過程遇到的問題及解決方法
這道題不是很難,勉強過關
4) 執行結果截圖
題目12-4 閱覽室 (20 分)
天梯圖書閱覽室請你編寫一個簡單的圖書借閱統計程式。當讀者借書時,管理員輸入書號並按下S
鍵,程式開始計時;當讀者還書時,管理員輸入書號並按下E
鍵,程式結束計時。書號為不超過1000的正整數。當管理員將0作為書號輸入時,表示一天工作結束,你的程式應輸出當天的讀者借書次數和平均閱讀時間。
注意:由於線路偶爾會有故障,可能出現不完整的紀錄,即只有S
沒有E
,或者只有E
沒有S
的紀錄,系統應能自動忽略這種無效紀錄。另外,題目保證書號是書的唯一標識,同一本書在任何時間區間內只可能被一位讀者借閱。
1) 實驗程式碼
#include<stdio.h>
int main()
{
int N,n,hh,mm;
scanf("%d",&N);
char c;
for(int i=0;i<N;i++){
int flag[1001]={0},time[1001]={0},sum=0,cnt=0;
while(scanf("%d %c %d:%d",&n,&c,&hh,&mm)) {
if(n==0) break;
if(c=='S'){
time[n]=hh*60+mm;
flag[n]=1;
}
else if(c=='E'){
if(flag[n]==1){
flag[n]=0;
sum+=hh*60+mm-time[n];
cnt++;
}
}
}
if(cnt==0) printf("0 0\n");
else printf("%d %.0f\n",cnt,(double)sum/cnt);
}
}
2) 設計思路
第一步使用for迴圈,一共有N天的記錄,迴圈N次
第二步建立2個數組分別是學號和時間
第三步使用while進行迴圈,並用if來判斷,輸入0,表示結束。接收到字元就從s到E統計時間
3) 本週除錯過程遇到的問題及解決方法
看到題目有點懵逼,但是通過同學的講解,漸漸有了思路
4) 執行結果截圖