第六週做業

這個做業屬於哪一個課程 C語言程序設計ll
這個做業要求在哪裏 https://edu.cnblogs.com/campus/zswxy/software-engineering-class1-2018/homework/2889
我在這個課程的目標是 深刻了解並學習指針的用法,掌握指針的基本運算
這個做業在哪一個具體方面幫助我實現目標 這個做業讓我瞭解了指針,學會了如何使用指針,還回顧了函數的調用
參考文獻 8.1密碼開鎖和8.2角色互換的內容以及其餘一些指針和調用函數的知識

1、基礎題

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

函數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.實驗代碼

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

所有代碼

#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 y;
        y=sqrt(*a)+sqrt(*b);
        return y;
}

2.設計思路

3.解題過程當中遇到的問題及解決辦法

問題:開始不知道是直接用指針變量計算仍是要取地址再計算
解決方法:看了一下書,而後是直接用指針變量計算。數據結構

4.運行結果截圖

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

讀入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 n, int *m); 
int main()
{
    int i, n;
    scanf("%d", &n);
    int m[n];
    for(i = 0; i < n; i++)
    {
      scanf("%d", (m + i));
    }
    max_min(n, m);
    printf("max = %d\nmin = %d", *(m), *(m + n - 1));
    return 0;
}

void max_min(int n, int *m)
{
    int i, j, k;
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n - i - 1; j++)
        {
            if(*(m + j) < *(m + j + 1))
            {
                k = *(m + j + 1);
                *(m + j + 1) = *(m + j);
                *(m + j)= k; 
            }
        }
    }
}

2.設計思路

3.解題過程當中遇到的問題及解決辦法




問題1:沒有注意就直接把以前的代碼賦給j的值爲1,寫入,致使錯誤
解決方法:把j=1改成j=0, j<n-i 改成 j<n-i-1
問題2:對於指針裏面的知識還不是特別瞭解
解決方法:上網查百度查詢相關知識,瞭解指針指針

4.運行結果截圖

2、預習題

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列。
裁判測試程序樣例:

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

所有代碼

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

2.設計思路

3.解題過程當中遇到的問題及解決辦法



問題1:沒有注意輸出格式致使編譯錯誤
解決方法:將「%d」改成「%3d」。
問題2:漏了一些條件,考慮不周全,for語句循環中有的地方出現錯誤
解決方法:仔細檢查,經過調試等途徑檢查出錯誤,而後改正。

4.運行結果截圖

3、學習進度條

周/日期 這周所花的時間 代碼行數 學到的知識點簡介 目前比較迷惑的問題
2/25-3/3 2天 39 初次學習數組的用法 關於數組的一些具體的用法
3/4-3/10 2天 35 編寫程序來處理文件數據 指針的具體用法和fscanf類型函數的理解
3/11-3/17 1天 59 第一題:編寫程序處理文件數據 指針的具體用法
3/11-3/17 2天 51 第二題:用二維數組知識編寫程序 二維數組的知識點不熟悉
3/18-3/24 2天 111 二維數組、選擇法排序和冒泡法排序 選擇法排序和冒泡法排序的區別
3/25-3/31 2天 78 判斷迴文,字符數組和使用字符串編程 使用字符串編程時的一些函數的用法
4/1-4/7 3天 102 指針的基本運算,數組和指針的結合 對於數組仍是不熟悉

4、學習感悟

這一週主要學習了指針的知識,指針的基本運算,還有做業中的指針與數組兩個知識點的結合,雖然挺多人都說數組難學,可是我以爲只要認真學了也不會太差,主要的指針的地址和內存,指針變量,指針變量的初始化,連續定義等一些重要的知識點要掌握好,而後其餘的就須要認真聽老師講,自覺地去自學看書了。我以爲學好專業知識還須要更加努力。

5、結對編程感悟

這一週咱們從新換告終對編程的狀況,相對於以前徹底不認識的人來講我以爲這樣子比較好了,咱們兩我的會交流一些東西,而後一塊兒討論一下吧,這周的做業我以爲對我來講不太容易,有一個夥伴一塊兒作題目我以爲也挺好的。

6、表格、折線圖

時間 代碼行數 博客字數
第一週 39 798
第二週 35 923
第三週 110 1071
第四周 111 1713
第五週 78 1878
第六週 102 2991

思考題

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

由於不少狀況能夠用到。這須要在編程過程當中造成一種思惟。如 將一個結構體傳遞給一個函數。若是不用指針,傳送速度慢,若是經過指針,只要傳遞一個地址。指針經過地址傳遞參數,能夠雙向傳遞值。
指針是C語言中普遍使用的一種數據類型。 能夠說沒有了指針後面得數據結構根本就無法構造了, 運用指針編程是C語言最主要的風格之一。利用指針變量能夠表示各類數據結構; 能很方便地使用數組和字符串; 並能象彙編語言同樣處理內存地址,從而編出精練而高效的程序。指針極大地豐富了C語言的功能。

指針的做用:

一、指針就是指向一個特定內存地址的一個變量。C語言指針能夠有效地表示覆雜的數據結構、動態分配內存、高效地使用數組和字符串、使得調用函數時獲得多個返回值等。指針的應用每每與數組聯繫在一塊兒,是最頻繁的,也是最基礎的。在定義數組和函數時,系統都會爲其自動分配一個指向其首地址的指針。對於一個數組,其名稱就是一個指針變量。
二、指針只是一個變量,它存儲一個內存地址。若是傳入一個地址,比傳入一個struct效率要高,由於少了一個拷貝過程。
三、指針可以有效的表示數據結構,能動態分配內存,能較方便的使用字符串,有效的使用數組。
四、指針直接與數據等的儲存地址有關,是比較重要的。好比,值傳遞不如地址傳遞高效,由於值傳遞先從實參的地址中提出值,再賦值給形參帶入函數計算;而指針則把形參的地址直接指向實參地址,使用時直接提出數據,使效率提升,特別在頻繁賦值等狀況下。

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

通常是四字節,指針大小是由當前CPU運行模式的尋址位數決定;  在編譯器裏定義一個指針變量,編譯器會給這個指針變量分配一個空間,這個空間裏存放的是一段內存的首地址,先解釋一段內存,一段內存的大小是與你所定義的指針類型相關的,好比int,這段內存佔四個字節(固然要看你的機器是多少位的了),則這段內存的首地址是第一個字節的地址,如char類型,佔一個字節,這段內存的首地址就是這個字節的地址,還如結構體類型,此時內存大小要看該結構體的全部屬性所佔內存之和。如今解釋這個空間,編譯器給指針分配的空間大小是和CPU的尋址長度相關的,好比32位的CPU,它的尋址長度爲32位,那麼這個空間也就佔四個字節,其實無論你定義什麼樣的指針類型,這個空間只是用來存地址,只佔四個字節,而真正該空間所存的地址是哪一段內存的首地址才和所定義的指針類型相關。

相關文章
相關標籤/搜索