第一次作業


6-1 計算兩數的和與差(10 分)

1.案例描述

需要寫一個被題干調用的函數,被調用函數的作用是計算兩個數的和與差,根據“函數接口定義”確定了變量,op1和op2是輸入的兩個實數,psum和pdiff是計算得出的和與差。

2.算法設計

(1)根據題干給*psum、 *pdiff賦值

3.流程圖

4. [代碼]

(https://github.com/dangrui/dangrui.git)

void sum_diff( float op1, float op2, float *psum, float *pdiff )
{
  *psum = op1+op2;
  *pdiff = op1-op2;
}

5.問題與解決方法

再調用函數中,此句后邊加了分號void sum_diff( float op1, float op2, float *psum, float *pdiff )
在之前已經被聲明了,不能重復聲明。

6-2 拆分實數的整數與小數部分(15 分)

1.案例描述

需要寫一個被題干調用的函數,被調用函數的作用是將這個數的小數和整數部分分開,根據“函數接口定義”確定了變量,x, intpart, fracpart其中x是被拆分的實數(0≤x<10000),intpart和fracpart分別是將實數x拆分出來的整數部分與小數部分。

2.算法設計

(1)將定義的float類型的X強制轉換成int型取整
(2)取得整數部分后用X - 整數部分 = 小數部分

3.流程圖

4.代碼

(https://github.com/dangrui/dangrui.git)

void splitfloat( float x, int *intpart, float *fracpart )
{
  *intpart = (int)x;
  *fracpart = x - *intpart;
}

5.問題與解決方法

開始認為取余便可得到整數部分*intpart = x%10 -*fracpart;無效操作數的二進制%(有“浮”和“int”)
之后又把程序改為*intpart = (int)x%10 -*fracpart;結果只有個位數的數字才有用十位以上就不對了
之后遍去百度“如何取整”得到答案---[x]或INT(x)---

6-1 在數組中查找指定元素(15 分)

1.案例描述

需要寫一個被題干調用的函數,被調用函數的作用是在輸入的一串數字中查找指定元素,根據函數接口int search( int list[], int n, int x );進行編譯,確定輸出結果。

2.算法設計

(1)做一個循環將所有的數查找一遍。
(2)用if語句進行判斷,如果找到則函數search返回相應元素的最小下標(下標從0開始),否則返回−1。

3.流程圖

4.代碼

(https://github.com/dangrui/dangrui.git)

int search(int list[],int n,int x)     //如果找到一樣的值,返回下標,下標是從0開始的,所以返回值不加1
{
    int i;//i最小下標
    for(i = 0;i <= n;i++)
    {
        if(list[i] == x)
            return i;
    }
    return -1;
}

6-2 找最大值及其下標(10 分)

1.案例描述

需要寫一個被題干調用的函數,被調用函數的作用是找出輸入的數字中最大數及其下標,根據函數接口int fun(int *a,int *b,int n);進行編譯,確定輸出結果。

2.算法設計

(1)將max的初始值定為*a
(2)定義一個循環找出最大值
(3)將最大值賦給max
(4)將下標i賦給b

3.流程圖

4.代碼

(https://github.com/dangrui/dangrui.git)

int fun(int *a,int *b,int n)
{
	int max =*a,i;
	for(i=1;i<n;i++)
	if(*(a+i)>max)
	{
	max = *(a+i);
	*b = i;
	}
	return max;
} 

5.問題與解決方法

沒給max賦初值,將一串數字的首位*a賦給max.

6-1 最小數放前最大數放后(10 分)

1.案例描述

需要寫一個被題干調用的函數,被調用函數的作用是將其中最小的數與第一個數對換,將最大的數與最后一個數對換,根據函數接口

void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);

確定輸出結果。

2.算法設計

(1)輸入
(2)找出最大值和最小值並與首位、末位交換位置
(3)輸出

3.流程圖

4.代碼

(https://github.com/dangrui/dangrui.git)

    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,t;
    int j=0,p=0;
    for(i=0;i<n;i++)
    {  
	 if(*(arr+i)<min)
		{  
     		min = *(arr+i);
      		p =i ;
		}
		if(max<*(arr+i))	
		{  
            max = *(arr+i);
			j = i ;  
        }
	}  
    	t=*(arr+0);  
        *(arr+0)=*(arr+p);  
       	*(arr+p)=t;
		t=*(arr+n-1);  
        *(arr+n-1)=*(arr+j);  
        *(arr+j)=t; 
    }  
    void output(int *arr,int n)
    {
   int i;
   for(i = 0;i<n;i++)
   printf("%3d",arr[i]);
    } 

5.問題與解決方法

(1)在input中輸入下標時,不能加&否則數組下標類型無效
(2)“int arr [ 0 ]“陰影參數,要將它賦值到一個已知變量中
(3)錯誤的一元“*”類型的參數(有“int”),直接打arr【】既可

6-2 指針選擇法排序(10 分)

1.案例描述

需要寫一個被題干調用的函數,被調用函數的作用是將數字按從大到小的順序依次排列,根據函數接口void sort(int *x,int n);進行編譯,確定輸出結果。

2.算法設計

(1)設計一個循環,比較前后兩個數的大小
(2)交換位置

3.流程圖

4.代碼

(https://github.com/dangrui/dangrui.git)

{
 		int i,j,s,t;
 		for(i=0;i<n-1;i++)
 		{
 			s=i;
 			for(j=i+1;j<n;j++)
 			{
 				if(*(x+s)<*(x+j))
 				{
 					s=j;
				 }
			 }
			 if(s!=i)
			 {
			 	t=*(x+i);
			 	*(x+i)=*(x+s);
			 	*(x+s)=t;
			 }
		 }
	 }

6-1 判斷回文字符串(20 分)

1.案例描述

需要寫一個被題干調用的函數,被調用函數的作用是判斷字符串兩邊是否對稱,根據函數接口bool palindrome( char *s );進行編譯,確定輸出結果。

2.算法設計

(1)for循環遍歷數組
(2)不對稱false,對稱true

3.流程圖

4.代碼

(https://github.com/dangrui/dangrui.git)

bool palindrome(char *s)   //定義返回值為布爾類型的函數  
{  
    char *a = s;
    int i = 0,j=0,k=0;  
    while (*a != '\0')     
    {  
        a++;  
        i++;  
    }  
    a--;                     //因為最后一為為'\0'所以減一位  
    while (*s != '\0')       //進行兩個比較  
    {  
        if (*s == *a)  
        {  
            k++;  
        }  
        else   
        {  
            return false;  
        }  
        s++;  
        a--;  
    }  
    if (k == i)           //如果每個都相等 k=i返回true  
    {  
        return true;  
    }  
}  

5.問題與解決方法

(1)因為最后一為為'\0'所以減一位
(2)直接將兩邊的字符進行比對既可

6-2 使用函數實現字符串部分復制(20 分)

1.案例描述

需要寫一個被題干調用的函數,被調用函數的作用是復制部分字符串,根據函數接口void strmcpy( char *t, int m, char *s );進行編譯,確定輸出結果。

2.算法設計

(1)寫一個循環,首先確保所給位置在輸出的字符串中
(2)輸出此位置之后的字符串

3.流程圖

4.代碼

(https://github.com/dangrui/dangrui.git)

void strmcpy( char *t, int m, char *s )
{
    int i;
    for(i=m;*(t+i-1)!='\0';i++)
    {
        *(s+i-m)=*(t+i-1);
    }
    *(s+i-m)='\0';
}

時間總結


托管代碼

學習總結

以前寫PTA如果懶了的話,就找同學的抄一下就好,但是現在不行了,上課之后要看書重新捋順知識,之后做PTA,不懂的地方錯誤的原因都要標注出來,只有這樣才能更好地完成博客作業,這也使得我對C語言的學習投入了更多的精力,和時間,也和我的懶惰做了對抗。

評論同學

王帥(http://www.cnblogs.com/moxiaoshuai/p/8633373.html)
張琪(http://www.cnblogs.com/zhang03/p/8641322.html#3933170)
鄧欣茹(http://www.cnblogs.com/dxfish/p/8597352.html)
焦瑞君(http://www.cnblogs.com/jiaoruijun/p/8639383.html)
梁聖然(http://www.cnblogs.com/messi6/p/8626565.html)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM