C語言博客作業


一、PTA實驗作業

題目1:打印菱形圖案

1. 本題PTA提交列表

2. 設計思路

定義整型變量n存放輸入總行數,i控制部分行數,j控制空格數量,k控制'*'數量,half存放中間行數,划分上下部分
輸入一個奇數n
half=(n+1)/2;//half存放中間行數,用來划分上下部分
如果(n!=1)
上半部分:
i=1;i<=half;i++
j=n-2*i+1;j>=1;j--,輸出空格
k=1;k<=2*i-1;k++,輸出‘*’
換行
下半部分:
i=1;i<=(n-1)/2;i++
j=1;j<=2*i;j++,輸出空格
k=n-2*i;k>=1;k--),輸出‘*’
如果(i!=(n-1)/2)則換行,最后一行不再換行
否則 輸出"* "

3.代碼截圖

4.本題調試過程碰到問題及PTA提交列表情況說明。

部分正確:這題上半部分規律很快就找到圖形也輸出正確了,但是下半部分調試了好久才做出來。比照了上次做的那道不完全相同的菱形題,但是上次那題的下半部分也沒有完全理解清楚,一直找不到下半部分空格數和行數的規律。想接着上面的行數按對稱找規律結果一直輸出成,后來下半部分i從1開始結果輸出成

少了一個空格,j改成從1開始答案對。

題目2:掉入陷阱的數字

1. 本題PTA提交列表

2. 設計思路

定義變量one存放個位數的數值,N為輸入數據,sum為各位數之和,a存放前一個數,i存放第幾個數,number存放運算后結果
輸入N
i=1;i!=0;i++
a=N備份N
while(N)
one=N%10;先取出個位
N=N/10;再划掉個位
sum+=one;最后求各位累加和,循環直到N為0
number=sum*3+1;操作產生的新數字number
輸出第幾個數和運算后結果
if(number==a),退出循環
N=number;//新一輪N為number
sum=0使其初始化

3.代碼截圖

4.本題調試過程碰到問題及PTA提交列表情況說明。

一開始這樣寫輸出結果不對,調試發現大循環這樣判斷有問題,詢問同學后改成for語句的循環,先判斷完兩數是否相同,相同則退出循環,不同則給N賦新值的思路。

題目3:切分表達式——寫個tokenizer吧

1. 本題PTA提交列表

2. 設計思路

