這個做業屬於哪一個課程 | C語言程序設計ll |
這個做業要求在哪裏 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class1-2018/homework/2889 |
我在這個課程的目標是 | 深刻了解並學習指針的用法,掌握指針的基本運算 |
這個做業在哪一個具體方面幫助我實現目標 | 這個做業讓我瞭解了指針,學會了如何使用指針,還回顧了函數的調用 |
參考文獻 | 8.1密碼開鎖和8.2角色互換的內容以及其餘一些指針和調用函數的知識 |
函數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
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; }
問題:開始不知道是直接用指針變量計算仍是要取地址再計算
解決方法:看了一下書,而後是直接用指針變量計算。數據結構
讀入n個整數,調用max_min()
函數求這n個數中的最大值和最小值。函數
輸入有兩行: 第一行是n值; 第二行是n個數。學習
輸出最大值和最小值。測試
在這裏給出一組輸入。例如:設計
5 8 9 12 0 3
在這裏給出相應的輸出。例如:3d
max = 12 min = 0
#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; } } } }
問題1:沒有注意就直接把以前的代碼賦給j的值爲1,寫入,致使錯誤
解決方法:把j=1改成j=0, j<n-i 改成 j<n-i-1
問題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
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]); } }
問題1:沒有注意輸出格式致使編譯錯誤
解決方法:將「%d」改成「%3d」。
問題2:漏了一些條件,考慮不周全,for語句循環中有的地方出現錯誤
解決方法:仔細檢查,經過調試等途徑檢查出錯誤,而後改正。
周/日期 | 這周所花的時間 | 代碼行數 | 學到的知識點簡介 | 目前比較迷惑的問題 |
---|---|---|---|---|
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 | 指針的基本運算,數組和指針的結合 | 對於數組仍是不熟悉 |
時間 | 代碼行數 | 博客字數 |
---|---|---|
第一週 | 39 | 798 |
第二週 | 35 | 923 |
第三週 | 110 | 1071 |
第四周 | 111 | 1713 |
第五週 | 78 | 1878 |
第六週 | 102 | 2991 |
由於不少狀況能夠用到。這須要在編程過程當中造成一種思惟。如 將一個結構體傳遞給一個函數。若是不用指針,傳送速度慢,若是經過指針,只要傳遞一個地址。指針經過地址傳遞參數,能夠雙向傳遞值。
指針是C語言中普遍使用的一種數據類型。 能夠說沒有了指針後面得數據結構根本就無法構造了, 運用指針編程是C語言最主要的風格之一。利用指針變量能夠表示各類數據結構; 能很方便地使用數組和字符串; 並能象彙編語言同樣處理內存地址,從而編出精練而高效的程序。指針極大地豐富了C語言的功能。
一、指針就是指向一個特定內存地址的一個變量。C語言指針能夠有效地表示覆雜的數據結構、動態分配內存、高效地使用數組和字符串、使得調用函數時獲得多個返回值等。指針的應用每每與數組聯繫在一塊兒,是最頻繁的,也是最基礎的。在定義數組和函數時,系統都會爲其自動分配一個指向其首地址的指針。對於一個數組,其名稱就是一個指針變量。
二、指針只是一個變量,它存儲一個內存地址。若是傳入一個地址,比傳入一個struct效率要高,由於少了一個拷貝過程。
三、指針可以有效的表示數據結構,能動態分配內存,能較方便的使用字符串,有效的使用數組。
四、指針直接與數據等的儲存地址有關,是比較重要的。好比,值傳遞不如地址傳遞高效,由於值傳遞先從實參的地址中提出值,再賦值給形參帶入函數計算;而指針則把形參的地址直接指向實參地址,使用時直接提出數據,使效率提升,特別在頻繁賦值等狀況下。
通常是四字節,指針大小是由當前CPU運行模式的尋址位數決定; 在編譯器裏定義一個指針變量,編譯器會給這個指針變量分配一個空間,這個空間裏存放的是一段內存的首地址,先解釋一段內存,一段內存的大小是與你所定義的指針類型相關的,好比int,這段內存佔四個字節(固然要看你的機器是多少位的了),則這段內存的首地址是第一個字節的地址,如char類型,佔一個字節,這段內存的首地址就是這個字節的地址,還如結構體類型,此時內存大小要看該結構體的全部屬性所佔內存之和。如今解釋這個空間,編譯器給指針分配的空間大小是和CPU的尋址長度相關的,好比32位的CPU,它的尋址長度爲32位,那麼這個空間也就佔四個字節,其實無論你定義什麼樣的指針類型,這個空間只是用來存地址,只佔四個字節,而真正該空間所存的地址是哪一段內存的首地址才和所定義的指針類型相關。