第六周作業


本次作業頭

這個作業屬於哪個課程 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 是元素個數。

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

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 指針的定義及其運用

三、學習感悟

本周的作業難度比上次簡單一點(個人感覺)。這周作業布置比較合理。作業不易太難,太難的作業違背了作業真實的目的。作業本來是用來鞏固課堂上學到的知識點。最好的作業應當是把課堂上的知識點面面俱到。

四、結對編程

發現問題,解決問題!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM