2019春第六週做業


這個做業屬於哪一個課程 C語言程序設計
這個做業的要求在哪裏 (https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2888)
我在這個課程的目標是 理解變量、內存單元和地址之間的關係;指針變量的定義及初始化,掌握指針變量的基本運算
這個做業在哪一個具體方面幫助我實現目標 讓我理解了指針做爲函數參數的做用;掌握如何使用指針實現函數調用返回多個值。
參考文獻 c語言如何定義全局變量

一.基礎題

6-1 求兩數平方根之和 (10 分)

函數fun的功能是:求兩數平方根之和,做爲函數值返回。例如:輸入12和20,輸出結果是:y = 7.936238。
函數接口定義:html

double fun (double *a, double *b);

其中 a和 b是用戶傳入的參數。函數求 a指針和b 指針所指的兩個數的平方根之和,並返回和。
裁判測試程序樣例:算法

#include<stdio.h>
#include <math.h> 
double fun (double *a, double *b); 
int main ( )
{ double a, b, y;
scanf ("%lf%lf", &a, &b );
 y=fun(&a, &b); printf ("y=%.2f\n", y );
return 0;
}

/* 請在這裏填寫答案 */

輸入樣例:編程

12 20

輸出樣例:數組

y=7.94

1)運行代碼

double fun (double *a,double *b)
{
    return (sqrt(*a))+(sqrt(*b));
 }

2)設計思路

3)本題調試過稱中遇到的問題及解決辦法

本題比較簡單,一次性經過,沒有遇到問題。數據結構

4)運行截圖

7-1 利用指針返回多個函數值 (30 分)

讀入n個整數,調用max_min()函數求這n個數中的最大值和最小值。
輸入格式:
輸入有兩行: 第一行是n值; 第二行是n個數。
輸出格式:
輸出最大值和最小值。
輸入樣例:
在這裏給出一組輸入。例如:函數

5
8 9 12 0 3

輸出樣例:
在這裏給出相應的輸出。例如:學習

max = 12
min = 0

1)運行代碼

#include<stdio.h>
void max_min (int *a,int *b,int *max,int *min);
int main(){
    int n,m[100];
    int max,min;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&m[i]);
        //把每一個元素的地址給自定義函數,用於比較大小 
        int *a=&m[i];int *b=&m[i];
        //定義返回最大值和最小值的指針 
        int *pa,*pb;
        //設定m[0]得值既是最大的值又是最小的值 
        if(0==i){
            //將m[0]的值同時賦給兩個不一樣變量 
              max=m[0]; min=m[0];
            //將兩個變量的不一樣地址賦給給須要返回值的指針  
              pa=&max; pb=&min;
              //當i=0時,不須要比較 
            continue;
        }
        max_min(a,b,pa,pb);
        
    }
    printf("max = %d\nmin = %d",max,min);
    return 0;
}

void max_min (int *a,int *b,int *max,int *min)
{
    if(*a>*max){
        //將更大的值賦給*max 
        *max=*a;
    }
    if(*b<*min){
        //將更小的值賦給*min
        *min=*b;
    }
    
}

2)設計思路

3)本題調試過稱中遇到的問題及解決辦法

在編譯器上編譯時遇到一些問題,但都弄明白了,如如何將每次比較後的極值存起來再和下一個循環比較,就須要定義四個參數。如不能將同一個地址既給最大值又給最小值。
我照着書上的例題作出來了,並且在PTA上提交一次就過了。測試

4)運行截圖

二.預習題

6-3 最小數放前最大數放後 (10 分)

爲一維數組輸入10個整數;將其中最小的數與第一個數對換,將最大的數與最後一個數對換;輸出數組元素。。
函數接口定義:設計

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

三個函數中的 arr和n 都是用戶傳入的參數。n 是元素個數。
input函數的功能是輸入 n個元素存到指針arr所指向的一維數組中。
max_min函數的功能是求指針arr所指向的一維數組中的最大值和最小值,其中最小的數與第一個數對換,將最大的數與最後一個數對換。
output函數的功能是在一行中輸出數組元素,每一個元素輸出佔3列。
裁判測試程序樣例:3d

#include<stdio.h>
void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);
int main()
{ int a[10];
input(a,10);
 max_min(a,10);
 output(a,10);
 return 0;
}

/* 請在這裏填寫答案 */

輸入樣例:

5 1 4 8 2 3 9 5 12 7

輸出樣例:

1  5  4  8  2  3  9  5  7 12

1)運行代碼

