2019春第六周作業
作業課程 | C語言程序設計II |
作業要求 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2888 |
課程目標 | 熟練運用指針變量 |
從作業中得到的幫助 | 運用指針返回多個值 |
參考文獻 | 算法競賽入門經典,挑戰程序設計 |
第一題
6-1 求兩數平方根之和 (10 分)
函數fun的功能是:求兩數平方根之和,作為函數值返回。例如:輸入12和20,輸出結果是:y = 7.936238。
函數接口定義:
double fun (double *a, double *b);
其中 a
和 b
是用戶傳入的參數。函數求 a
指針和b
指針所指的兩個數的平方根之和,並返回和。
裁判測試程序樣例:
1 #include<stdio.h> 2 #include <math.h> 3 double fun (double *a, double *b); 4 int main ( ) 5 { double a, b, y; 6 scanf ("%lf%lf", &a, &b ); 7 y=fun(&a, &b); printf ("y=%.2f\n", y ); 8 return 0; 9 } 10 11 12 /* 請在這里填寫答案 */
輸入樣例:
12 20
輸出樣例:
y=7.94
實驗代碼(自定義函數)
實驗代碼(自定義函數)
1 double fun (double *a, double *b) 2 { 3 return sqrt(*a)+sqrt(*b); 4 }
設計思路
調試過程中遇到的問題及解決方法
無
運行結果截圖
第二題
7-1 利用指針返回多個函數值 (30 分)
讀入n個整數,調用max_min()函數求這n個數中的最大值和最小值。
輸入格式:
輸入有兩行: 第一行是n值; 第二行是n個數。
輸出格式:
輸出最大值和最小值。
輸入樣例:
在這里給出一組輸入。例如:
5 8 9 12 0 3
輸出樣例:
在這里給出相應的輸出。例如:
max = 12 min = 0
實驗代碼
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define MAXN 10000 4 5 void max_min(int *arr,int n,int * mins ,int * maxs) 6 { 7 *mins=arr[0]; 8 *maxs=arr[0]; 9 int x_b1=0,x_b2=0; 10 for(int i = 0 ; i < n ; i++) 11 { 12 if(arr[i]<(*mins)){*mins=arr[i];x_b1=i;} 13 if(arr[i]>(*maxs)){*maxs=arr[i];x_b2=i;} 14 } 15 16 arr[x_b1] = arr[0]; 17 arr[0] = *mins; 18 19 arr[x_b2] = arr[n-1]; 20 arr[n-1] = *maxs; 21 22 } 23 24 25 int main ( int argc , const char * argv[]) 26 { 27 int n,num[MAXN],min=0,maxs=0; 28 cin>>n; 29 for(int i = 0 ; i < n ; i++) 30 cin>>num[i]; 31 32 max_min(num,n,&min,&maxs); 33 cout<<"max = "<<maxs<<endl; 34 cout<<"min = "<<min<<endl; 35 36 return 0; 37 }
設計思路
調試過程中遇到的問題及解決方法
無
運行結果截圖
第三題(預習題)
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列。
裁判測試程序樣例:
1 #include<stdio.h> 2 void input(int *arr,int n); 3 void max_min(int *arr,int n); 4 void output(int *arr,int n); 5 int main() 6 { int a[10]; 7 input(a,10); 8 max_min(a,10); 9 output(a,10); 10 return 0; 11 } 12 13 /* 請在這里填寫答案 */
輸入樣例:
5 1 4 8 2 3 9 5 12 7
輸出樣例:
1 5 4 8 2 3 9 5 7 12
設計思路
調試過程中遇到的問題及解決方法
無
運行結果截圖
思考題:
1.為什么要使用指針?它有什么用?
2.指針變量在內存中暫用多大的空間?它的大小由什么決定?
答一:指針能夠很方便的訪問其他變量的地址,簡單來說,當數據量非常大的時候,需要將數據存入棧中,而如果需要尋找相應的內容是不可能一遍一遍遍歷過去的,指針就相當於目錄,你可以通過目錄直接找到你想要的內容。
答二: 無論是什么類型的指針變量,編譯器會給這個指針變量分配一個空間,這個空間里存放的是一段內存的首地址,編譯器給指針分配的空間大小是和CPU的尋址長度相關的,比如32位的CPU,它的尋址長度為32位,那么這個空間也就占四個字節,其實不管你定義什么樣的指針類型,這個空間只是用來存地址,只占四個字節,而真正該空間所存的地址是哪一段內存的首地址才和所定義的指針類型相關。
|
存在的問題 | 心得 | 完成作業消耗時間 | 本周學習內容 | |
第一周 | 對文件讀取數據的運用不是很熟練 | 多去看關於刷題的書籍,有助於提高自己寫題能力,實在不會的可以參考大佬的代碼,加以自己理解之后去默寫幾遍 | 半個小時左右 | 文件輸入,BFS,DFS,PARTITION算法及簡單的貪心算法 | |
第二周 | 對單純用數組完成雙向鏈表的操作還是太生疏了,說明對雙向鏈表的運作原理不熟 | 推薦兩本比較好的書《挑戰程序設計》《算法競賽》 | 半個小時左右 | vector數組及list雙向鏈表操作 | |
第三周 | 指針的概念太久沒記有點生疏了 | 對vector數組使用愈加熟練 | 一小時左右 | 數據結構 | |
第四周 | 對聯通二維數組的最大子數和自閉了 | 多看些算法,不然寫題目用什么方法去解決都弄不清 | 基礎題目10分鍾,挑戰作業現在都在自閉中 | 迭代器 |
結對編程感想:發現了自己許多不足的地方,和搭檔觀察程序時漏掉了許多小細節導致一些簡單的錯誤找了很久,必須加強自己對程序的理解,提高和搭檔的合作性,往互補,競爭,求知的方面走,這樣能夠盡快提升自己的合作能力還有編程能力,一個人的力量始終有限,所以不能單獨的去死想,多一個人多一種想法,必須實時貫徹這種互補互利的搭檔性質的活動,可以讓自己和搭檔獲得更多的提升!
(挑戰作業是魔鬼!!!是魔鬼!!啊啊啊啊,awsl,一個月多看兩本書后再來挑戰這道題吧,現在的我還是太菜了QAQ)