C语言程序设计(王立柱)第三章答案 指针和数组

简介: 只有聪明人才能看见的摘要~( ̄▽ ̄~)~

 1

#include<stdio.h>
int IndexOfMax(const int* p, int n);
void Selection(int* p, int n);
void OutputArray(const int* p, int n);
void SwapByAddress(int* a, int* b);
int main() {
  int a[10];
  int i;
  printf("Enter 10 integers:\n");
  for (i = 0; i < 10; i++) {
    scanf_s("%d", a + i);
  }
  Selection(a, 10);
  OutputArray(a, 10);
  return 0;
}
int IndexOfMax(const int* p, int n) {
  int i;
  int max = 0;
  for (i = 1; i < n; i++) {
    if (p[max] < p[i])
      max = i;
  }
  return max;
}
void Selection(int* p, int n) {
  int max;
  while (n > 1) {
    max = IndexOfMax(p, n);
    SwapByAddress(p+max, p+n-1);
    n--;
  }
}
void OutputArray(const int* p, int n) {
  for (int i = 0; i < n; i++)
    printf("%d\t", p[i]);
  printf("\n");
}
void SwapByAddress(int* a, int* b) {
  int temp;
  temp = *a;
  *a = *b;
  *b = temp;
}

image.gif

2,3题

#include<stdio.h>
int IndexOfMin(const int* p, int n);
void Selection(int* p, int n);
void OutputArray(const int* p, int n);
void SwapByAddress(int* a, int* b);
int main() {
  int a[10];
  int i;
  printf("Enter 10 integers:\n");
  for (i = 0; i < 10; i++) {
    scanf_s("%d", a + i);
  }
  Selection(a, 10);
  OutputArray(a, 10);
  return 0;
}
int IndexOfMin(const int* p, int n) {
  int i;
  int min = 0;
  for (i = 1; i < n; i++) {
    if (p[min] > p[i])
      min = i;
  }
  return min;
}
void Selection(int* p, int n) {
  int min;
  int temp = n;
  while (n > 1) {
    min = IndexOfMin(p + temp - n, n) + temp - n;
    //返回的min是后面部分数组的index,而不是原本数组的index
    SwapByAddress(p + min, p + temp - n);
    n--;
  }
}
void OutputArray(const int* p, int n) {
  for (int i = 0; i < n; i++)
    printf("%d\t", p[i]);
  printf("\n");
}
void SwapByAddress(int* a, int* b) {
  int temp;
  temp = *a;
  *a = *b;
  *b = temp;
}

image.gif

4,5,6题

#include<stdio.h>
void BubbleDown(int p[], int n);
void BubbleUp(int p[], int n);
void UpDown(int p[], int n);
void OutputArray(const int* p, int n) {
  for (int i = 0; i < n; i++)
    printf("%d\t", p[i]);
  printf("\n");
}
void SwapByAddress(int* a, int* b) {
  int temp;
  temp = *a;
  *a = *b;
  *b = temp;
}
int main() {
  const int num = 10;
  int a[10];
  printf("Enter %d integers:\n", num);
  for (int i = 0; i < num; i++) {
    scanf_s("%d", a + i);
  }
  //for (int i = 0; i < num; i++)
  //  BubbleUp(a + i, num - i);
  //for (int i = 0; i < num; i++)
  //  BubbleDown(a, num - i);
  int i = 0;
  int j = num;
  for (; i < j; i++, j--)
    UpDown(a + i, j - i);
  OutputArray(a, 10);
  return 0;
}
void BubbleDown(int p[], int n) {
  for (int i = 0; i < n - 1; i++) {
    if (p[i] > p[i + 1])
      SwapByAddress(p + i, p + i + 1);
  }
}
void BubbleUp(int p[], int n) {
  for (int i = n - 1; i >= 0; i--) {
    if (p[i] < p[i - 1])
      SwapByAddress(p + i, p + i - 1);
  }
}
void UpDown(int p[], int n) {
  BubbleUp(p, n);
  BubbleDown(p + 1, n - 1);
}

image.gif

7

