当前位置:   article > 正文

C语言基础(六)

C语言基础(六)

一维数组:

C语言中的数组是一种基本的数据结构,用于在计算机内存中连续存储相同类型的数据。
数组中的每个元素可以通过索引(或下标)来访问,索引通常是从0开始的。

数组的大小在声明时确定,并且之后不能改变(除非使用动态内存分配技术,如指针和malloc/free等)。如果初始化时省略数组的大小,编译器会自动根据初始化列表中元素的数量确定数组的大小。

数组索引越界是C语言中常见的错误。如果尝试访问数组边界之外的元素,程序会崩溃或产生不可预测的行为。
数组的大小在编译时确定,且固定不变。如果需要动态改变数组大小,应考虑使用指针和动态内存分配。
数组名在表达式中通常被当作指向数组首元素的指针。但是,数组名本身并不是一个指针变量,而是一个常量表达式,其值为数组首元素的地址。

测试代码1:

  1. #include <stdio.h>
  2. int main() {
  3. // 定义并初始化一个整型数组
  4. int numbers[5] = {1, 2, 3, 4, 5};
  5. // 访问并打印数组中的每个元素
  6. // 数组下标从0开始
  7. for(int i = 0; i < 5; i++) {
  8. printf("numbers[%d] = %d\n", i, numbers[i]);
  9. }
  10. // 修改数组中的某个元素
  11. numbers[2] = 10; // 将索引为2的元素(即第三个元素)修改为10
  12. // 再次访问并打印修改后的数组元素
  13. printf("After modification:\n");
  14. for(int i = 0; i < 5; i++) {
  15. printf("numbers[%d] = %d\n", i, numbers[i]);
  16. }
  17. // 部分初始化和自动初始化为0
  18. int partialInit[5] = {1, 2}; // 只初始化了前两个元素,其余自动初始化为0
  19. printf("Partially initialized array:\n");
  20. for(int i = 0; i < 5; i++) {
  21. printf("partialInit[%d] = %d\n", i, partialInit[i]);
  22. }
  23. // 使用变量大小,变长数组(VLA)
  24. int size = 3;
  25. int vla[size]; // 变长数组
  26. for(int i = 0; i < size; i++) {
  27. vla[i] = i * 2; // 初始化
  28. }
  29. printf("Variable Length Array:\n");
  30. for(int i = 0; i < size; i++) {
  31. printf("vla[%d] = %d\n", i, vla[i]);
  32. }
  33. return 0;
  34. }

运行结果如下:

 

测试代码2:

  1. #include <stdio.h>
  2. // 冒泡排序
  3. void bubbleSort(int arr[], int n) {
  4. int i, j, temp;
  5. for (i = 0; i < n-1; i++) {
  6. for (j = 0; j < n-i-1; j++) {
  7. if (arr[j] > arr[j+1]) {
  8. temp = arr[j];
  9. arr[j] = arr[j+1];
  10. arr[j+1] = temp;
  11. }
  12. }
  13. }
  14. }
  15. // 选择排序
  16. void selectionSort(int arr[], int n) {
  17. int i, j, minIndex, temp;
  18. for (i = 0; i < n-1; i++) {
  19. minIndex = i;
  20. for (j = i+1; j < n; j++) {
  21. if (arr[j] < arr[minIndex]) {
  22. minIndex = j;
  23. }
  24. }
  25. temp = arr[minIndex];
  26. arr[minIndex] = arr[i];
  27. arr[i] = temp;
  28. }
  29. }
  30. int main() {
  31. //户输入整数以及整数个数
  32. int n, choice, i;
  33. printf("请输入整数的个数: ");
  34. scanf("%d", &n);
  35. int arr[n];
  36. printf("请输入%d个整数:\n", n);
  37. for(i = 0; i < n; i++) {
  38. scanf("%d", &arr[i]);
  39. }
  40. printf("选择排序算法(1: 冒泡排序, 2: 选择排序): ");
  41. scanf("%d", &choice);
  42. //选择排序方式
  43. switch(choice) {
  44. case 1:
  45. bubbleSort(arr, n);
  46. printf("冒泡排序后的数组:\n");
  47. break;
  48. case 2:
  49. selectionSort(arr, n);
  50. printf("选择排序后的数组:\n");
  51. break;
  52. default:
  53. printf("无效的选择,请重新运行程序。\n");
  54. return 1;
  55. }
  56. //打印排序后的数组
  57. for (i = 0; i < n; i++)
  58. printf("%d ", arr[i]);
  59. printf("\n");
  60. return 0;
  61. }

运行结果如下:

 

