鱼C论坛

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

C语言作业

[复制链接]
发表于 2024-11-6 09:42:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在二维数组中,若某一位置上的元素在该行中最大,而在该列中最小,则该元素即为该二维数组的一个鞍点。要求从键盘上输入一个二维数组,当鞍点存在时,把鞍点找出来。
#include<stdio.h>
int main()
{
/*完成统计*/
return0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 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 15:58:03 | 显示全部楼层
代码如下:
  1. #include <stdio.h>

  2. int main() {
  3.    
  4.     int found = 0; // 标记是否找到鞍点

  5.     for (int i = 0; i < rows; i++) {
  6.         for (int j = 0; j < cols; j++) {
  7.             int is_max_in_row = 1;
  8.             int is_min_in_col = 1;

  9.             // 检查是否是该行的最大值
  10.             for (int k = 0; k < cols; k++) {
  11.                 if (arr[i][k] > arr[i][j]) {
  12.                     is_max_in_row = 0;
  13.                     break;
  14.                 }
  15.             }

  16.             // 检查是否是该列的最小值
  17.             for (int k = 0; k < rows; k++) {
  18.                 if (arr[k][j] < arr[i][j]) {
  19.                     is_min_in_col = 0;
  20.                     break;
  21.                 }
  22.             }

  23.             // 如果同时满足行最大和列最小,则找到鞍点
  24.             if (is_max_in_row && is_min_in_col) {
  25.                 printf("鞍点位于第 %d 行,第 %d 列,值为 %d\n", i + 1, j + 1, arr[i][j]);
  26.                 found = 1;
  27.             }
  28.         }
  29.     }

  30.     if (!found) {
  31.         printf("该二维数组没有鞍点。\n");
  32.     }

  33.     return 0;
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-6 20:12:38 | 显示全部楼层
FishC 发表于 2024-11-6 10:15
要找到二维数组中的鞍点,我们需要遍历找出每个元素,并判断它是否是其所在行中的最大值且是其所在列中的最 ...


为什么说int matrix[rows][cols];表达式的结果不为常数
小甲鱼最新课程 -> 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:17 | 显示全部楼层


错误        C2036        “int [rows][cols]”: 未知的大小       
小甲鱼最新课程 -> 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:20:53 | 显示全部楼层
FishC 发表于 2024-11-6 20:12
在C语言中,仅仅声明 `int matrix;` 这样的变量并不涉及所谓“表达式的结果是否为常数”的问题,因为这 ...




错误        C2036        “int [rows][cols]”: 未知的大小
小甲鱼最新课程 -> 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
回复 支持 反对

使用道具 举报

发表于 2024-11-14 17:52:40 | 显示全部楼层
本帖最后由 jackz007 于 2024-11-14 23:54 编辑
  1. #include <stdio.h>

  2. #define MAX 256

  3. int main(void)
  4. {
  5.         int c , d[MAX][MAX] , e , f , i , j , k , r                                      ;
  6.         printf("input c and r : ")                                                       ;
  7.         scanf("%d%d" , & c , & r)                                                        ;
  8.         for(i = 0 ; i < r ; i ++) {
  9.                 printf("input the elements for column %d : " ,  i + 1)                   ;
  10.                 for(j = 0 ; j < r ; j ++) scanf("%d" , & d[i][j])                        ;
  11.         }
  12.         for(f = i = 0 ; ! f && i < c ; i ++) {
  13.                 for(k = 0 , j = 1 ; j < r ; j ++) if(d[i][j] > d[i][k]) k = j            ;
  14.                 for(e = 0 , j = 0 ; j < r ; j ++) if(d[i][j] == d[i][k]) e ++            ;
  15.                 if(e == 1) {
  16.                         for(j = 0 ; j < c ; j ++) if(j != i && d[j][k] <= d[i][k]) break ;
  17.                         if(j == c) {
  18.                                 printf("the element [%d][%d] = %d\n" , i , k , d[i][k])  ;
  19.                                 f = 1                                                    ;
  20.                         }
  21.                 }
  22.         }
  23.         if(! f) printf("not found !\n")                                                  ;
  24. }
复制代码

        编译、运行实况:
  1. D:\[exercise]\C>g++ -static -o x x.c

  2. D:\[exercise]\C>x
  3. input c and r : 3 3
  4. input the elements for column 1 : 66 76 99
  5. input the elements for column 2 : 33 24 88
  6. input the elements for column 3 : 10 36 52
  7. the element [2][2] = 52

  8. D:\[exercise]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-28 09:24:44 | 显示全部楼层
  1. #include<stdio.h>

  2. int main() {
  3.         int I,J;
  4.         scanf("%d %d",&I,&J);
  5.         int array[I][J];
  6.         int i,j,k;
  7.         printf("Give me a %d x %d array\n", I, J);

  8.         for (i = 0; i < I; i++)//输入数组
  9.         {
  10.                 for (j = 0; j < J; j++)
  11.                 {
  12.                         printf("The array[%d][%d] = ", i, j);
  13.                         scanf("%d", &array[i][j]);
  14.                 }
  15.         }

  16.         int time = 0;
  17.         for ( i = 0; i < I; i++)
  18.         {
  19.                 int max = array[i][0];
  20.                 int place;
  21.                 int canOutPut = 1;
  22.                 for ( j = 0; j < J; j++)//找出每行最大值及其所在列
  23.                 {
  24.                         if (array[i][j] > max) {
  25.                                 max = array[i][j];
  26.                                 place = j;
  27.                         }       
  28.                 }
  29.                 for (k = 0; k < I; k++)//与该列其他数比较
  30.                 {
  31.                         if (array[k][place] < max)
  32.                         {
  33.                                 canOutPut = 0;
  34.                                 break;
  35.                         }
  36.                 }

  37.                 if (canOutPut == 1) {
  38.                         printf("%d\n\n", max);
  39.                         time++;
  40.                 }
  41.         }

  42.         printf("There are(is) %d saddle number!", time);
  43. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-3-11 23:40:45 | 显示全部楼层
本帖最后由 太安 于 2025-3-12 00:55 编辑
  1. #include <stdio.h>

  2. int main() {

  3.     //定义二维数组
  4.     int A,B; //二维数组的行和列
  5.     printf("请输入你的二维数组的行和列:");
  6.     scanf("%d %d",&A,&B);
  7.     int a[A][B];  //C99标准规定的变长数组.注意该代码在visual studio中是不能运行的,因为msvc编译器不支持变长数组,需要GCC等编译器

  8.   // 输入数据
  9. for (int i=0;i<A;i++) {
  10.     for (int j=0;j<B;j++) {
  11.         printf("输入第%d行,第%d列数据:",i,j);
  12.         scanf("%d",&a[i][j]);
  13.     }
  14.     printf("\n");
  15. }


  16.     //遍历二维数组
  17.     for (int i = 0; i < A; i++) {
  18.         //寻找行中最大值。思路:固定住行,循环当前行的列
  19.         int m=i,n=0; //用来记录当前元素的行标和列标。m是行标,n是列标
  20.         int maxline = a[m][n]; //这里假设a[i][0]当前行的第一个元素是最大值
  21.         for (int j = 1; j < B; j++) {
  22.             if (maxline<a[i][j]) maxline = a[i][j]; //如果有元素大于假设元素,那么就用这个元素替换了假设元素
  23.         }

  24.         //寻找列中最大小。思路:固定住列,循环当前列的行
  25.         int p=0,q=i;//用来记录当前元素的行标和列标。p是行标,q是列标
  26.         int minrow=a[p][q]; //假设a[0][i]是当前列中的最小值
  27.         for (int j = 1; j < B; j++) {
  28.             if (minrow>a[i][j]) minrow = a[i][j]; //如果a[i][j]比我们假设的最小值还小,就用a[i][j]替换假设的最小值
  29.         }

  30.         if (p==m&&q==n)printf("靶点是:%d\n",maxline);
  31.     }

  32.     return 0;
  33. }
复制代码



我假设的数据是:
1 5 3 4
5 9 7 8
3 8 5 2

运行结果:
  1. 请输入你的二维数组的行和列:3 4
  2. 输入第0行,第0列数据:1
  3. 输入第0行,第1列数据:5
  4. 输入第0行,第2列数据:3
  5. 输入第0行,第3列数据:4

  6. 输入第1行,第0列数据:5
  7. 输入第1行,第1列数据:9
  8. 输入第1行,第2列数据:7
  9. 输入第1行,第3列数据:8

  10. 输入第2行,第0列数据:3
  11. 输入第2行,第1列数据:8
  12. 输入第2行,第2列数据:5
  13. 输入第2行,第3列数据:2

  14. 靶点是:5
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-3-12 01:01:16 | 显示全部楼层
本帖最后由 太安 于 2025-3-12 01:05 编辑
wc8576 发表于 2024-11-6 20:12
为什么说int matrix[rows][cols];表达式的结果不为常数


因为int matrix[rows][cols]这种形式是C99定义的变长数组。
但微软的MSVC编译器不支持这种写法,也就是微软的visual studio集成开发环境不支持。

你可以使用gcc编译器,gcc编译器支持。


你可以用jetbrains的Clion继承开发环境,这个软件,可以使用多个编译器。可以在MSVC(visual studio就使用的这个编译器,毕竟自己人肯定用自家的东西)与GCC或其他编译器之间来回切换。(这个软件似乎没有社区版,只有专业版。你是学生的话,可以通过学生认证免费使用。)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-10 00:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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