#include<stdio.h>
void Partition1(int p[], int n);
void Partition2(int p[], int n);
void OutputArray(const int* p, int n) {
  for (int i = 0; i < n; i++)
    printf("%d\t", p[i]);
  printf("\n");
}
void SwapByAddress(int* a, int* b) {
  int temp;
  temp = *a;
  *a = *b;
  *b = temp;
}
int main() {
  const int num = 10;
  int a[10];
  printf("Enter %d integers:\n", num);
  for (int i = 0; i < num; i++) {
    scanf_s("%d", a + i);
  }
  //支点为第一个元素
  Partition2(a, num);
  OutputArray(a, 10);
  return 0;
}
void Partition1(int p[], int n) {
  int* a;
  int* b;
  int* c;
  a = (int*)malloc(n * sizeof(int));
  b = (int*)malloc(n * sizeof(int));
  c = (int*)malloc(n * sizeof(int));
  int temp = p[0];
  for (int i = 1; i < n; i++) {
    if (temp >= p[i])
      a[i] = p[i], c[i] = 0;
    else
      b[i] = p[i], c[i] = 1;
  }
  int ai = 0;
  for (int i = 0; i < n; i++)
    if (c[i] == 0)
      p[ai++] = a[i];
  p[ai++] = temp;
  for (int i = 0; i < n; i++)
    if (c[i] == 1)
      p[ai++] = b[i];
  free(a);
  free(b);
  free(c);
}
void Partition2(int p[], int n) {
  int i = 0;
  int j = n - 1;
  while (i != j)
  {
    if (p[i] < p[i + 1])
    {
      SwapByAddress(p + i + 1, p + j);
      j--;
    }
    else
    {
      SwapByAddress(p + i + 1, p + i);
      i++;
    }
  }
}

image.gif

8

#include<stdio.h>
#include<stdlib.h>
int main() {
  int n;
  printf("Enter an integer:\n");
  scanf_s("%d", &n);
  int* a;
  a = (int*)calloc(n + 1, sizeof(int));
  if (a == 0)
  {
    printf("allocation failure!\n");
    exit(1);
  }
  a[0] = a[1] = 1;
  for (int i = 2; i < n + 1; i++)
    if (a[i] == 0)
      for (int j = i + 1; j < n + 1; j++)
        if (j % i == 0)
          a[j] = 1;
  int hang = 0;
  for (int i = 0; i < n + 1; i++)
    if (a[i] == 0)
      if ((hang % 5 != 0) || (hang == 0))
      {
        printf("%d\t", i);
        hang++;
      }
      else
      {
        printf("\n");
        hang = 0;
      }
  free(a);
  return 0;
}

image.gif

9

这里有个问题,不管把函数声明定义,函数指针声明定义怎么改,只要不是在定义函数指针时直接赋值,都会出现问题C2373,一直查不到问题所在

#include<stdio.h>
int indexofmax(const int* p, int n) {
  int i = 1;
  int max = 0;
  for (; i < n; i++)
    if (p[max] < p[i])
      max = i;
  return max;
}
int (*pofi)(const int*, int) = indexofmax;
void Selection(int* p, int n) {
  int max;
  int temp;
  while (n > 1) {
    max = pofi(p, n);
    temp = p[max];
    p[max] = p[n - 1];
    p[n - 1] = temp;
    n--;
  }
}
void (*pofs)(int* ,int) = Selection;
void OutputArray(const int* p, int n) {
  for (int i = 0; i < n; i++)
    printf("%d\t", p[i]);
  printf("\n");
}
int main() {
  int a[10];
  printf("Enter 10 integers:\n");
  for (int i = 0; i < 10; i++) {
    scanf_s("%d", a + i);
  }
  (*pofs)(a, 10);
  OutputArray(a, 10);
  return 0;
}

image.gif

目录
相关文章
|
5天前
|
存储 C语言
C语言32位或64位平台下指针的大小
在32位平台上,C语言中指针的大小通常为4字节;而在64位平台上,指针的大小通常为8字节。这反映了不同平台对内存地址空间的不同处理方式。
|
1天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
17 5
|
4天前
|
存储
如何使用指针数组来实现动态二维数组
指针数组可以用来实现动态二维数组。首先,定义一个指向指针的指针变量,并使用 `malloc` 为它分配内存,然后为每个子数组分配内存。通过这种方式,可以灵活地创建和管理不同大小的二维数组。
|
4天前
|
存储
如何通过指针数组来实现二维数组?
介绍了二维数组和指针数组的概念及其区别,详细讲解了如何使用指针数组模拟二维数组,包括定义与分配内存、访问和赋值元素、以及正确释放内存的步骤,适用于需要动态处理二维数据的场景。
|
4天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
5天前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
5天前
|
C语言
C语言指针(3)
C语言指针(3)
9 1
|
5天前
|
C语言
C语言指针(2)
C语言指针(2)
9 1
|
8天前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
|
10天前
魔法指针 之 二级指针 指针数组
魔法指针 之 二级指针 指针数组
13 1