這個做業屬於哪一個課程 | C語言程序設計 |
這個做業的要求在哪裏 | (https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2888) |
我在這個課程的目標是 | 理解變量、內存單元和地址之間的關係;指針變量的定義及初始化,掌握指針變量的基本運算 |
這個做業在哪一個具體方面幫助我實現目標 | 讓我理解了指針做爲函數參數的做用;掌握如何使用指針實現函數調用返回多個值。 |
參考文獻 | c語言如何定義全局變量 |
函數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
double fun (double *a,double *b) { return (sqrt(*a))+(sqrt(*b)); }
本題比較簡單,一次性經過,沒有遇到問題。數據結構
讀入n個整數,調用max_min()函數求這n個數中的最大值和最小值。
輸入格式:
輸入有兩行: 第一行是n值; 第二行是n個數。
輸出格式:
輸出最大值和最小值。
輸入樣例:
在這裏給出一組輸入。例如:函數
5 8 9 12 0 3
輸出樣例:
在這裏給出相應的輸出。例如:學習
max = 12 min = 0
#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; } }
在編譯器上編譯時遇到一些問題,但都弄明白了,如如何將每次比較後的極值存起來再和下一個循環比較,就須要定義四個參數。如不能將同一個地址既給最大值又給最小值。
我照着書上的例題作出來了,並且在PTA上提交一次就過了。測試
爲一維數組輸入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
//輸入 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]); } }
問題:在使用指針變量時,忘記給指針變量先賦的值應該是地址,而後才能給指針變量中的地址所指的變量賦值。
解決辦法:編譯器編譯過不了,仔細查看錯誤,發現了本身的問題。
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位,那麼這個空間也就佔四個字節。