鱼C论坛

 找回密码
 立即注册
查看: 1533|回复: 13

C语言作业

[复制链接]
发表于 2024-11-6 10:13:57 | 显示全部楼层
找出二维数组中的鞍点需要以下步骤:

1. **定义和输入二维数组**:
   - 从用户输入获取二维数组的大小和元素。

2. **遍历每一行找出行中最大值**:
   - 遍历每行,找出该行的最大值及其对应的列索引。

3. **验证行中最大值在其列中是否为最小值**:
   - 对于每个行中最大值,检查该最大值所在的列是否为该列的最小值。

4. **输出鞍点**:
   - 如果找到鞍点,则输出其值和位置;如果没有找到,输出没有鞍点的提示。

以下是实现这些步骤的代码示例:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.     int rows, cols;
  5.     printf("请输入二维数组的行数和列数:");
  6.     scanf("%d %d", &rows, &cols);

  7.     int array[rows][cols];
  8.     printf("请输入二维数组元素:\n");
  9.     for (int i = 0; i < rows; i++) {
  10.         for (int j = 0; j < cols; j++) {
  11.             scanf("%d", &array[i][j]);
  12.         }
  13.     }

  14.     int found = 0;  // 标志是否找到鞍点

  15.     for (int i = 0; i < rows; i++) {
  16.         int maxInRow = array[i][0];
  17.         int maxColIndex = 0;

  18.         // 找出当前行中最大值及其列索引
  19.         for (int j = 1; j < cols; j++) {
  20.             if (array[i][j] > maxInRow) {
  21.                 maxInRow = array[i][j];
  22.                 maxColIndex = j;
  23.             }
  24.         }

  25.         // 检查该最大值在其列中是否是最小值
  26.         int minInCol = 1; // 假设是最小值
  27.         for (int k = 0; k < rows; k++) {
  28.             if (array[k][maxColIndex] < maxInRow) {
  29.                 minInCol = 0; // 不是最小值
  30.                 break;
  31.             }
  32.         }

  33.         // 如果是在行中最大且在列中最小,则是鞍点
  34.         if (minInCol) {
  35.             printf("找到鞍点:array[%d][%d] = %d\n", i, maxColIndex, maxInRow);
  36.             found = 1;
  37.             // 如果只需要第一个鞍点,找到后可以选择直接退出
  38.             // break;
  39.         }
  40.     }

  41.     if (!found) {
  42.         printf("没有找到鞍点。\n");
  43.     }

  44.     return 0;
  45. }
复制代码


这段代码遍历输入的二维数组,比较每个行中最大值在所在列中的位置,看它是否是该列的最小值,以此确定是否为鞍点。注意要处理没有找到鞍点的情况。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-6 10:15:45 | 显示全部楼层
要找到二维数组中的鞍点,我们需要遍历找出每个元素,并判断它是否是其所在行中的最大值且是其所在列中的最小值。以下是完成这个功能的代码示例:

  1. #include <stdio.h>

  2. int main() {
  3.     int rows, cols;
  4.     printf("请输入数组的行数和列数:");
  5.     scanf("%d %d", &rows, &cols);

  6.     int matrix[rows][cols];
  7.     printf("请输入数组的元素:\n");
  8.     for (int i = 0; i < rows; i++) {
  9.         for (int j = 0; j < cols; j++) {
  10.             scanf("%d", &matrix[i][j]);
  11.         }
  12.     }

  13.     int saddlePointFound = 0;

  14.     for (int i = 0; i < rows; i++) {
  15.         for (int j = 0; j < cols; j++) {
  16.             int isRowMax = 1;
  17.             int isColMin = 1;

  18.             // 检查该元素是否为行中的最大值
  19.             for (int k = 0; k < cols; k++) {
  20.                 if (matrix[i][k] > matrix[i][j]) {
  21.                     isRowMax = 0;
  22.                     break;
  23.                 }
  24.             }

  25.             // 检查该元素是否为列中的最小值
  26.             for (int k = 0; k < rows; k++) {
  27.                 if (matrix[k][j] < matrix[i][j]) {
  28.                     isColMin = 0;
  29.                     break;
  30.                 }
  31.             }

  32.             // 如果是鞍点,输出位置和值
  33.             if (isRowMax && isColMin) {
  34.                 printf("鞍点位于(%d, %d) 位置,值为 %d\n", i, j, matrix[i][j]);
  35.                 saddlePointFound = 1;
  36.             }
  37.         }
  38.     }

  39.     if (!saddlePointFound) {
  40.         printf("该数组没有鞍点。\n");
  41.     }

  42.     return 0;
  43. }
复制代码


### 代码说明:
1. 首先输入二维数组的行数和列数,以及各个元素。
2. 对于每个元素,分别检查它是否是它所在行的最大值和它所在列的最小值。
3. 如果一个元素同时满足这两个条件,则将其视为鞍点。
4. 如果找到鞍点,输出鞍点的位置和数值;如果没有找到,则提示“该数组没有鞍点”。

希望这个示例能帮助你理解如何在二维数组中找到鞍点。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-6 20:12:49 | 显示全部楼层
wc8576 发表于 2024-11-06 20:12
为什么说int matrix;表达式的结果不为常数


在C语言中,仅仅声明 `int matrix;` 这样的变量并不涉及所谓“表达式的结果是否为常数”的问题,因为这只是一个变量声明而不是一个表达式。

然而,如果在其他上下文中遇到“表达式的结果不为常数”的错误,通常是因为某个地方需要一个常量表达式。例如,定义数组大小、`switch` 语句中的 `case` 标签或初始时用来初始化 `enum` 类型时都需要常量表达式。

