2019春季第六週做業html
這個做業屬於哪一個課程 | C語言程序設計ll |
這個做業要求在哪裏 | (https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2888) |
我在這個課程的目標是 | 理解變量、內存單元和地址之間的關係,掌握指針變量的基本運算 |
這個做業在哪一個具體方面幫助我實現目標 | 這個做業讓我大概瞭解了指針的定義及用法 |
參考文獻 | (https://jingyan.baidu.com/article/20095761754006cb0721b4bb.html) |
函數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
#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; }
本題比較簡單,調試過程當中沒有遇到任何問題
讀入n個整數,調用max_min()函數求這n個數中的最大值和最小值。函數
輸入有兩行: 第一行是n值; 第二行是n個數。學習
輸出最大值和最小值。測試
在這裏給出一組輸入。例如:設計
5 8 9 12 0 3
在這裏給出相應的輸出。例如:3d
max = 12 min = 0
#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]; } }
問題1:對於指針數組還不是特別會用
解決方法:搜了一下百度,看了專門講指針數組的視頻指針
爲一維數組輸入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
#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]); } }
問題1:一開始編譯出來的數直接是從小排到大
解決方法:屢次調試以後就找到錯的地方而後就改了
問題2:缺乏中間替換的變量,致使編譯結果爲1 1 4 8 2 3 9 5 12 12
解決方法:看了一下其餘同窗的博客而後就懂了
預習了指針的第2小節角色互換,函數參數可使整數、字符型和浮點型,固然也能夠是指針類型。若是將某個變量的地址做爲函數的實參,相應的形參就是指針。在C語言中實參和形參之間的數據傳遞是單向的「值傳遞」方式,調用函數不能改變實參變量的值,當指針變量做爲函數參數時也遵照這一個規則。調用函數不能改變實參指針變量的值,但能夠改變實參指針變量所指向的變量的值。這樣的機制被稱爲引用調用。採用引用調用機制須要在函數定義時將指針做爲函數的形參,在函數調用時把變量的地址做爲實參。目前大概就理解了這些。
周/日期 | 這周所花的時間 | 代碼行數 | 學到的知識點簡介 | 目前比較迷惑的問題 |
---|---|---|---|---|
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 | 指針變量的基本運算,內存單元和地址之間的關係 | 不太瞭解指針數組 |
本週學習了變量、內存單元和地址之間的關係,定義指針變量,使用指針變量,進行指針變量的初始化,指針變量的基本運算,指針做爲函數參數的做用,使用指針實現函數調用返回多個值。地址和指針是計算機中的兩個重要概念,在程序運行過程當中,變量或者程序代碼被儲存在以字節爲單位組織的存儲器中。在C語言中,若是定義了一個變量,在編譯時就會根據該變量的類型給它分配相應大小的內存單元。指針聲明符在定義指針時被使用,說明被定義的那個變量是指針。定義多個指針變量時,每個指針變量前面都必須加上。指針的類型和它所指向變量的類型必須相同。只能將一個指針的值賦給另外一個相同類型的指針。我本身看了一下指針數組,感受挺難的,本週學的對於內存單元和地址之間的關係不是很清楚,看了一些其餘老師的視頻幫助理解。
感悟:長風破浪會有時,直掛雲帆濟滄海!
每週三晚自習是咱們結對編程的時間,個人搭檔換成了個人室友,咱們會在雙方互相寫完代碼後再進行討論,而後看一下雙方的代碼有什麼區別,而後再互相講一下思路。我以爲結對編程的優勢就是能夠了解一個代碼不一樣的思路,不一樣的寫法,也能夠增進同窗之間的關係;缺點就是討論時會擾亂雙方的思路。
時間 | 代碼行數 | 博客字數 |
---|---|---|
第一週 | 45 | 870 |
第二週 | 37 | 1055 |
第三週 | 112 | 1158 |
第四周 | 113 | 1696 |
第五週 | 78 | 1854 |
第六週 | 114 | 2977 |
(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)在數據結構中,鏈表、樹、圖等大量的應用都離不開指針。
通常是四字節,指針大小是由當前CPU運行模式的尋址位數決定