一、PTA實驗作業
題目1:7-4 打印菱形圖案
本題要求編寫程序,打印一個高度為n的、由“”組成的正菱形圖案。
輸入格式 : 輸入在一行中給出一個正的奇數n。
輸出格式 : 輸出由n行星號“”組成的菱形,如樣例所示。每個星號后跟一個空格。
1. 本題PTA提交列表

2. 設計思路
上半部分
- 1、定義變量i實現行數的循環,j實現空格的循環,K實現 * 的循環 ,m,n ;
- 2、數的輸入:scanf("%d",&n);
- 3、取奇數且保證為正數;
- 4、進入for外循環 實現前(n/2)+1行,即輸出至中間行 for(i=1;i<=n/2+1;i++);
- 5、內循環實現空格 (j=((n/2)+1-i)*2;j>=1;j--);
- 6、繼續嵌套循環for(k=1;k<=(2*i)-1;k++)實現 * 輸出;
- 7、記得換行: printf("\n");
下半部分
- 8、繼續重復實現后面幾行for(i=1;i<=n/2;i++)
- 9、防止后面多出一行空格,先判斷: if(i!=1) printf("\n");
- 10、接下來的同上;
3.代碼截圖

4.本題調試過程碰到問題及PTA提交列表情況說明
- (1)一開始的思路錯誤,不懂的怎么實現前面空格,解決:需要找出行數 i 與空格關系;

- (2)格式錯誤&修改錯誤,跟題目要求不一致,多次改動,加星號之間的空格,然后在最后一行應該是沒有空行的,所以要把下半部分,最后面的printf(“\n”)放到for的最開始,否則會從下半部分就出現換行,多空出一行;


題目2:7-5 BCD解密
BCD數是用一個字節來表達兩位十進制的數,每四個比特表示一位。所以如果一個BCD數的十六進制是0x12,它表達的就是十進制的12。但是小明沒學過BCD,把所有的BCD數都當作二進制數轉換成十進制輸出了。於是BCD的0x12被輸出成了十進制的18了!
現在,你的程序要讀入這個錯誤的十進制數,然后輸出正確的十進制數。提示:你可以把18轉換回0x12,然后再轉換回12。
1. 本題PTA提交列表

2. 設計思路

3.代碼截圖

4.本題調試過程碰到問題及PTA提交列表情況說明
- (1)題目理解出錯,根據提示先把18轉換回十六進制0x12,然后再轉換回十進制12,結果出錯;

- (2)進制間的轉換不對,在上一個問題基礎上進行修改,反而更亂,再進行計算發現在第一步就已經轉換成了12,不需要再變,否則相當於沒轉;

題目3:7-10 簡單計算器
模擬簡單運算器的工作。假設計算器只能進行加減乘除運算,運算數和結果都是整數,四種運算符的優先級相同,按從左到右的順序計算。
輸入格式: 輸入在一行中給出一個四則運算算式,沒有空格,且至少有一個操作數。遇等號”=”說明輸入結束。
輸出格式: 在一行中輸出算式的運算結果,或者如果除法分母為0或有非法運算符,則輸出錯誤信息“ERROR”。
1. 本題PTA提交列表

2. 設計思路

3.代碼截圖

4.本題調試過程碰到問題及PTA提交列表情況說明
- 答案錯誤,輸不出任何值


-答案只滿足輸出樣例,改為其他數就是錯誤的;

- 修改多次,仍為部分正確,規定時間內沒法改正確;
二、截圖本周題目集的PTA最后排名

