C语言程序设计现代方法P181练习题

4.编写下列函数:

 
  
  1. void swap(int *p, int *q); 

当传递两个变量的地址时,swap函数应该交换两个变量的值:

 
  
  1. swap(&i, &j);/* exchange values of i and j */ 


#include
void swap(int *p, int *q);


int main(void)
{
    int i, j, *m, *n;


    scanf("%d %d", &i, &j);
    m = &i;
    n = &j;;


    swap(m, n);
    printf("%d %d\n", i, j);
    return 0;
}


void swap(int *p, int *q)
{
    int t;


    t = *p;
    *p = *q;
    *q = t;
}


8.编写下列函数:

 
  
  1. int *find_largest(int a[], int n); 

当传入长度为n的数组a时,函数将返回指向数组最大元素的指针。

#includeint *find_largest(int a[], int n);int main(void){    int i, b, a[3], y;    scanf("%d",&b);    for(i = 0; i < b; i++)    {        scanf("%d", &a[i]);    }    y = *find_largest(a, b);   //注意此处,输出直接输出y即可,前面不需要加*。  why?? 因为y又不是指针呀!    printf("%d\n", y);    return 0;}int *find_largest(int a[], int n){    int max = 0, i;    for(i = 0; i < n; i++)    {        if(a[max] < a[i])        {            max = i;        }    }    return &a[max];}

12.编写下面的函数:

 
  
  1. void find_two_largest(const int *a, int n, int *largest,  
  2.     int *second_largest); 

a指向长度为n的数组。函数从数组中找出最大和第二大的元素,并把它们分别存储到由largest和second_largest指向的变量中。要求使用指针算术运算而不是取下标来访问数组元素。

正确做法:

#include
#define N 10


void find_two_largest(int a[], int n, int *largest, int *second_largest);


int main(void)
{
    int i, n, *p, *q, a[N];


    scanf("%d", &n);


    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    p = NULL;
    q = NULL;  // 指针一定要初始化, 要不然这两处会出现两个warnning;
    find_two_largest(a, n, p, q);
    return 0;
}


void find_two_largest(int a[], int n, int *largest, int *second_largest)
{
    int i, mark1, mark2;


    mark1 = 0; //用mark来标记下标
    mark2 = 0;


    for(i = 0; i < n; i++)
    {
        if(a[mark1] < a[i])
        {
            mark1 = i;
        }
    }
    largest = &a[mark1];


    for(i = 0; i < mark1; i++)
    {
        if(a[i] != a[mark1]  && a[mark2] < a[i])
        {
            mark2 = i;
        }
    }
    for(i = mark1 + 1; i < n; i++)
    {
        if(a[i] != a[mark1] && a[mark2] < a[i])
        {
            mark2 = i;
        }
    }
    second_largest = &a[mark2];


    printf("%d %d\n", *largest, *second_largest);
}



错误做法!!!!!!!


#include


void find_two_largest(int a[], int n, int *largest, int *second_largst);


int main(void)
{
    int a[10], i, n, *p, *q;


    scanf("%d", &n);
    for(i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    p = &a[0];
    q = &a[0];
    find_two_largest(a, n, p, q);
    return 0;
}


void find_two_largest(int a[], int n, int *largest, int *second_largest)
{
    int i, m;


    for(i = 0; i < n; i++)
    {
        if(*largest < a[i])
        {
            *largest = a[i];   //这种思路从一开始就是错的,因为*largest -> a[0]的值, 因此就会改变a[0], 的值,所以此种做法是错误的。
            m = i;
        }
    }


    for(i = 0; i < m; i++)
    {
          if(*second_largest < a[i])
          {
              *second_largest = a[i];
          }
    }
    for(i = m + 1; i < n; i++)
    {
          if(*second_largest < a[i])
          {
              *second_largest = a[i];
          }
    }
    printf("%d %d\n", *largest, *second_largest);
}


你可能感兴趣的:(C语言程序设计现代方法)