本次作業頭
|
|
這個作業屬於哪個課程 |
C語言程序設計 |
這個作業要求在哪里 |
第六周作業 |
我在這個課程的目標是什么 |
掌握指針的定義及其運用 |
這個作業在那個具體方面幫助我實現目標 |
讓我更加了解指針的定義及其運用,區別指針和數組的關系 |
參考文獻 |
無 |
基礎作業
函數題:求兩數平方根之和
函數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 sum;
sum=sqrt(*a)+sqrt(*b);
return sum;
}
2)設計思路

3)本題遇到的問題及其解決方法
問題:求和變量sum數據類型定義錯誤造成答案錯誤
解決方法:把sum類型定義成double類型!
4)運行結果

程序題:利用指針返回多個函數值
讀入n個整數,調用max_min()函數求這n個數中的最大值和最小值。
輸入格式:
輸入有兩行: 第一行是n值; 第二行是n個數。
輸出格式:
輸出最大值和最小值。
輸入樣例:
在這里給出一組輸入。例如:
5
8 9 12 0 3
輸出樣例:
在這里給出相應的輸出。例如:
max = 12
min = 0
1)我的代碼
#include<stdio.h>
void max_min(int a[],int n,int *pmax,int *pmin);
int main (void)
{
int n,i,N,a[100],max,min;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
max_min(a,n,&max,&min);/*&max和&min代表在此處取地址,在調用函數時把地址給*pmax和*pmin*/
printf("max = %d\nmin = %d",max,min);
return 0;
}
void max_min(int a[],int n,int *pmax,int *pmin)
{
int i,j,max,min,t;
/*冒泡排序*/
for(i=1;i<n;i++)
for(j=0;j<n-i;j++)
if(a[j]>a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
/*通過指針返回最大值和最小值*/
*pmax=a[n-1];
*pmin=a[0];
}
2)設計思路

3)本題遇到的問題及其解決方法
問題:這題的難度對我而言在於思路的問題,剛開始想思路的時候,我希望每輸入一個數字就調用一次函數。后來發現這思路對我來說實施很困難!有很多的因素限制着我;
解決方法:通過定義一個數組,先把所有的數字都放在數組中,然后再把數組調用給自定義函數,這樣可以一次性在自定義函數中對所有數字進行處理。
4)運行結果

預習作業
函數題:最小數放前最大數放后
為一維數組輸入10個整數;將其中最小的數與第一個數對換,將最大的數與最后一個數對換;輸出數組元素。。
函數接口定義:
void input(int *arr,int n);
void max_min(int *arr,int n);
void output(int *arr,int n);
三個函數中的 arr和n 都是用戶傳入的參數。n 是元素個數。
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<10;i++)
scanf("%d",arr+i);
}
/*尋找數組中的最小值和最大值*/
void max_min(int *arr,int n)
{
int i,index=0,flag=0,t;
/*尋找最小值*/
for(i=1;i<n;i++)
if(*(arr+i)<*(arr+index)) /*arr指向數組第一個數字即a[0],所以*(arr+indenx)指向a[index]*/
index=i;
/*最小值和第一個數字交換*/
t=*(arr+index);
*(arr+index)=*arr;
*(arr)=t;
/*尋找最大值*/
for(i=1;i<n;i++)
if(*(arr+flag)<*(arr+i)) /*arr指向數組第一個數字即a[0],所以*(arr+indenx)指向a[index]*/
flag=i;
t=*(arr+flag);
*(arr+flag)=*(arr+9); /* *(arr+9)指向a[9],最大值和最后一個數字交換即a[9] */
*(arr+9)=t;
}
void output(int *arr,int n)
{
int i;
for (i=0;i<10;i++)
printf("%3d",*(arr+i)); /*輸出交換后的數組*/
}
2)設計思路

3)本題調試遇到的問題及其解決方法
問題太多了,首先你得有良好的思路,其次你得清楚明白指針的定義,運用及其指針和數組的關系,關鍵是你得知道如何用編譯器的調試功能發現你自己錯在哪里!
4)運行結果

思考題
為什么要用指針?它有什么用?
其實你去網上找這個問題的答案,發現也沒有什么好的定義。他們也只是通過對比突出指針的作用,說的也是大同小異。於是我在教材書本上找到這段話,它包含了這個題的答案;①可以利用指針實現儲存空間的動態分配。如果事先不確定需要處理的數據數量,你會選擇估計一個上限,並將該上限作為數組的長度,這常常會造成空間的浪費,而指針可以很好的解決這個問題!②指針是C語言中一個非常重要的概念,也是C語言的特色之一。③使用指針可以對復雜數據進行處理,能對計算機的內存分配進行控制。④在函數調用中使用指針還可以返回多個值。
指針變量在內存中暫用多大的空間?它的大小由什么決定?
我某論壇上找到這個答案!指針變量在內存中占用的內存是由編譯器的操作位數決定的。你是32位操作系統那就占4個字節!

二,學習進度條
周/日期 |
這周所花的時間 |
代碼行 |
學到的知識點簡介 |
目前比較困惑的問題 |
3/9-3/15 |
240min |
100 |
文件建立及其文件的利用 |
|
3/15-3/18 |
240min |
200 |
二位數組和暴力解法 |
最大子數組最優的解法是什么,如何降低時間復雜度 |
3/18-3/19 |
250min |
250 |
選擇排序法 |
我沒有完全消化選擇排序法的思路 |
3/19-3-27 |
200min |
100 |
字符串數組的定義及其運用 |
怎么尋找二維數組最大子數組的和 |
3/27-4/2 |
240min |
200 |
指針的定義及其運用 |
|

三、學習感悟
本周的作業難度比上次簡單一點(個人感覺)。這周作業布置比較合理。作業不易太難,太難的作業違背了作業真實的目的。作業本來是用來鞏固課堂上學到的知識點。最好的作業應當是把課堂上的知識點面面俱到。
四、結對編程
發現問題,解決問題!

