一,作業要求:
https://edu.cnblogs.com/campus/hljkj/Cprogramming_2018Autumn_CST2018_4/homework/2502
二,PTA作業
(1):計算機18秋-函數:6-1 統計個位數字
1:實驗代碼:
int Count_Digit ( const int N, const int D ){ int result=0; int i, x,y,z; y=N; z=D; if(y<0) { y=-y; } if(y>0) { for(i=1;i<=9;i++) { x=y%10; y=y/10; if(x==z) { result++; } } } else { result=1; } return result; }
2.解題思路:
(1):
第一步:定義變量 result=0; 定義i,x,y,z;
第二步:將使y=N;z=D;
第三步:判斷y的值是>0或<0或=0
第四步:設置對應判斷下面的值if(y<0);y=-y;
if(y>0) ;x=y%10; y=y/10,輾轉相除法求對應位數的值;
第六步:在y>0的情況下再設定if(x==z);result++;來確定各個部位數字出現的次數;
第七步:設置獨特情況下的result值即y=0;result=1;
第八步:輸出result值並輸出結果。
(2)流程圖:
3.本題調試過程碰到問題及解決辦法
錯誤截圖與斷點:
問題:
(1):由提示可知當N=0,且輸出1的情況沒有考慮,而且在這種情況下嘗試輸入0 0,答案卻是9。思考分析當輸入為0 0時,0出現的次數應該正如提示所指出的1,
(2):sample,數字<0且不連續出現
解決方法:
(1). 所以我設置了利用if進行判斷如果輸入值為0,則直接將1的值返還給result。且在做題時沒有按照順序寫程序導致程序出錯,我先將 if(y>0)寫在前,if(y<0)寫在后當輸入為負數時就直接不執行if(y>0),所以說語句的邏輯順序很重要。
(2).不斷地在if判斷語句和for循環各個中插入printf{“%d”,y)查看輸入值在不同位置的數值變量,找到問題的所在,發現y的正負,是否為0會影響結果於是做了如上設計。
(2),計算機18秋-數組1:7-2 輸出數組元素
1:實驗代碼:
#include<stdio.h> int main(void) { int i,n; int a[10]; int b[10]; scanf("%d", &n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } for(i=0; i<n; i++) { b[i] =a[i+1]-a[i]; } for(i=0; i<n-1; i++) { if((i+1)%3!=0){ if(i==n-2){ printf("%d", b[i]); }else{ printf("%d ", b[i]); } } if((i + 1) % 3 == 0) { printf("%d\n",b[i]); } } return 0; }
2.解題思路:
(1):
第一步:進行函數聲明,定義循環變量i,定義數組a[i],b[i];
第二步:初始化數組a[i];
第三步:使用數組a[i],使b[i] =a[i+1]-a[i],並初始化數組b[i];
第四步:構造b[i]數組的輸出格式,按每行三個元素的格式輸出結果,通過判斷if((i+1)%3==0或!=0)來進行格式的塑造;
第五步:設計在換行的情況下不出現空格:if((i + 1) % 3 == 0);printf("%d\n",b[i])無空格;
第六步:設計在不換時最后一位數后面也不出現空格的情況;在if((i+1)%3!=0)的情況下再進行判斷if(i==n-2);printf("%d", b[i]);無空格
第七步:使用數組b[i];
第八步:輸出結果。
(2):流程圖
3.本題調試過程碰到問題及解決辦法
錯誤截圖與斷點:
遇到問題時:
1.格式錯誤和輸出的個數出錯;
2.滿足三個字符換行設計出現問題;
3.不滿三個數字的時候最后一位數后面空格出錯錯誤;
解決方法:
1.翻閱書本查閱書籍,翻看老師上課留下的ppt和設計文本;學到了一些技巧在需要設置空格的那一處設置顯眼特殊的標志‘*’進行觀察 ,以此分析是否出現了空格,進行正確的程序設定;
2.仔細審題發現輸出的數應該比輸入的數少一項,設定循環減少一次;
3.利用if(i==n-2)進行判斷是否到了最后一項對最后一項的輸出進行特殊處理不輸出空格。
(3),計算機18秋-數組2:7-4 選擇法排序
1:實驗代碼:
# include <stdio.h> int main(void) { int i,index,k,temp; int a[10]; for(i = 0; i<10; i++) { scanf("%d", &a[i]); } int cnt=0; for(k = 0; k<10-1; k++){ index = k; for(i = k + 1; i<10; i++) { if(cnt<3){ if(a[i] < a[index]) { index = i; cnt++; } } else{ break; } } temp = a[index]; a[index] = a[k]; a[k] = temp; } for(i = 0; i<10; i++) { printf("%5d", a[i]); } printf("\n"); return 0; }
2.解題思路
(1):
第一步:進行函數聲明,定義循環變量i,k,最小下標index,臨時變量temp;,定義數組a[10];
第二步:初始化數組a[10];
第三步:定義計算次數 cnt=0,來計下排序的輪數;
第四步:用選擇法對10個整數按升序排序,循環比較數的大小,並依次排序;
第五步:在選擇排序法中插入計數變量cnt,來判斷排序的輪數if(cnt<3),則繼續執行下面程序排序;else,break,跳出循環;
第六步:使用數組a[i];
第七步:輸出結果。
(2):流程圖:
3.本題調試過程碰到問題及解決辦法
錯誤截圖與斷點:
遇到的問題
1.起初沒有在第一個大循環給index在每一次循環后定義新的初值即index = k;導致前幾位數正確后幾位發生錯亂;
2.剛開始的時候沒有考慮到排序的輪數;
2.排序三次后循環終止時break的位置不對,起初放在大的循環下面但是結果不對;
解決方法:
(1):通過在各個循環中插入printf("%d",index)來檢查index的值最后發現了這個問題將index=k;放在第一個大循環的下面第二個小循環的上面;
(2):反復審題后了解到只排序三輪所以設計一個計數量cnt再用if判斷排序次數是否到了三次;
(3):利用插入printf在各個循環里面檢查變量是否正確,發現只有插入到小的循環里才能運行出正確答案;輸入的空格字符有五個字符 翻閱書籍,了解利用5%d可以進行設定空格長度;
三,個人總結:
(1):學習內容
數組
1.一維數組的定義與使用。
2.區分數組的定義和數組元素 的引用
3.學會使用一堆數組編程;計算fibonacci數列
;數組的查詢;選擇排序法;冒泡排序法;二分法查找
5.數組的內存結構;學習使用一維數組進行編程
6.矩陣與二維數組:方陣轉置;日期的計算
收獲:1.對數組的理解更加的深刻,更深層次學會到數組的定義,初始化,運行與使用
2.博客園,pta作業做起來更加得心應手,流程圖畫的准確。
3.對c語言的了解更加的加深了,運用的更到位
4.對各種c程序了解的更加深刻,運用越發自如。
1.遇到問題時難以正確的對數組進行正確的程序設計;
2.二維數組的設計與運用相對比較困難,較為復雜;
3.方陣與數組的混合運用比較復雜,數組的轉置還是令人頭暈目眩;
措施:
1.對上課所學習的知識進行反復鞏固與復習;
2.與同學進行交流,分享自己的見解;
3.在mooc上學習視頻並在討論區交流;
4.上網搜索相關資料,在博客園中學習;
5.不斷地在pta中反復訓練與加強理解。
周數 | 周代碼行數(行) | 周代碼時長(時) | 周寫博客字數 | 周寫博客時長(時) | 累積周代碼行數 | 累積博客字數 | 累計代碼時長(時) | 累積博客時長(時) |
第14周 | 900 | 6 | 400 | 1 | 900 | 400 | 6 | 1 |
第15周 | 1000 | 7 | 300 | 2 | 1900 | 700 | 13 | 3 |
第16周 | 1100 | 8 | 100 | 1.5 | 3000 | 800 | 21 | 4.5 |
第17周 | 1000 | 6 | 1000 | 12 | 4000 | 1800 | 27 | 16.5 |