PTA第一次做業html
第一題:計算兩個數的和與差。
1 設計思路
(1)主要描述題目算法
第一步:閱讀題目與函數。
第二步:先定義四個標識符a,b,sum,diff,對a,b賦值,而後把a的值給op1,把b的值給op2,將sum的地址給psum,將diff的地址給pdiff,而後輸出兩個數的和與差。
第三步:輸出兩數的和與差。
第四步:a+b是兩個數的sum,a-b是兩個數的差,所以在調用函數sum_diff中兩個數的和psum等於op1+op2,兩個數的差diff等於op1-op2。git
void sum_diff( float op1, float op2, float *psum, float *pdiff ){*pdiff=op1-op2; *psum=op1+op2; }
(2)本題調試過程碰到問題及解決辦法算法
無編程
第二題:拆分實數的整數與小數部分數組
(1). 主要描述題目算法函數
第一步:閱讀題目並瞭解函數及其定義。學習
第二步:找到對應函數中的實參和形參。.net
第三步:將X分爲整數而後賦值給intpart,用x減去整數就是小數部分,而後將小數部分的值賦值給fracpart.設計
void splitfloat( float x, int *intpart, float *fracpart ) { *intpart=(int)x; *fracpart=x-*intpart; }
(2)本題調試過程碰到問題及解決辦法3d
問題:沒有把x轉化爲整型。
改正方法:轉化以後再賦給*intpart。
PTA第二次做業
第一題:在數組中查找指定元素
(1). 主要描述題目算法
第一步:閱讀題目並瞭解函數及其定義,找到對應函數中的實參和形參並寫出函數接口。
第二步:用變量i來遍歷數組,若是有list[]==x的狀況就表明了這個元素爲了防止屢次遍歷。
第三步:而後把數組中全部的元素與指定元素x進行判斷,若是不符合要求return -1若是隻要有一個符合要求就return i。
int search( int list[], int n, int x ) { int i; int subscript = 0; for(i=0;i<n;i++) { if(list[i]==x) { subscript=1; return i; break; } } if(subscript==0) return -1; }
(2)流程圖
(3)本題調試過程碰到問題及解決辦法
遍歷概念不太清楚致使本身編譯不少遍才所有正確,之後要多學多練。
第二題:尋找最大值及其下標
(1). 主要描述題目算法
第一步:閱讀題目並瞭解函數及其定義
第二步:先定義變量i而後利用變量遍歷數組。
第三步:而後定義一個最大值
int fun(int *a,int *b,int n) { int i; int max=a[0]; for(i=0;i<n;i++) { if(max<a[i]) { max=a[i]; *b=i; } } return max; }
(2)流程圖
(3)本題調試過程碰到問題及解決辦法
指針使用錯誤,數值和地址弄混。
*和&使用錯誤
PTA第三次做業
第一題:最小數放前最大數放後
(1). 主要描述題目算法
第一步:閱讀題目並瞭解函數及其定義,定義接口函數。
第二步:找到對應函數中的實參和形參。
第三步:用for循環尋找出最大值與第一個數交換
(2)流程圖
(3)實驗代碼
void input(int *arr,int n){ int i; for(i=0;i<n;i++){ scanf("%d",arr+i); } } void max_min(int *arr,int n){ int min=arr[0],max=arr[0]; int i,temp; int q=0,w=0; for(i=0;i<n;i++){ if(min>*(arr+i)){ min=*(arr+i); q=i; } if(max<*(arr+i)){ max=*(arr+i); w=i; } } temp=*(arr+0);*(arr+0)=*(arr+q);*(arr+q)=temp; temp=*(arr+n-1);*(arr+n-1)=*(arr+w);*(arr+w)=temp; } void output(int *arr,int n){ int i; for(i=0;i<n;i++){ printf("%3d",*(arr+i)); } }
(4)本題調試過程碰到問題及解決辦法
無
第二題:指針選擇法排序
(1). 主要描述題目算法
第一步:閱讀題目並瞭解函數及其定義,定義接口函數。
第二步:定義兩個for循環.而後把數組第一個元素小標0定爲最大值
第三步:判斷數組中是否存在比arr+max大的數,假若有則記錄它的角標,而後把小標賦值給max.
第四步:在for循環裏判斷數組小標和最大值max小標是否相同,若是不一樣,則交換倆數的小標。
第五步:用第一個數與最大值交換
(2)流程圖
(3)實驗代碼
void sort(int *x,int n) { int q=0,b=0,temp=0,maxium=0; for(q=0;q<n-1;q++) { maxium=q; for(b=q;b<n;b++) { if(*(x+maxium)<*(x+b)) { maxium=b; } } if(maxium!=q) { temp=*(x+maxium); *(x+maxium)=*(x+q); *(x+q)=temp; } } }
PTA第四次做業
第一題:判斷迴文字符串
(1). 主要描述題目算法 第一步:閱讀題目並瞭解函數及其定義,定義接口函數。
第二步:找出形參實參
第三步:用迴文法求出字符串長度
第四步:用for循環比較出第一個和最後一個字符一不同
(2)流程圖
(3)實驗代碼
bool palindrome( char *s ) { int x,i,cnt=0; x=strlen(s); for(i=0;i<x/2;i++) { if(s[i]==s[x-1-i]) { cnt++; } } if(cnt==x/2) { return true; }else { return false; } }
(4)本題調試過程碰到問題及解決辦法
編譯錯誤
地址符忘記加*(基本錯誤)
第二題:使用函數實現字符串部分複製
(1). 主要描述題目算法
第一步:閱讀題目並瞭解函數及其定義,定義接口函數並找出形參實參。
第二步:調用函數strmcpy,而後再把函數i,a循環
第三步:結束
(2)流程圖
(3)實驗代碼
void strmcpy(char *t,int m,char *s) { int i; int sum=0; for(i=0;t[i]!='\0';i++) {sum++;} if(sum<m) {s[0]='\0';} else { for(i=0;t[m-1]!='\0';i++,m++) { s[i]=t[m-1]; } s[i]='\0'; } }
(4)本題調試過程碰到問題及解決辦法
編譯錯誤
‘\0'也佔一個字符須要*(s+a) = '\0'才能夠執行
學習總結
(1)在這兩週中對於指針的知識理解不透徹,本身也在看mooc彌補。還有就是編程時間較少,有些手生,打起代碼不流暢。
(2)點評網址
(3)託管代碼
(4)表格