定義數組長度,為41!
定義i,j控制循環
定義item存放下標i的值
gets(ch); //輸入字符串
for(i=0;ch[i]!='\0';i++){
if(ch[i]>='0'&&ch[i]<='9'){ //是數字時
tem=i; //儲存下標i的值
while('0'<=ch[i]&&ch[i]<='9'||ch[i]=='.')i++;
for(j=item;j<i;j++)printf("%c",ch[j]);//可連續輸出數字!
i--;
輸出完最后一個數字后換行
else if(ch[i]=='-'){//'-'時
if('0'<=ch[i-1]&&ch[i-1]<='9'||ch[i+1]=='('){
printf("%c\n",ch[i]);} //減號
else printf("%c",ch[i]);} //負號
else if(ch[i]=='+') { //'+'時
if(i==0)printf("%c",ch[i]); //第一個符號為‘+’,一定為正號
else printf("%c\n",ch[i]); } //加號
else{printf("%c\n",ch[i]);//輸出括號

3.代碼截圖

4.本題調試過程碰到問題及PTA提交列表情況說明。

寫了好幾個小時的這個代碼(錯誤)在檢驗的時候換行還是有問題,PTA總是顯示多種錯誤很崩潰,實在是不太會,最后上網找了答案。一開始只知道這個循環(如下圖)大概的目的是實現多個數字的連續輸出,一步步調試發現i++在統計有幾個數字並輸出,方法特別巧妙。提交代碼最后一個測試點還是不過,問了班級大佬直到問題在數組長度的定義上,長度上界要到41否則ch[i+1]就無法判斷,越界很危險,上界定義應該要大些。(注意!),修改后終於通過。

二、截圖本周題目集的PTA最后排名。

三、本周學習總結

1.你學會了什么?

1.1 一維數組如何定義、初始化?

  • 定義:數組類型 數組名[數組長度];數組長度是一個常量
  • 初始化:類型名 數組名 [數組長度]={初值表},例如inta a[10]={1,2,3,4,5,6,7,8,9,10};特別的,靜態存儲的數組如果沒有初始化,系統自動給所有的數組元素賦0

1.2 一維數組在內存中結構?可畫圖說明。數組名表示什么?

  • 數組名是一個地址常量,存放數組內存空間的首地址

1.3 為什么用數組?

  • 在程序中使用數組,可以讓一批相同類型的變量使用同一個數組變量名,用下標來互相區分,他的優點是表達簡潔,可讀性好,便於數據的重用。

1.4 介紹選擇法、冒泡法、直接插入排序如何排序?偽代碼展示.

  • 選擇法:
    1.int a[n];//先給數組賦值,數組長度為n
    2.for(k=0;k<n-1;k++) index=k;最小值下標為k循環第三步
    3.for(i=k++;i<n;i++)循環第四步
    4.如果a[i]小於最小值,則最小值與下標為k的值交換
    5.輸出數組

  • 冒泡法:兩兩比較待排序的數,發現兩個次序相反即進行交換,直到沒有反序為止。
    1.定義變量int a[10],i,j,k
    2.for(i=0;i<10;i++) 依次輸入數據存入數組
    3.for(i=0;i<9;i++) 循環第四步
    4.for(j=0;j<10-i;j++)循環
    5.if(a[j]>a[j+1]) 則交換這兩個數即k=a[j];a[j]=a[j+1];a[j+1]=k;
    6.for(i=0;i<10;i++) 依次輸出a[10]中每個數

  • 直接插入法:
    1.先給數組賦值,n為數組長度
    2.for(k=0;k<n-1;k++) index=k;最小值下標為k循環第三步
    3.for(i=k++;i<n;i++)循環第四步
    4.如果a[i]小於最小值,則最小值與下標為k的值交換
    5.輸出數組

1.5 介紹什么是二分查找法?它和順序查找法區別?

  • 二分法:
    1.確定該區間的中點位置
    2.將待查的K值與a[mid]比較
    3.若相等,則查找成功
    4.若a[mid]>K,則新的查找區間是a[1-(mid-1)]
    5.若a[mid]<K,則新的查找區間是a[(mid+1)-n]

  • 順序查找:從表的一端開始,順序掃描線性表,依次將掃描到的結點關鍵宇和給定值K相比較。若當前掃描到的結點關鍵字與K相等,則查找成功;若掃描結束后,仍未找到關鍵字等於K的結點,則查找失敗。

  • 區別:當查找數列是有序的話,使用二分查找法可以極大的減少搜索時間,提高效率;順序查找法可以查找無規律的數列,但是需要耗費大量的時間和內存逐個搜索關鍵詞。

1.6 二維數組如何定義、初始化?

  • 定義:二維數組定義的一般形式是: 類型說明符 數組名[常量表達式1][常量表達式2],其中常量表達式1表示第一維下標的長度,常量表達式2 表示第二維下標的長度。(行列)
  • 初始化:二維數組初始化也是在類型說明時給各下標變量賦以初值。二維數組可按行分段賦值,也可按行連續賦值。

1.7 矩陣轉置怎么實現?方陣中:下三角、上三角、對稱矩陣的行標i列標j的關系?請說明。

矩陣轉置:以主對角線為對稱軸,將所有元素互換位置

  • //求a的轉置矩陣,結果存於b中。
    int i,j;
    int a[c][d], int b[d][c];//c,d為任意值
    for(i = 0; i <c; i ++)
    for(j = 0; j < d; j ++)
    b[j][i] = a[i][j];//轉置運算。

  • 下三角:i>=j
  • 上三角:i<=j
  • 對稱矩陣:i==j

1.8 二維數組一般應用在哪里?

  • 二維數組一般應用在二維表和矩陣中.

2.本周的內容,你還不會什么?

  • 對輸入一串字符,字符切分或者算字符個數的題不熟悉,這類型的題經常要寫好幾個小時,思路不清晰,可能還需要多寫一些這類題來熟悉套路
  • 數組運用還是不太熟練,這周的PTA題目有的開始想要用數組寫,但是寫着寫着經常進入死循環又找不到錯誤,又換成不用數組的方式寫
  • 位運算符還不熟悉,每次都要看書參考
  • 二維數組和函數的調用還不熟悉,課堂上的互動那題函數調用了過多變量,效率低
  • 解題的時候速度很慢,思路不清晰,考試的時候時間掌握不好,寫不完題目,並且對於選擇基礎題的很多知識點很模糊,需要好好熟悉掌握知識點
  • 對於數組的三種排列方法還不是特別理解
  • 剛接觸不太會寫偽代碼

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



C語言博客作業 C語言博客作業 C語言博客作業 C語言博客作業 C語言博客作業 C語言博客作業 c語言博客作業 C語言博客作業 C語言博客作業 C語言博客作業
 
粤ICP备14056181号  © 2014-2021 ITdaan.com