//輸入 
void input(int *arr,int n)
{
    //循環輸入數組 
    for(int i=0;i<n;i++){
        scanf("%d",&arr[i]);
    } 
}
//找極值,交換位置
void max_min(int *arr,int n)
{
    //找極值
    int *max;
    max=arr;
    for(int i=1;i<n;i++){
        if(*max<arr[i]){
            max=arr+i; 
        }
    }
    int *min;
    min=arr;
    for(int i=1;i<n;i++){
        if(*min>arr[i]){
            min=arr+i;
        }
    }
    //printf("%d  %d",*max,*min);
    //交換位置
    int t;
    t=*max;
    *max=arr[n-1];
    arr[n-1]=t;
    
    t=*min;
    *min=arr[0];
    arr[0]=t; 
 }
 //輸出 
 void output(int *arr,int n)
 {
    for(int i=0;i<n;i++){
        printf("%3d",arr[i]);
     } 
  }

2)設計思路

3)本題調試過稱中遇到的問題及解決辦法


問題:在使用指針變量時,忘記給指針變量先賦的值應該是地址,而後才能給指針變量中的地址所指的變量賦值。
解決辦法:編譯器編譯過不了,仔細查看錯誤,發現了本身的問題。

4)運行截圖

三.預習的主要內容

1.指針、數組和地址間的關係:數組的基地址是類存中儲存數組的起始位置,是數組中第一個元素的地址,所以數組名自己就是一個地址即指針值;區別:指針是以地址做爲值得變量,而數組名是一個固定地址,能夠當作指針常量。
指針每一次加1或減1,是加上或減去該指針所指向的那個數據類型的長度,即它所指向的儲存單元所佔用的字節數。
2.數組名做爲函數的參數:數組的形參a其實是一個指針。當進行參數傳遞是,主函數傳遞的是數組a的基地址,數組元素自己不被複制。
3.冒泡排序算法分析。
4.二分查找法。

四.學習進度條


周/日期 這周所花的時間 代碼行 學到的知識點簡介 目前比較迷惑的問題
2/25-3/3 6h 39 一維數組的定義和引用及初始化 字符數組和整型數組的區別
3/4-3/10 12h 47 指針的定義及運用;文件的讀取、寫入, 處理和開關;文件的打開方. 文件的分類,什麼是文本文件, 什麼是二進制文件;字符數組的讀取和寫入
3/11-3/17 6h 57 二維數組的定義及應用 二維數組的行和列的嵌套循環輸入和輸出
3/18-3/24 12h 98 選擇排序法、冒泡排序法和二分查找法 不清楚選擇排序法和冒泡排序法的區別
3/25-3/31 20h 88 字符數組和字符串的區別,字符串的輸入輸出方式和格式,二維數組更高級的運用。 不清楚指針在程序中的做用
4/1-4/7 12h 70 變量、內存單元和地址之間的關係;指針變量的定義及初始化,指針變量的基本運算,指針、數組和地址間的關係 二分法查找法不太明白

五.學習感悟

本週做業我以爲比較難的地方是理解指針、數組和地址間的關係。如int a[100],*p;的如下兩條語句是等價的:p=a;p=&a[0];一樣以下語句也是等價的:p=a+1;p=&a[1];
還有遍歷每個數組元素的地址能夠用for循環,指針每一次加1或減1,是加上或減去該指針所指向的那個數據類型的長度,即它所指向的儲存單元所佔用的字節數。
因此只要將書上的定理和例題看明白了的,作這周的題目都不算太難。

六.結對編程感想

過程:個人個人隊友關係很好,無所不談,無論問題的大小,只要不懂就問,若兩我的都不知道怎麼作,就一塊兒討論一塊兒解決問題,如咱們在作基礎題2時都不知道怎麼將每次比較後的極值存起來再和下一個循環比較,咱們就看書想到了一個定義四個參數的方法,以爲行得通,後來通過咱們兩我的的改進,把題目作了出來。
感悟:咱們都以爲頗有成就感。我以爲結對編程就是將兩我的的力量結合起來共同解決一個問題。

七.表格和折線圖


時間 代碼行數 博客字數
第一週 39 1754
第二週 47 2087
第三週 57 1993
第四周 98 2145
第五週 88 2472
第六週 70 2514

八.思考題

1)爲何要使用指針?它有什麼用? 指針是存放內存地址的,使編程更容易實現數據的出去和計算。 指針就是指向一個特定內存地址的一個變量。 C語言指針能夠有效地表示覆雜的數據結構、動態分配內存、高效地使用數組和字符串、使得調用函數時獲得多個返回值等。 指針的應用每每與數組聯繫在一塊兒,是最頻繁的,也是最基礎的。在咱們定義數組和函數時,系統都會爲其自動分配一個指向其首地址的指針。對於一個數組,其名稱就是一個指針變量。 2)指針變量在內存中暫用多大的空間?它的大小由什麼決定? 指針即爲地址,指針幾個字節跟語言無關,而是跟系統的尋址能力有關,之前是16爲地址,指針即爲2個字節,如今通常是32位系統,因此是4個字節,之後64位,則就爲8個字節。 編譯器給指針分配的空間大小是和CPU的尋址長度相關的,好比32位的CPU,它的尋址長度爲32位,那麼這個空間也就佔四個字節。

相關文章
相關標籤/搜索