测试代码3:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. // 函数声明
  5. void generateRandomNumbers(int arr[], int n);
  6. void sortDescending(int arr[], int n);
  7. void insertNumber(int arr[], int *n, int number);
  8. void deleteNumber(int arr[], int *n, int m);
  9. void printArray(int arr[], int n);
  10. int main() {
  11. int n, number, m;
  12. int *arr;
  13. // 初始化随机数生成器
  14. srand(time(NULL));
  15. printf("Enter the number of two-digit integers: ");
  16. scanf("%d", &n);
  17. // 动态分配数组
  18. arr = (int *)malloc(n * sizeof(int));
  19. if (arr == NULL) {
  20. printf("Memory allocation failed!\n");
  21. return 1;
  22. }
  23. // 生成随机数
  24. generateRandomNumbers(arr, n);
  25. printf("Original array:\n");
  26. printArray(arr, n);
  27. // 排序
  28. sortDescending(arr, n);
  29. printf("Sorted array (descending):\n");
  30. printArray(arr, n);
  31. // 插入数字
  32. printf("Enter a number to insert: ");
  33. scanf("%d", &number);
  34. insertNumber(arr, &n, number);
  35. printf("Array after insertion:\n");
  36. printArray(arr, n);
  37. // 删除数字
  38. printf("Enter the index (0-%d) to delete: ", n - 1);
  39. scanf("%d", &m);
  40. if (m >= 0 && m < n) {
  41. deleteNumber(arr, &n, m);
  42. printf("Array after deletion:\n");
  43. printArray(arr, n);
  44. } else {
  45. printf("Invalid index!\n");
  46. }
  47. // 释放内存
  48. free(arr);
  49. return 0;
  50. }
  51. // 实现函数
  52. void generateRandomNumbers(int arr[], int n) {
  53. for (int i = 0; i < n; i++) {
  54. arr[i] = rand() % 90 + 10; // 生成10到99之间的随机数
  55. }
  56. }
  57. //冒泡排序,按降序排列数组
  58. void sortDescending(int arr[], int n) {
  59. for (int i = 0; i < n - 1; i++) {
  60. for (int j = 0; j < n - i - 1; j++) {
  61. if (arr[j] < arr[j + 1]) {
  62. int temp = arr[j];
  63. arr[j] = arr[j + 1];
  64. arr[j + 1] = temp;
  65. }
  66. }
  67. }
  68. }
  69. //在数组中插入一个数,并保持数组的有序性。
  70. void insertNumber(int arr[], int *n, int number) {
  71. int i;
  72. for (i = *n - 1; (i >= 0 && arr[i] < number); i--) {
  73. arr[i + 1] = arr[i];
  74. }
  75. arr[i + 1] = number;
  76. (*n)++;
  77. }
  78. //根据索引删除数组中的一个元素,并调整数组大小。
  79. void deleteNumber(int arr[], int *n, int m) {
  80. for (int i = m; i < *n - 1; i++) {
  81. arr[i] = arr[i + 1];
  82. }
  83. (*n)--;
  84. }
  85. // 打印数组
  86. void printArray(int arr[], int n) {
  87. for (int i = 0; i < n; i++) {
  88. printf("%d ", arr[i]);
  89. }
  90. printf("\n");
  91. }

运行结果如下:

 

测试代码4:

  1. #include <stdio.h>
  2. //一维数组转换为二维数组
  3. //"转换"只是逻辑上的,物理上仍然是一个一维数组。
  4. //确保不要超出数组的实际边界,即index必须在0到total-1之间。
  5. //这种方法在需要动态确定数组大小或数组大小较大时特别有用,
  6. //可以避免使用二维数组可能带来的内存分配问题。
  7. int main() {
  8. int i, j;
  9. int rows = 3; // 3行
  10. int cols = 4; // 4列
  11. int total = rows * cols; // 总元素数量
  12. // 初始化一维数组
  13. int array[total];
  14. for (i = 0; i < total; i++) {
  15. array[i] = i + 1; //将数组元素初始化为1到total的整数
  16. printf("%d ", array[i]);
  17. }
  18. printf("\n");
  19. // 使用二维数组的索引方式访问一维数组
  20. // 通过计算索引(index = i * cols + j)访问一个二维数组。
  21. // i代表行索引,j代表列索引,cols是每行的列数。
  22. for (i = 0; i < rows; i++) {
  23. for (j = 0; j < cols; j++) {
  24. // 计算一维数组中的索引
  25. int index = i * cols + j;
  26. printf("%d ", array[index]);
  27. }
  28. printf("\n"); // 每完成一行的打印后换行
  29. }
  30. return 0;
  31. }

运行结果如下:

 

测试代码5:

  1. #include <stdio.h>
  2. int main() {
  3. // 定义一个5x3的二维数组
  4. int twoDArray[5][3] = {
  5. {1, 2, 3},
  6. {4, 5, 6},
  7. {7, 8, 9},
  8. {10, 11, 12},
  9. {13, 14, 15}
  10. };
  11. // 定义一个足够大的一维数组以存储二维数组的元素
  12. int oneDArray[5 * 3]; // 因为是5x3的二维数组,所以一维数组需要15个元素的空间
  13. // 遍历二维数组,并将元素复制到一维数组中
  14. int index = 0; // 用于一维数组的索引
  15. for (int i = 0; i < 5; i++) { // 遍历二维数组的行
  16. for (int j = 0; j < 3; j++) { // 遍历二维数组的列
  17. oneDArray[index++] = twoDArray[i][j]; // 将二维数组的元素复制到一维数组中,并更新索引
  18. }
  19. }
  20. // 打印一维数组的元素
  21. for (int i = 0; i < 5 * 3; i++) {
  22. printf("%d ", oneDArray[i]);
  23. }
  24. return 0;
  25. }

运行结果如下:

 

 

 

 

 


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/1014081
推荐阅读
相关标签
  

闽ICP备14008679号