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

目录
相关文章
|
26天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
81 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
26天前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
50 9
|
26天前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
43 7
|
26天前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
83 6
|
1月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
55 5
|
29天前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
1月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
107 3
|
1月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
1月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
42 1
|
1月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。