C Prime Plus中文第六版编程题——第十章练习

1.修改程序清单10.7的rain.c程序,用指针进行计算(仍然要声明并初始 化数组)。

#include <stdio.h>
#include <stdlib.h>
#define MONTHS 12
#define YEARS 5
int main()
{
    const float rain[YEARS][MONTHS]={
        {4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6},
        {8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3},
        {9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4},
        {7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2},
        {7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2}
    };
    int year,month;
    float subtot,total;
    printf("Year       rainfall (inches)\n");
    for (year=0,total=0 ; year<YEARS ; year++)
                {
         for(month=0,subtot=0;month<MONTHS;month++)
                    subtot += *(*(rain+year)+month);
                    printf("%5d %15.1f\n",2010+year,subtot);
                    total+= subtot;
                }
                printf("\n The yearly average is %.1f inches.\n\n",total/YEARS);
                printf("Monthly average:\n\n");
                printf("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\n");
                for(month=0;month<MONTHS;month++){
                    for(year=0, subtot=0 ; year<YEARS; year++)
                        subtot+= *(*(rain+year)+month);
                        printf("%4.1f",subtot/YEARS);
                      }
                   printf("\n");
    return 0;
}

在这里插入图片描述


2.编写一个程序,初始化一个double类型的数组,然后把该数组的内容 拷贝至3个其他数组中(在main()中声明这4个数组)。使用带数组表示法的 函数进行第1份拷贝。使用带指针表示法和指针递增的函数进行第2份拷贝。 把目标数组名、源数组名和待拷贝的元素个数作为前两个函数的参数。第3 个函数以目标数组名、源数组名和指向源数组最后一个元素后面的元素的指 针。也就是说,给定以下声明,则函数调用如下所示:
double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
double target1[5];
double target2[5];
double target3[5];
copy_arr(target1, source, 5);
copy_ptr(target2, source, 5);
copy_ptrs(target3, source, source + 5);

#include <stdio.h>
#include <stdlib.h>
void copy_arr(double ar[],double source[],int n);
void copy_ptr(double *target,double *source,int n );
void copy_ptrs(double *target ,double *start ,double *end);
void put_shuzu(double *p,int n,int number);
int main()
{
    double source[5]={1.1, 2.2, 3.3, 4.4, 5.5};
    double target1[5];
    double target2[5];
    double target3[5];
     copy_arr(target1, source, 5); 
     copy_ptr(target2, source, 5); 
     copy_ptrs(target3, source, source + 5);
     put_shuzu(target1,5,1);
     put_shuzu(target2,5,2);    
     put_shuzu(target3,5,3);    
    
}
void copy_arr(double ar[],double source[],int n ){
for(int i=0;i<n;i++){
              ar[i]=source[i];}
}
void copy_ptr(double *target,double *source,int n ){
    for(int i=0;i<n;i++){
              *(target+i)=*(source+i);}
}
void copy_ptrs(double *target ,double *start ,double *end){
           for(int j=0;start+j<end;j++){
                 *(target+j)=*(start+j);  
                 }
}
void put_shuzu(double *p,int n,int number){
     for(int i=0;i<n;i++){
              printf("target%d[%d]=%.2lf ",number,i, *(p+i));
           }
             printf("\n");
}

在这里插入图片描述


3.编写一个函数,返回储存在int类型数组中的最大值,并在一个简单的程序中测试该函数。

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
int return_max(int p[],int n);
int main()
{
    int max;
    int number[SIZE]={18,24,3,41,5,36,7,48,-12,-1};
    max=return_max(number,SIZE);
    printf("max=%d",max);
    return 0;
}
int return_max(int p[],int n){
    int maximum=p[n-1];
    for(int i=0;i<n-1;i++)
    {
        if(p[i]>maximum)
           maximum=p[i];
     }
    return maximum;
}

在这里插入图片描述


