一、第八章习题8(p222-p228),8.1-8.3全做,8.4-8.12中选做四道,8.13-8.19中选做三道,要求给出所选择题目的程序及执行结果。
8-1(1)、
#include <stdio.h>
void Func(int x)
{
    x=20;
}
int main()
{
    int x=10;
    Func(x);
    printf("%d",x);
    return 0;
}
结果:
分析:调用函数时只发生值的传递,形参与实参之间再也没有关系,子函数一旦退出,内部变量就释放空间
(2)
#include <stdio.h>
void Func(int b[])
{
    int j;
    for(j=0; j<4; j++)
    {
        b[j]=j;
    }
}
int main()
{
    static int a[] = {5,6,7,8},i;
    Func(a);
    for(i=0; i<4; i++)
    {
        printf("%d",a[i]);
    }
    return 0;
}
结果:
分析:数组传递时向函数传递的是数组的地址值,实参与形参共享空间,在被调函数中对数组进行修改就会造成主函数中的数组也被修改。
8.2(1)
int PositiveNum(int a[],int n)
{
    int i,count=0;
    for(i=0; i<n; i++)
    {
        if(a[i]>0) count++;
    }
    return count;
}
(2)
void Fib(long f[],int n)
{
    int i;
    f[0]=0;
    f[1]=1;
    for(i=2; i<n; i++)
    {
        f[i]=f[i-1]+f[i-2];
    }
}
(3)
#include <stdio.h>
int main()
{
    int a[10],n,max,min,maxPos,minPos;
    for(n=0; n<10; n++)
    {
        scanf("%d",&a[n]);
    }
    max=min=a[0];
    maxPos=minPos=0;
    for(n=0; n<10; n++)
    {
        if(a[n]>max)
        {
            max=a[n];
            maxPos=n;
        }
        else if(a[n]<min)
        {
            min=a[n];
            minPos=n;
        }
    }
    printf("max=%d,pos=%d\n",max,maxPos);
    printf("min=%d,pos=%d\n",min,minPos);
    return 0;
}
结果:
(4)
#include <stdio.h>
#define ROW 2
#define COL 3
MultiplyMatrix(int a[ROW][COL],int b[COL][ROW],int c[ROW][ROW])
{
    int i,j,k;
    for(i=0; i<ROW; i++)
    {
        for(j=0; j<ROW; j++)
        {
            c[i][j]=0;
            for(k=0; k<COL; k++)
            {
                c[i][j]=c[i][j]+a[i][k]*b[k][j];
            }
        }
    }
}
void PrintMatrix(int a[ROW][ROW])
{
    int i,j;
    for(i=0; i<ROW; i++)
    {
        for(j=0; j<ROW; j++)
        {
            printf("%6d",a[i][j]);
        }
        printf("\n");
    }
}
int main()
{
    int a[ROW][COL],b[COL][ROW],c[ROW][ROW],i,j;
    printf("Input 2*3 matrix a:\n");
    for(i=0; i<ROW; i++)
    {
        for(j=0; j<COL; j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    printf("Input 3*2 matrix b:\n");
    for(i=0; i<COL; i++)
    {
        for(j=0; j<ROW; j++)
        {
            scanf("%d",&b[i][j]);
        }
    }
    MultiplyMatrix(a,b,c);
    printf("Results:\n");
    PrintMatrix(c);
    return 0;
}
结果:
8-3、
viod DivArray(int pArray[],int n)
{
    int i;
    for (i=0; i<n; i++)
    {
        pArray[i]/=pArray[0];
    }
}
错误分析:原代码中定义了一个未初始化的指针,而不是数组,有可能会使指针访问到不该访问的内存空间,造成危险,应该定义数组,对数组中的数进行修改操作。
8-6、
#include <stdio.h>
#define N 40
int Readscore(int score[], long num[]);
int FindMax(int score[],long num[],int n);
void main()
{
    int score[N];
    long num[N];
    int n;
    int m;
    n=Readscore(score,num);    /*接收人数*/
    m=FindMax(score,num,n);
    printf("最高的成绩:%d\n学号为:%ld\n",score[m],num[m]);
}
int Readscore(int score[], long num[])
{
    int i=-1;
    do{
        i++;
        printf("请输入学号:");
        scanf("%ld",&num[i]);
        printf("请输入成绩:");
        scanf("%d",&score[i]);
    }while(score[i]>=0 && num[i]>=0);
    return i;
}
int FindMax(int score[],long num[],int n)
{
    int i;
    int k;
   
    int max=score[0];
    for(i=0; i<n; i++)
    {
        if(score[i]>max)
        {
            max=score[i];
            k=i;
        }
    }
    return k;
}
结果:
8-7
#include <stdio.h>
void Sort(int score[]);
void Readscore(int score[]);
void main()
{
    int score[10];
    Readscore(score);
    Sort(score);
}
void Readscore(int score[])
{
    int i;
    for(i=0; i<10; i++)
    {
        printf("input score: ");
        scanf("%d",&score[i]);
    }
}
void Sort(int score[])
{
    int i;
    int k,p;
    int temp;
    int max=score[0];
    int min=score[0];
    for(i=0; i<10; i++)
    {
        if(score[i]>max)
        {
            max=score[i];
            k=i;
        }
        else if(score[i]<min)
        {
            min=score[i];
            p=i;
        }
    }
    temp=score[k];
    score[k]=score[p];
    score[p]=temp;
    for(i=0; i<10; i++)
    {
        printf("%d ",score[i]);
    }
    printf("\n");
}
结果:
8-10
#include <stdio.h>
void main()
{
    int i;
    int n;
    int j;
    int a[10][10];
    int sum1=0;
    int sum2=0;
    printf("请输入维数n (n<=10): ");
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            printf("请输入元素a[%d][%d]:",i,j);
            scanf("%d",&a[i][j]);
        }
        printf("\n");
    }
    for(i=0; i<n; i++)
    {
        sum1+=a[i][i];
        sum2+=a[i][n-1-i];
    }
    printf("主对角线之和:%d\n副对角线之和:%d\n",sum1,sum2);
}
结果:
8-12
#include <stdio.h>
void main()
{
    int a[7][7];
    int i;
    int j;
    for(i=0; i<7; i++) /*使对角线上、第一列的数均为1*/
    {
        a[i][i]=1;
        a[i][0]=1;
    }
    for(i=2; i<7; i++)  /*计算中间的数*/
    {
        for(j=1; j<i; j++)
        {
            a[i][j]=a[i-1][j-1]+a[i-1][j];       
        }
    }
    for(i=0; i<7; i++)  /*打印杨辉三角形*/
    {
        for(j=0; j<=i; j++)
        {
            printf("%d  ",a[i][j]);
        }
        printf("\n");
    }
}#include <stdio.h>
void main()
{
    int a[7][7];
    int i;
    int j;
    for(i=0; i<7; i++)printf函数括号内参数的构成解说
    {
        a[i][i]=1;
        a[i][0]=1;
    }
    for(i=2; i<7; i++)
    {
        for(j=1; j<i; j++)
        {
            a[i][j]=a[i-1][j-1]+a[i-1][j];       
        }
    }
    for(i=0; i<7; i++)
    {
        for(j=0; j<=i; j++)
        {
            printf("%d  ",a[i][j]);
        }
        printf("\n");
    }
}
结果:
8-13
#include <stdio.h>
long Fibonacci(int n);
void main()
{
    long m;
    m=Fibonacci(12);
    printf("%ld\n",m);
}
long Fibonacci(int n)
{
    if(n==0)
        return 0;
    else if(n==1)
        return 1;
    else
        return Fibonacci(n-1)+Fibonacci(n-2);
}
结果
8-14
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
    float a=0,b=0,c=0,d=0,e=0,f=0;
    int i;
    int m;
    srand(time(NULL));  /*注意:只能将产生随机数种子写在循环外面*/
    for(i=0; i<6000; i++)
    {
        m=rand()%6+1;
               
        switch (m)
        {
            case 1:
                a++;
                break;
            case 2:
                b++;
                break;
            case 3:
                c++;
                break;
            case 4:
                d++;
                break;
            case 5:
                e++;
                break;
            case 6:
                f++;
                break;
        }
    }
   
    printf("面数:--1------2------3------4------5------6--\n");
    printf("概率:%.2f%% %.2f%% %.2f%% %.2f%% %.2f%% %.2f%%",a/6000,b/6000,c/6000,d/6000,e/6000,f/6000);
}
结果:
8-15
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void ProduceNum(int num[]);
void GuessNum(int guess[]);
void PanZhengWu(int num[], int guess[], int result[]);
void main()
{
    int num[4];
    int guess[4];
    int result[2];
    int i;
    int n;
    int flag=0;
    ProduceNum(num);
    printf("请输入您想猜的次数: ");
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        GuessNum(guess);
        PanZhengWu(num, guess, result);
       
        if(result[0]==4)
        {
            printf("Congradulations!\n");
            flag=1;
            break;
        }
    }
    if(flag==0)
    {
        printf("Sorry! You haven't guess the right number!\n");
    }
}
/*功能:产生4位相异的数字放入num【4】中
  入口参数:无
  返回值:无
*/
void ProduceNum(int num[])
{
    int flag=0;
    int i,j;
    srand(time(NULL));
    do{
        num[0]=rand()%10;
        num[1]=rand()%10;
        num[2]=rand()%10;
        num[3]=rand()%10;
        for(i=0; i<4; i++)
        {
            for(j=i+1; j<4; j++)
            {
                if(num[i]==num[j])  /*判断是否产生4个完全相异的数字*/
                    flag=1;
            }
        }
        //if(flag==0)
            //printf("%d %d %d %d\n",num[0],num[1],num[2],num[3]);
    }while(flag);
}
/*功能:用户输入所猜的数并存入guess【4】中
  入口参数:无
  返回值:无
*/
void GuessNum(int guess[])
{
    int i;
    printf("\n");
    printf("请输入4位您猜的数:\n");
    for(i=0; i<4; i++)
    {
        printf("输入第 %d 个数: ",i+1);
        scanf("%d",&guess[i]);
    }
}
/*功能:判断猜数正误
  入口参数:计算机产生的数、用户猜的数
  返回值:无
*/
void PanZhengWu(int num[], int guess[], int result[])
{
    int i;
    int x=0;
    int y=0;
    int j;
    for(i=0; i<4; i++)
    {
        if(num[i]==guess[i]) /*数字对且位置对*/
            x++;
        for(j=0; j<4; j++)
        {
            if(num[i]==guess[j])  /*数字对(含有位置对和位置不对的两种情况)*/
                y++;
        }
    }
    y=y-x;
   
    result[0]=x;
    result[1]=y;
    printf("猜测结果:%dA%dB\n",result[0],result[1]);
}
结果:
二、收集资料,总结数组(包括一维数组和二维数组)作为函数参数时应注意的问题,以及参数传递的特点。
向函数传递数组时,只需使用不带方括号的的数组名作为函数实参调用即可(即:仅仅用一个数组名,不带方括号和下标)
注意:
1、由于数组名代表数组第一个元素的地址,因此用数组名作为函数实参实际上是将数组的首地址传给被调函数
2、将数组的首地址传给被调函数后,形参与实参数组具有相同的首地址,实际上占用相同的存储空间
3、在被调函数中修改形参数组元素时,实际上相当于修改是参数组中的元素
4、数组作函数形参时,数组的长度可不出现在数组名的方括号内,通常用另一个整型实参来制定数组的长度
成绩
批阅教师
批阅日期

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。