作業要求二
題目6-1 計算兩數的和與差
1.設計思路
(1).描述算法:
第一步:閱讀題目,明確題意要求。
第二步:找到對應函數中的實參和形參並寫出函數接口。
第三步:計算出`op1+op2`的值,並將其賦給`*psum`所指向的變量。
計算出`op1-op2`的值,並將其賦給`*pdiff`所指向的變量。
(2).流程圖
2.實驗代碼
void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
*psum=op1+op2;
*pdiff=op1-op2;
}
3.本題調試過程碰到問題及解決辦法
錯誤信息:編譯錯誤
錯誤原因:在賦值語句后忘記加“;”
改正方法:賦值語句后加“;”
題目6-2 拆分實數的整數與小數部分
1.設計思路
(1).描述算法:
第一步:閱讀題目,明確題意要求。
第二步:找到對應函數中的實參和形參並寫出函數接口。
第三步:將`x`強制轉化成`int`類型,獲取整數部分的值然后賦值給`*intpart`所指向的變量
第四步:將原數減去整數部分,獲取小數部分的值然后賦值給` *fracpart`所指向的變量。
(2).流程圖
2.實驗代碼
void splitfloat( float x, int *intpart, float *fracpart )
{
*intpart=(int)x;
*fracpart=x-*intpart;
}
3.本題調試過程碰到的問題和解決辦法
錯誤信息:答案錯誤
錯誤原因:沒有將`x`強制轉化為整形類型
改正方法:`*intpart=(int)x`;在x前加一個強制轉化類型(`int`),然后再把值賦給指針`*intpart`
題目6-1(2)在數組中查找指定元素
1.設計思路
(1).描述算法:
第一步:閱讀題目,明確題意要求。
第二步:找到對應函數中的實參和形參並寫出函數接口。
第三步:定義一個變量`i`,然后進行一個`for`循環,對數組中所有的元素與指定元素`x`進行判斷。
第四步:若相等,輸出下標;若不存在,輸出`Not found`。
(2).流程圖
2.實驗代碼
int search( int list[], int n, int x )
{
int i;
for(i=0;i<n;i++)
{
if(list[i]==x)
return i;
}
return -1;
}
3.本實驗調試過程碰到的問題和解決辦法
錯誤信息:編譯錯誤
錯誤原因: 用主函數中的`a[i]`去和`x`做判斷是否相等。
改正方法:應該判斷調用函數中的`list[i]`是否與`x`相等。
題目6-2(2)找最大值及其下標
1.設計思路
(1).描述算法:
第一步:閱讀題目,明確題意要求。
第二步:找到對應函數中的實參和形參並寫出函數接口。
第三步:先將首元素的值賦給`max`,再用`for`循環對每兩個元素進行大小判斷;
第四步:找出最大值,賦給`max`並將其下標存如`*b`所指的變量里。
(2).流程圖
2.實驗代碼
int fun(int *a,int *b,int n)
{
int max = *a;
int i;
for(i=1;i<n;i++)
{
if(*(a+i)>*a)
{
max=*(a+i);
*b=i;
}
}
return max;
}
3.本實驗調劑過程中碰到的問題和解決辦法。
錯誤信息:編譯錯誤
錯誤原因:做比較判斷應該是同類型做判斷,而我卻用一個地址和一個數值做大小比較。
改正方法:將`(a+i)>*a`改為`*(a+i)>*a`。
題目6-2(3)指針選擇法排序
1.設計思路
(1)描述算法:
第一步:閱讀題目,明確題意要求。
第二步:找到對應函數中的實參和形參並寫出函數接口。
第三步:第一趟,在這組數據中選中最大的那個,將它與第一個數字經行交換。依次類推。
第四步:使有序序列不斷減小知道全部排序完。
(2)流程圖
2.實驗代碼
void sort(int *x,int n)
{
int t,i,j;
for(i=0;i<(n-1);i++)
{
for(j=0;j<(n-i-1);j++)
{
if(x[j]<x[j+1])
{
t=x[j];x[j]=x[j+1];x[j+1]=t;
}
}
}
}
3.本實驗調劑過程中碰到的問題和解決辦法。
錯誤信息:編譯錯誤
錯誤原因:將選擇排序法做成了冒泡排序
改正方法:區分冒泡與選擇排序的區別。
6-1(4)判斷回文字符串
1.設計思路
(1).描述算法:
第一步:閱讀題目,明確題意要求。
第二步:找到對應函數中的實參和形參並寫出函數接口。
第三步:以每組數據(x)的中間數為對稱軸(單數,以中間數字;雙數,分成兩部分),分別將兩側的數字經行比較。
第四步:若每對數字相等,i++,知道i=x/2,若不等跳出循環。
(2)流程圖:
2.實驗代碼
bool palindrome( char *s )
{
int x=strlen(s),i;
for(i=0;i<(x/2);i++)
{
if(s[i]!=s[x-(i+1)])
{
return false;
}
}
if(i==(x/2))
{
return true;
}
}
3.本實驗調劑過程中碰到的問題和解決辦法。
錯誤信息:部分答案錯誤。
錯誤原因:在 `if(s[i]!=s[x-(i+1)])`后加了break;
改正方法:不用加break,直接在 `if(s[i]!=s[x-(i+1)])`成立后返回false。
6-2(4)使用函數實現字符串部分復制
1.設計思路
(1).描述算法:
第一步:閱讀題目,明確題意要求。
第二步:找到對應函數中的實參和形參並寫出函數接口。
第三步:統計字符串中的字符數量。
第四步:判斷m是否超過字符串的長度。
(2).流程圖
2.實驗代碼
void strmcpy( char *t, int m, char *s )
{
int i,count=0;
for(i=0;t[i]!='\0';i++)
{
count++;
}
if(m>count)
{
s[0]='\0';
}else{
for(i=0;t[m-1]!='\0';i++,m++)
{
s[i]=t[m-1];
}
s[i]='\0';
}
}
3.本實驗調劑過程中碰到的問題和解決辦法。
這個題是王文博教給我的。自己重寫的時候,沒有遇到什么問題。
方法二:
void strmcpy( char *t, int m, char *s )
{
int i,j,len;
strcpy(s,t);
len = strlen(s);
for(i=m-1;i>0;i--)
{
for(j=i;j<len;j++)
{
*(s+j-1)=*(s+j);
}
}
*(s+len-m+1)='\0';
}
描述算法:
第一步:閱讀題目,明確題意要求。
第二步:找到對應函數中的實參和形參並寫出函數接口。
第三步:通過外層循環找到需要復制字符之前的字符,通過內循環遍歷將需要復制的第一個字符及其之后的字符全部向前移。
第四步:最后將字符串的最后一個元素賦值為'\0' ,輸出字符串。
作業要求三
1.總結。
(1).最顯而易見的進步是,對函數部分的學習有了很大的進步。上學期函數部分幾乎沒學會,而這學期通過寫這次博客作業,函數部分我幾乎都明白了,很開心
(2).掌握了流程圖的畫法。
(3).即便有的題不能獨立完成,但能夠漸漸看懂別人的方法和代碼。
(4).對指針有了初步的認識,老師上課講的那些東西也明白了,但還是不太會運用。
(5).有些題能夠找到思路,也能夠想到解決辦法,但變不成代碼,這可是現在最大的問題。
總之,就是寫博客真的給我帶了很大的幫助,即便花的時間可能過長,但感覺這兩周真的有進步,而不是一味的抱怨不會,然后又不知道該怎么做。很開心。
2.git托管平台。
https://github.com/Vinecy666/C-