2019 第六週做業

2019春季第六週做業html

這個做業屬於哪一個課程 C語言程序設計ll
這個做業要求在哪裏 https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2888
我在這個課程的目標是 理解變量、內存單元和地址之間的關係,掌握指針變量的基本運算
這個做業在哪一個具體方面幫助我實現目標 這個做業讓我大概瞭解了指針的定義及用法
參考文獻 https://jingyan.baidu.com/article/20095761754006cb0721b4bb.html

1、基礎題

一、求兩數平方根之和

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

函數接口定義:

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)實驗代碼

#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;
}
double fun (double *a, double *b)
{
    double result;
    
    result=sqrt(*a)+sqrt(*b);
    
    return result;
 }

(2)設計思路

(3)本題調試過程當中碰到問題及解決方法

本題比較簡單,調試過程當中沒有遇到任何問題

(4)運行結果截圖

二、利用指針返回多個函數值

讀入n個整數,調用max_min()函數求這n個數中的最大值和最小值。函數

輸入格式:

輸入有兩行: 第一行是n值; 第二行是n個數。學習

輸出格式:

輸出最大值和最小值。測試

輸入樣例:

在這裏給出一組輸入。例如:設計

5
8 9 12 0 3

輸出樣例:

在這裏給出相應的輸出。例如:3d

max = 12
min = 0

(1)實驗代碼

#include<stdio.h>
void max_min(int a[100],int n,int* pmax,int* pmin);      //函數聲明 
int main(void)
{
    int n,i,max,min; 
    int *pmax,*pmin;          //定義指針 
    int a[100];
    scanf("%d",&n);
  
    for(i=0;i<n;i++)          //輸入數組 
    {
        scanf("%d",&a[i]);
    }
  
    max_min(a,n,&max,&min);                  //調用函數 
    printf("max = %d\nmin = %d",max,min);    //輸出最大值和最小值 
    
    return 0;
}

void max_min(int a[100],int n,int* pmax,int* pmin)         //函數的定義
{
    int i;
    *pmax=*pmin=a[0];
    
    for(i=1;i<n;i++)    //比較大小,找到最大值及最小值 
    {
        if(*pmax<a[i]) 
            *pmax=a[i];
        if(*pmin>a[i])
            *pmin=a[i];
    }
}

(2)設計思路

(3)本題調試過程當中碰到問題及解決方法

問題1:對於指針數組還不是特別會用
解決方法:搜了一下百度,看了專門講指針數組的視頻指針

(4)運行結果截圖

2、預習題

一、最小數放前最大數放後

爲一維數組輸入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列。

裁判測試程序樣例:

#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)實驗代碼

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

(2)設計思路

(3)本題調試過程當中遇到的問題及解決方法

問題1:一開始編譯出來的數直接是從小排到大
解決方法:屢次調試以後就找到錯的地方而後就改了

問題2:缺乏中間替換的變量,致使編譯結果爲1 1 4 8 2 3 9 5 12 12
解決方法:看了一下其餘同窗的博客而後就懂了

(4)運行結果截圖

3、預習的主要內容

預習了指針的第2小節角色互換,函數參數可使整數、字符型和浮點型,固然也能夠是指針類型。若是將某個變量的地址做爲函數的實參,相應的形參就是指針。在C語言中實參和形參之間的數據傳遞是單向的「值傳遞」方式,調用函數不能改變實參變量的值,當指針變量做爲函數參數時也遵照這一個規則。調用函數不能改變實參指針變量的值,但能夠改變實參指針變量所指向的變量的值。這樣的機制被稱爲引用調用。採用引用調用機制須要在函數定義時將指針做爲函數的形參,在函數調用時把變量的地址做爲實參。目前大概就理解了這些。

4、學習進度條

周/日期 這周所花的時間 代碼行數 學到的知識點簡介 目前比較迷惑的問題
2/25-3/3 三天 45 數組的認識及用法 數組長度的理解
3/4-3/10 兩天 37 編寫程序時處理文件 fscanf與fprintf的具體用法
3/11-3/17 三天 53 二維數組的使用及文件插入 二維數組的用法、上三角的判斷及文件的處理
3/18-3/24 兩天 113 選擇排序法、二分查找法、二維數組的引用與矩陣 不清楚選擇排序法和冒泡排序法的區別
3/25-3/31 兩天 78 判斷迴文、一維字符數組的用法、使用字符串編程 使用字符串編程
4/1-4/7 兩天 88 指針變量的基本運算,內存單元和地址之間的關係 不太瞭解指針數組

5、學習感悟

本週學習了變量、內存單元和地址之間的關係,定義指針變量,使用指針變量,進行指針變量的初始化,指針變量的基本運算,指針做爲函數參數的做用,使用指針實現函數調用返回多個值。地址和指針是計算機中的兩個重要概念,在程序運行過程當中,變量或者程序代碼被儲存在以字節爲單位組織的存儲器中。在C語言中,若是定義了一個變量,在編譯時就會根據該變量的類型給它分配相應大小的內存單元。指針聲明符在定義指針時被使用,說明被定義的那個變量是指針。定義多個指針變量時,每個指針變量前面都必須加上。指針的類型和它所指向變量的類型必須相同。只能將一個指針的值賦給另外一個相同類型的指針。我本身看了一下指針數組,感受挺難的,本週學的對於內存單元和地址之間的關係不是很清楚,看了一些其餘老師的視頻幫助理解。

感悟:長風破浪會有時,直掛雲帆濟滄海!

6、結對編程感想

每週三晚自習是咱們結對編程的時間,個人搭檔換成了個人室友,咱們會在雙方互相寫完代碼後再進行討論,而後看一下雙方的代碼有什麼區別,而後再互相講一下思路。我以爲結對編程的優勢就是能夠了解一個代碼不一樣的思路,不一樣的寫法,也能夠增進同窗之間的關係;缺點就是討論時會擾亂雙方的思路。

7、表格和折線圖

時間 代碼行數 博客字數
第一週 45 870
第二週 37 1055
第三週 112 1158
第四周 113 1696
第五週 78 1854
第六週 114 2977

8、思考題:

1.爲何要使用指針?它有什麼用?

(1)用指針在函數間傳遞數據效率高,尤爲是當數據量大的時侯。
(2)用指針的話,對內存的佔用會比較小,而直接用中間變量會複製出副本,佔用雙重內存,即使在函數調用後變量副本會被撤銷
(3)指針的功能強大,它能夠指向數據存放的地址,指針既能夠指向變量地址,也能夠指向函數。所以,不管是調用數據,仍是調用函數,均可已使用指針。指針實現間接訪問,能夠保證原數據不會丟失

指針的做用:

(1)在數據傳遞時,若是數據塊較大(好比說數據緩衝區或比較大的結構),這時就可使用指針傳遞地址而不是實際數據,即提升傳輸速度,又節省大量內存。
(2)數據轉換,利用指針的靈活的類型轉換,能夠用來作數據類型轉換,比較經常使用於通信緩衝區的填充,好比說,一個數據緩衝區char buf[100],若是其中buf[0,1]爲命令號,buf[2,3]爲類型,buf[4~7]爲某一數值,類型爲int,就可使用以下語句進行賦值:
(short)&buf[0]=cmdID;
(short)&buf[2]=type;
(int)&buf[4]=value;
(3)字符串指針,是使用最方便,且經常使用的。
(4)函數指針,形如:#define PMYFUN (void*)(int,int),能夠用在大量分支處理的實例當中,如某通信根據不一樣的命令號執行不一樣類型的命令,則能夠創建一個函數指針數組,進行散轉。
(5)在數據結構中,鏈表、樹、圖等大量的應用都離不開指針。

2.指針變量在內存中暫用多大的空間?它的大小由什麼決定?

通常是四字節,指針大小是由當前CPU運行模式的尋址位數決定

相關文章
相關標籤/搜索