4.编写一个函数,返回储存在double类型数组中最大值的下标,并在一 个简单的程序中测试该函数。

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
int max_index(int p[],int n);
int main()
{
    int  index;
    int number[SIZE]={8,64,3,41,5,36,7,48,-12,-1};
    index=max_index(number,SIZE);
    printf("max=number[%d]",index);
    return 0;
}
int max_index(int p[],int n){
    int maximum=p[n-1];
    int index=0;
    for(int i=0;i<n-1;i++)
    {
        if(p[i]>maximum)
          { maximum=p[i];
           index=i;}
     }
    return index;
}

在这里插入图片描述


5.编写一个函数,返回储存在double类型数组中最大值和最小值的差值,并在一个简单的程序中测试该函数。

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
double diff(double *p,int n);
int main()
{
    double ar[SIZE]={1.11111,2.22222,3.33333,
                   4.44444,5.55555,6.66666,
                   7.77777,8.88888,9.99999,10.11111};
    printf("The D-value is %lf",diff(ar,SIZE));
    return 0;
}

double diff(double *p,int n){
            double min=p[0];
            double max=p[0];
        for(int i=1;i<n;i++)
        {if(p[i]>max)
             max=p[i];
         if(p[i]<min)
             min=p[i];
        }
        return max-min;
}

在这里插入图片描述


6.编写一个函数,把double类型数组中的数据倒序排列,并在一个简单 的程序中测试该函数。

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
void order_reserve(double *p,int n);
int main()
{
    double ar[SIZE]={1,2,3,4,5,6,7,8,9,10};
printf(" Originally,\nar= {");
     for(int j=0;j<SIZE;j++)
     {
         printf(" %-10.6lf",ar[j]);
     }
     printf("}\n");
                order_reserve(ar,SIZE);
printf("    Then,\nar= {");
     for(int j=0;j<SIZE;j++)
     {
         printf(" %-10.6lf",ar[j]);
     }
     printf("}");
    return 0;
}
void order_reserve(double *p,int n){
          double temp;
      for(int i=0;i<n/2;i++){
          temp=p[i];
          p[i]=p[n-1-i];//n为奇数时,a[n/2]正好是中心位置,循环在此之前结束,中点数没有
          p[n-1-i]=temp;//和其他数交换; n为偶数时,a[n/2]是后面一半的第一个数,循环在此
      }                 //之前结束。
    
}

在这里插入图片描述


7…编写一个程序,初始化一个double类型的二维数组,使用编程练习2中的一个拷贝函数把该数组中的数据拷贝至另一个二维数组中(因为二维数组是数组的数组,所以可以使用处理一维数组的拷贝函数来处理数组中的每个子数组)。

#include <stdio.h>
#include <stdlib.h>
#define ROW 4
#define COLUMN 4
 void copy_ptrs(double *target ,double *start ,double *end);
int main()
{
   double array_a[ROW][COLUMN]={  {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16} };
   double array_b[ROW][COLUMN];
   for(int i=0;i<ROW;i++){
       copy_ptrs(array_b[i],array_a[i],array_a[i]+COLUMN);} 
                   /*   zippo[i]是数组zippo[i]中第一个元素zippo[i][0]的地址,zippo[i]+就得到
                     zippo[i][j]的地址;zippo得到的是zippo[0]的地址,zippo+i得到的是zippo[i]的地址*/
           printf("array_b[%d][%d]={ ",ROW,COLUMN);
            for(int i=0;i<ROW;i++){
                  for(int j=0;j<COLUMN;j++){
                      printf("%-4.1lf%c ",array_b[i][j],(i*j==9)?' ':',');
                  }
            }
            printf("}");
     return 0;                         
}         
 void copy_ptrs(double *target ,double *start ,double *end){
           for(int j=0;start+j<end;j++){
                 *(target+j)=*(start+j);  }//该函数只能执行一个数组的copy,要全部完成需要循环ROW次
}

在这里插入图片描述


8.使用编程练习2中的拷贝函数,把一个内含7个元素的数组中第3~第5个元素拷贝至内含3个元素的数组中。该函数本身不需要修改,只需要选择合适的实际参数(实际参数不需要是数组名和数组大小,只需要是数组元素的地址和待处理元素的个数)。