三、本周學習總結
1.你學會了什么?
1.1 一維數組如何義、初始化?
一維數組的初始化:在編譯階段進行,不占用運行時間;
- 一維數組定義的一般形式是:類型名 數組名 [數組長度];
- 一維數組的初始化:類型名 數組名 [數組長度] ={ 初值表 };如:a [ 5 ] ={1,2,3,3,4}; static char ch [ 3 ]= {'p','q','q'};給部分元素賦值 static int a [ 5 ] = {7,6};
1.2 一維數組在內存中結構?可畫圖說明。數組名表示什么?
- 數組存儲:系統為數組分配內存中的一片連續的存貯單元,各元素按下標從小到大的順序排列;
- 一維數組在內存中結構:具體見大一C語言課本149-150頁;
- 數組名是一個地址常量,存放數組內存空間的首地址;
a
4010 4012 4014 4016 4018 4020 4022 4024 4026 4028 內存地址
9 8 7 6 5 4 3 2 1 0 下標
值
1.3 為什么用數組?
- 數組是可以在內存中連續存儲多個元素的結構數組中的所有元素必須屬於相同的數據類型;
- 減少內存占用、代碼定義變量;
1.4 介紹選擇法、冒泡法、直接插入排序如何排序?偽代碼展示.
選擇法:找個最小值min,后續比較比min小就交換;
- 1、定義數組 a [ i ];
- 2、起始:for( i =0 ;i < n - 2;i++);
- 3、下標為 i 的值設為最小值min
- 4、 :數組進行循環 for i = 2 to n-2 ,如果 a [ i ] < min ,則 a [ i ] = min;
- 5、 重復循環進行比較;
- 6、 min的值賦給a [ i ],返回1;
冒泡法:每次排序時,從下往上查看,若發現順序錯誤,則交換位置,在第 ( n-1) 趟排序完成后,所有的數字都按順序排列完畢,較大的數放在后面;
- 1、定義數組 a [ i ];
- 2、數組起始下標:for ( i=0 ;i< n-3;i++)
- 3、:數組進行循環,for i=0 to n-2 ,如果 a [ i ] > a [ i + 1] ,則交換 a [ i ] 與 a [ i +1];
- 4、每次兩個數字之間的交換需要三次的操作;
直接插入法:循環尋找插入的位置,將原來數組 a [ i ] 所對應的值變成插入的值,后面數組 a [ i+1 ] 對應原先數組 a [ i ] 的值;
- 1、定義數組 a [ i ];
- 2、起始:for( i =0 ;i < n - 2;i++);
- 3、數組進行循環 for i = 2 to n-2 ,從第二個數開始與前一個數進行比較;若前一個數小,則交換到前一個位置;
- 4、重復步驟3,直到該數前面沒數字或者前一個數比它大;
1.5 介紹什么是二分查找法?它和順序查找法區別?
二分查找法又稱折半查找,充分利用了元素間的次序關系,它的基本思想是;將n個元素分成大致相等的兩部分,取a[n/2]與x做比較,如果x=a[n/2],則找到x,算法中止;如果x<a[n/2],則只要在數組a的左半部分繼續搜索x,如果x>a[n/2],則只要在數組a的右半部搜索x;
與順序查找法區別:
- 二分法只用於數據按順序排列,相比於順序法效率會高,減少了比較和移動的次數,降低了復雜程度;而順序法可用於無規律數據的查找,效率較低;
- 二分法所占空間內存比順序法小;
1.6 二維數組如何定義、初始化?
- 二維數組定義的一般形式是:類型名 數組類型 數組名[數組行長度][數組列長度]
- 二維數組初始化一般形式是:類型名 數組類型 數組名[數組行長度][數組列長度]={ { 初值表1},···,{ 初值表k},···};
1.7 矩陣轉置怎么實現?方陣中:下三角、上三角、對稱矩陣的行標i列標j的關系?請說明
- 定義轉置前數組 a [ i ][ j ],數組的行下標與列下標互換,即 i 與 j 互換,即可實現矩陣轉置;
轉置前:
- 上三角:i > = j;
- 下三角:i < = j;
轉置后:
- 上三角:i < = j;
- 下三角:i > = j;
- 對稱矩陣:a [ i ] [ j ] ==a [ j ] [ i ];
1.8二維數組一般應用在哪里 ?
- 一個是問題中需要用到行、列的地方,使用二維數組比較方便;
- 二是可以應用於描述表示方陣或矩陣上;
2.本周的內容,你還不會什么?
int main(void){
float s[6]={1,3,5,7,9};
float x;
int i;
scanf("%f",&x);
for(i=4;i>=0;i--)
if(s[i]>x) s[i+1]=s[i];
else break;
printf("%d\n",i+1);
return 0;
寫出下列程序的運行結果:
- (1)如果輸入4,則輸出 5 4
- (2)如果輸入5,則輸出 3 5 4
- 這題答案出錯,加上這次的期中考試,發現在閱讀程序這一塊還不夠,需要加強;
- 對於數組,在定義時,及應用都還不熟悉;
- 對於數據類型,在練習運算,包括優先級等問題;
- 還有寫程序時,盡量精簡內容,要多使用類似於flag 這類的符號語言,減少復雜度;