在这种情况下,"表达式的结果不为常数" 的错误可能源于以下原因:

1. **变量初始化问题**:
   - 如果试图使用变量(如 `int matrix;`)的值来初始化需要常量表达式的地方,比如静态数组的大小,这会导致错误,因为变量的值在编译时是不可知的。
   
  
  1. int size = 10;  // 非常量,因为它是变量
  2.    int array[size]; // 错误:数组大小需要常量
复制代码


2. **使用常量表达式的地方**:
   - 确保使用的任何表达式计算结果在编译时是已知的。常量表达式通常包括字面值常量、`const` 修饰的整数和枚举常量等。

解决这些问题的一种方法是使用宏定义或 `const` 关键字:

  1. #define SIZE 10
  2. int array[SIZE]; // 正确:使用预处理器宏定义的常量

  3. const int cSize = 10;
  4. int array2[cSize]; // C99起这也是可以的,因为cSize是const
复制代码


如果你的具体问题还涉及其他上下文,可以提供更多细节以便更有针对性地给予帮助。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-6 20:20:25 | 显示全部楼层
wc8576 发表于 2024-11-06 20:20
错误        C2036        “int ”: 未知的大小


这个错误信息表明在某个地方使用了 `int` 类型,没有为其指定明确的大小。这通常发生在试图定义数组而未能提供有效大小的情况下。

以下是一些可能导致该错误的场景以及解决方案:

### 1. 未提供数组大小
在C语言中,定义数组时需要指定数组的大小(除非在初始化时给出足够的信息来推断大小)。

  1. int array[]; // 错误:数组大小未知
复制代码

解决方案:

  1. int array[10]; // 正确:提供了数组大小
复制代码


或者使用初始化列表:

  1. int array[] = {1, 2, 3, 4}; // 正确:从初始化元素推断数组大小
复制代码


### 2. 变量定义在不允许不确定大小的地方
如果在结构体中定义不确定大小的数组,或者把不确定大小的数组当作形参传递,可能遇到类似问题。

结构体中不允许:
  1. struct Example {
  2.     int array[]; // 错误:结构体成员需明确大小
  3. };
复制代码

解决方案:可考虑使用指针或者灵活数组成员(C99):

  1. struct Example {
  2.     int size;
  3.     int array[]; // C99的灵活数组成员,需有具体实例大小
  4. };
复制代码


函数参数情况,那是不会引发编译错误的,因为函数参数中的数组会退化为指针:

  1. void function(int array[]) {
  2.     // 这里没问题,因为它实际上是int *array;
  3. }
复制代码


### 3. 使用typedef声明数组
在使用 `typedef` 声明数组类型时,需要提供大小,即使是在 `typedef` 声明中:

  1. typedef int IntArray[]; // 错误:未知大小
复制代码

解决方案:

  1. typedef int IntArray[10]; // 正确:指定已知大小
复制代码


确认一下你的程序中是否存在这样的数组定义问题,根据错误提示的位置,检查相应代码并调整数组的定义,使其有明确大小或使用合法的定义方式。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-6 20:21:13 | 显示全部楼层
wc8576 发表于 2024-11-06 20:20
错误        C2036        “int ”: 未知的大小


错误 C2036 表示正在尝试使用一个类型(例如一个数组或指针),但编译器无法确定它的实际大小。这种情况很常见于以下几个方面:

1. **不完全类型使用**:
   这是一个典型错误,可能是由于试图使用不完全的类型(如不完全定义的结构体或未初始化大小的数组)。

2. **未正确实例化的数组**:
   试图定义或操作一个没有指定大小或没有明确初始化的数组。

3. **指针误用**:
   可能是在指针操作时,没有对应内存管理,涉及到未初始化或不正确的缓冲区访问。

以下是具体的一些检查和解决措施:

### 检查点和解决方案:

1. **全局或静态数组需要明确大小**:
   如果有如下定义:
  
  1. int array; // 错误:需要指定大小
复制代码

   确保在定义时指定一个大小:
  
  1. int array[10]; // 定义一个大小为10的数组
复制代码


2. **局部数组使用初始化列表**:
  
  1. int array[] = {1, 2, 3}; // 从初始化列表中推测大小
复制代码


3. **结构体使用不完全声明**:
   如果涉及结构体,在使用前确保全部声明完成:
  
  1. struct IncompleteType;  // 声明

  2.    // 确保在使用之前有完整的定义
  3.    struct IncompleteType {
  4.        int member;
  5.    };
复制代码


4. **指针和内存管理**:
   确认指针指向有效的内存区域,并已正确分配内存(如果动态分配)。
  
  1. int *ptr = malloc(sizeof(int) * 10); // 动态分配一个大小为10的整数数组
  2.    if (ptr == NULL) {
  3.        // 错误处理
  4.    }
复制代码


5. **检查使用类型化定义(typedef)**:
  
  1. typedef int FixedArray[10];
  2.    FixedArray array; // 正确:有明确的大小指定
复制代码


6. **函数参数类型**:
   确定函数参数声明为类型而不是具体大小的数组(参数总被当作指针)。
  
  1. void processArray(int *array) { // 这里总作为指针
  2.        // 操作数组
  3.    }
复制代码


如果还不清楚问题出现在哪里,考虑通过提供完整的代码或上下文,以便更准确地进行诊断和提供解决方案。确保仔细检查错误提示的位置,并对相关代码做对应修正,如调整未指定大小的问题或结构体的完整性。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-22 19:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表