鱼C论坛

 找回密码
 立即注册
查看: 243|回复: 10

C语言作业

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

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

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

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

使用道具 举报

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

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

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

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

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

以下是实现这些步骤的代码示例:
#include <stdio.h>

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

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

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

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

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

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

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

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

    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

    int saddlePointFound = 0;

    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            int isRowMax = 1;
            int isColMin = 1;

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

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

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

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

    return 0;
}

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-6 15:58:03 | 显示全部楼层
代码如下:
#include <stdio.h>

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

    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            int is_max_in_row = 1;
            int is_min_in_col = 1;

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

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

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

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

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


为什么说int matrix[rows][cols];表达式的结果不为常数
想知道小甲鱼最近在做啥?请访问 -> 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;`)的值来初始化需要常量表达式的地方,比如静态数组的大小,这会导致错误,因为变量的值在编译时是不可知的。
   
int size = 10;  // 非常量,因为它是变量
   int array[size]; // 错误:数组大小需要常量

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

解决这些问题的一种方法是使用宏定义或 `const` 关键字:
#define SIZE 10
int array[SIZE]; // 正确:使用预处理器宏定义的常量

const int cSize = 10;
int array2[cSize]; // C99起这也是可以的,因为cSize是const

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-6 20:20:17 | 显示全部楼层


错误        C2036        “int [rows][cols]”: 未知的大小       
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

### 1. 未提供数组大小
在C语言中,定义数组时需要指定数组的大小(除非在初始化时给出足够的信息来推断大小)。
int array[]; // 错误:数组大小未知
解决方案:
int array[10]; // 正确:提供了数组大小

或者使用初始化列表:
int array[] = {1, 2, 3, 4}; // 正确:从初始化元素推断数组大小

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

结构体中不允许:
struct Example {
    int array[]; // 错误:结构体成员需明确大小
};
解决方案:可考虑使用指针或者灵活数组成员(C99):
struct Example {
    int size;
    int array[]; // C99的灵活数组成员,需有具体实例大小
};

函数参数情况,那是不会引发编译错误的,因为函数参数中的数组会退化为指针:
void function(int array[]) {
    // 这里没问题,因为它实际上是int *array;
}

### 3. 使用typedef声明数组
在使用 `typedef` 声明数组类型时,需要提供大小,即使是在 `typedef` 声明中:
typedef int IntArray[]; // 错误:未知大小
解决方案:
typedef int IntArray[10]; // 正确:指定已知大小

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-6 20:20:53 | 显示全部楼层
FishC 发表于 2024-11-6 20:12
在C语言中,仅仅声明 `int matrix;` 这样的变量并不涉及所谓“表达式的结果是否为常数”的问题,因为这 ...




错误        C2036        “int [rows][cols]”: 未知的大小
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

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

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

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

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

1. **全局或静态数组需要明确大小**:
   如果有如下定义:
int array; // 错误:需要指定大小
   确保在定义时指定一个大小:
int array[10]; // 定义一个大小为10的数组

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

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

   // 确保在使用之前有完整的定义
   struct IncompleteType {
       int member;
   };

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

#define MAX 256

int main(void)
{
        int c , d[MAX][MAX] , e , f , i , j , k , r                                      ;
        printf("input c and r : ")                                                       ;
        scanf("%d%d" , & c , & r)                                                        ;
        for(i = 0 ; i < r ; i ++) {
                printf("input the elements for column %d : " ,  i + 1)                   ;
                for(j = 0 ; j < r ; j ++) scanf("%d" , & d[i][j])                        ;
        }
        for(f = i = 0 ; ! f && i < c ; i ++) {
                for(k = 0 , j = 1 ; j < r ; j ++) if(d[i][j] > d[i][k]) k = j            ;
                for(e = 0 , j = 0 ; j < r ; j ++) if(d[i][j] == d[i][k]) e ++            ;
                if(e == 1) {
                        for(j = 0 ; j < c ; j ++) if(j != i && d[j][k] <= d[i][k]) break ;
                        if(j == c) {
                                printf("the element [%d][%d] = %d\n" , i , k , d[i][k])  ;
                                f = 1                                                    ;
                        }
                }
        }
        if(! f) printf("not found !\n")                                                  ;
}
        编译、运行实况:
D:\[exercise]\C>g++ -static -o x x.c

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

D:\[exercise]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 17:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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