#include <stdio.h>
#include <stdlib.h>
void copy_arr(double ar[],double source[],int n );
int main()
{
    double shuzu[7]={1,2,3,4,5,6,7};
      double target[3];
      copy_arr(target,&shuzu[2],3 );
      printf("target[3]={");
       for(int i=0;i<3;i++)
            printf("%lf%c ",target[i],(i==2)?' ':',');
            printf("}");
}
void copy_arr(double ar[],double source[],int n ){
for(int i=0;i<n;i++){
              ar[i]=source[i];}
}

在这里插入图片描述


9.编写一个程序,初始化一个double类型的3×5二维数组,使用一个处理 变长数组的函数将其拷贝至另一个二维数组中。还要编写一个以变长数组为形参的函数以显示两个数组的内容。这两个函数应该能处理任意N×M数组 (如果编译器不支持变长数组,就使用传统C函数处理N×5的数组)。

#include <stdio.h>
#include <stdlib.h>
void copy_vla(int row,int column,double origin[row][column],double then[row][column]);
void show_array(int row,int column,double shuzu[row][column]);
int main (){
    double source[2][5]={ {1,2,3,4,5}, {6,7,8,9,10} };
    double target[2][5];
    printf("For source,");
    show_array(2,5,source);
   copy_vla(2,5,source,target);
    printf("For target,");
    show_array(2,5,target);
    return 0;
}

void show_array(int row,int column,double shuzu[row][column]){
    printf(" array={ ");
    for(int i=0;i<row;i++){
         for(int j=0;j<column;j++){
             printf( "%-3.1lf%c ", shuzu[i][j],  ( (i+1)*(j+1)==row*column)?' ':','  );
         }
    }
    printf("}\n");
}

void copy_vla(int row,int column,double origin[row][column],double then[row][column]){
     for(int i=0;i<row;i++){
         for(int j=0;j<column;j++){
             then[i][j]=origin[i][j];
         }}
}

在这里插入图片描述


10.编写一个函数,把两个数组中相对应的元素相加,然后把结果储存到第3个数组中。也就是说,如果数组1中包含的值是2、4、5、8,数组2中包含的值是1、0 、4、6,那么该函数把3、4、9、14赋给第3个数组。函数接受3个数组名和一个数组大小。在一个简单的程序中测试该函数。

#include <stdio.h>
#include <stdlib.h>
void sum_array(int *ar1, int *ar2, int *sum, int n);
int main()
{
    int array_1[4]={2,4,5,8};
    int array_2[4]={1,0,4,6};
    int sum_ar[4];
    int i=0;
     sum_array(array_1,array_2,sum_ar,4);
     while(i<4){
          printf("sum_ar[%d]=%d ",i,sum_ar[i]);
          i++;
     }
    return 0;
}
void sum_array(int *ar1, int *ar2, int *sum, int n){
           for(int i=0;i<4;i++){
               *(sum+i)=*(ar1+i)+*(ar2+i); }
}

在这里插入图片描述


11.编写一个程序,声明一个int类型的3×5二维数组,并用合适的值初始化它。该程序打印数组中的值,然后各值翻倍(即是原值的2倍),并显示出各元素的新值。编写一个函数显示数组的内容,再编写一个函数把各元素 的值翻倍。这两个函数都以数组数名和行数作为参数。

#include <stdio.h>
#include <stdlib.h>
double_ar(int ar[][5],int row);
show_ar(int rr[][5],int row);
int main()
{
    int source[3][5]={  {1,2,3,4,5},  {6,7,8,9,10},  {11,12,13,14,15}  };
     double_ar(source,3);
     show_ar(source,3);
    return 0;
}
double_ar(int ar[][5],int row){
      for(int i=0;i<row;i++){
      for(int j=0;j<5;j++){
                      ar[i][j]*=2;  
            }
        }
}
show_ar(int rr[][5],int row){
    printf("array={");
     for(int i=0;i<row;i++){
      for(int j=0;j<5;j++){
          printf("%d%c ",rr[i][j], ( (i+1)*(j+1)==row*5)?' ':',');
                          }}
                          printf("}\n");
}

在这里插入图片描述


12.重写程序清单10.7的rain.c程序,把main()中的主要任务都改成用函数来完成。

#include <stdio.h>
#include <stdlib.h>
#define MONTHS 12
#define YEARS 5
void show_rain_per_year(float ar[][MONTHS],float subtotal[],int year);
void show_yearly_average(float ar[],int n);
void rain_average_monthly(float ar[][MONTHS],int month,int year);
int main()
{
    const float rain[YEARS][MONTHS]={
        {4.3, 4.3, 4.3, 3.0, 2.0, 1.2, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6},
        {8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.3},
        {9.1, 8.5, 6.7, 4.3, 2.1, 0.8, 0.2, 0.2, 1.1, 2.3, 6.1, 8.4},
        {7.2, 9.9, 8.4, 3.3, 1.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 6.2},
        {7.6, 5.6, 3.8, 2.8, 3.8, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 5.2} 
                                     };
            float rain_subtot[YEARS];
           show_rain_per_year(rain,rain_subtot,YEARS);
             show_yearly_average(rain_subtot,YEARS);
             rain_average_monthly(rain,MONTHS,YEARS);
    return 0;
}
void show_rain_per_year(float ar[][MONTHS],float subtotal[],int year){
         printf("Year       rainfall (inches)\n");
         for (int i=0; i<year ; i++){
                    subtotal[i]=0;
             for(int j=0; j<MONTHS; j++){
                    subtotal[i] += ar[i][j];}
                    printf("%5d %15.1f\n",2010+i,subtotal[i]);}
                                    }
void show_yearly_average(float ar[],int n){
        float sum=0;
        for(int i=0;i<n;i++)
              sum+=ar[i];
              printf("\nThe yearly average is %.1lf inches.\n",sum/n);
}
void rain_average_monthly(float ar[][MONTHS],int month,int year){
                float subtot_month[month];
                        printf("Monthly average:\n\n");
                printf(" Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec\n");
                 for(int i=0;i<month;i++)
                 {
                     subtot_month[i]=0;
                     for(int j=0;j<year;j++)
                      {
                          subtot_month[i]+=ar[j][i];
                      }
                      printf("%4.1f",subtot_month[i]/year);
                 }
}

在这里插入图片描述


13.编写一个程序,提示用户输入3组数,每组数包含5个double类型的数 (假设用户都正确地响应,不会输入非数值数据)。该程序应完成下列任务:
a.把用户输入的数据储存在3×5的数组中
b.计算每组(5个)数据的平均值
c.计算所有数据的平均值
d.找出这15个数据中的最大值
e.打印结果
每个任务都要用单独的函数来完成(使用传统C处理数组的方式)
完成任务b,要编写一个计算并返回一维数组平均值的函数,利用循环调用该函数3次。对于处理其他任务的函数,应该把整个数组作为参数,完成任务c和d的函数应把结果返回主调函数。

#include <stdio.h>
#include <stdlib.h>

void input_shuzu(double shuzu[][5],int row);

void show_array(double shuzu[][5],int row);

double aver_(double shuzu[][5],int row_number);

double total_aver(double ar[],int n);

double fin_max( double arr[][5],int row);
int main()
{    
       double arr[3][5];
       double aver_row[3];
       input_shuzu(arr,3);
       show_array(arr,3);
            for(int i=0;i<3;i++)
            aver_row[i]=aver_(arr,i);
                printf("The total average number=%lf\n",total_aver(aver_row,3));
       printf("The maximum data is :%.2lf\n",fin_max(arr,3));
    return 0;
}
void input_shuzu(double shuzu[][5],int row){
      for(int r=0;r<row;r++){
           printf("Enter the data in row %d:\n",r+1);
          for(int c=0;c<5;c++){
              scanf("%lf",&shuzu[r][c]);
          }
      }
}
void show_array(double shuzu[][5],int row){
      for(int r=0;r<row;r++){
          for(int c=0;c<5;c++){ 
            printf("arr[%d][%d]=%-5.1lf ",r,c,shuzu[r][c]);}
          printf("\n");
       }
}
 double aver_(double shuzu[][5],int row_number){
         double acc=0;
         
         int c=0;
         while(c<5){
             acc+=shuzu[row_number][c];
             c++;
         }
         printf("The average number of line %d=%.2lf\n",row_number+1,acc/5);
         return acc/5;
}
double total_aver(double ar[],int n){
             double sum=0;
             for(int i=0;i<n;i++)
                sum+=ar[i];
                return sum/n;
}
double fin_max( double arr[][5],int row){
           double max=arr[0][0];
           for(int r=0;r<row;r++){  
                  for(int c=0;c<5;c++){
                      if (arr[r][c]>max)
                        max=arr[r][c];
                        }
                }
           return max;
}

在这里插入图片描述


14.以变长数组作为函数形参,完成编程练习13。

#include <stdio.h>
#include <stdlib.h>
void input_shuzu(int row, int column, double shuzu[row][column]);
void show_array(int row, int column, double shuzu[row][column]);
double aver_(int row, int column,double arr[row][column]);
double total_aver(int n,double ar[n]);
double fin_max(int row,int column, double arr[row][column]);
int main()
{    
       double arr[3][5];
       double aver_row[3];
       input_shuzu(3,5,arr);
       show_array(3,5,arr);
            for(int i=0;i<3;i++)
            aver_row[i]=aver_(i,5,arr);
                printf("The total average number=%lf\n",total_aver(3,aver_row));
       printf("The maximum data is :%.2lf\n",fin_max(3,5,arr));
    return 0;
}
void input_shuzu(int row, int column, double shuzu[row][column]){
      for(int r=0;r<row;r++){
           printf("Enter the data in row %d:\n",r+1);
          for(int c=0;c<column;c++){
              scanf("%lf",&shuzu[r][c]);
          }
      }
}
void show_array(int row, int column, double shuzu[row][column]){
         for(int r=0;r<row;r++){
          for(int c=0;c<column;c++){ 
            printf("arr[%d][%d]=%-5.1lf ",r,c,shuzu[r][c]);}
          printf("\n");
       }
}
double aver_(int row, int column,double arr[row][column]){
         double acc=0;
         
         int c=0;
         while(c<column){
             acc+=arr[row][c];
             c++;
         }
         printf("The average number of line %d=%.2lf\n",row+1,acc/column);
         return acc/column;
}
double total_aver(int n,double ar[n]){
             double sum=0;
             for(int i=0;i<n;i++)
                sum+=ar[i];
                return sum/n;
}
double fin_max(int row,int column, double arr[row][column]){
           double max=arr[0][0];
           for(int r=0;r<row;r++){  
                  for(int c=0;c<column;c++){
                      if (arr[r][c]>max)
                        max=arr[r][c];
                        }
                }
           return max;
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目链接: https://pintia.cn/problem-sets/14/problems/779 一、目大意 本要求编写一个函数is_prime(n),判断n是否为素数。若n是素数,则返回True;否则返回False。 二、算法思路 素数指只能被1和自身整除的大于1的正整数。 判断一个数n是否为素数,可以先遍历2到n-1之间的所有数i,若n能被某个i整除,则n不是素数。 但是这种方法的时间复杂度显然过高,不适用于大数判断。 另外一个更高效的算法是“质数筛选法”,即埃拉托斯特尼筛法(Sieve of Eratosthenes)。 该方法的基本思想是从2开始,将每个质数的倍数都标记成合数。一个数如果不是任何数的倍数,则它一定是素数。 步骤如下: 1.先把2作为素数,把2的倍数全部标记为合数。 2.找到下一个未标记的数3,把它作为素数,把3的倍数全部标记为合数。 3.找到下一个未标记的数5,把它作为素数,把5的倍数全部标记为合数。 4.重复步骤2、3直到需要判断的数N的平方根m,若该数为素数,则它没有被除过,即它保留的是初始的值2。 三、代码实现 def is_prime(n): if n < 2: return False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: return False return True 本中只需要实现is_prime函数即可。 is_prime函数首先判断n是否小于2,若是,则不是素数,直接返回False。然后遍历2到n平方根之间的所有数i,若n能被i整除,则n不是素数,返回False。若遍历完所有数都没有返回,则n是素数,返回True。 四、总结 本考察了素数的判断算法,既可以使用暴力枚举的方式,也可以使用高效的质数筛选法。实现过程中需要注意程序的效率和算法的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值