wc8576 发表于 2024-11-6 09:42:40

C语言作业

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

FishC 发表于 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;
    printf("请输入二维数组元素:\n");
    for (int i = 0; i < rows; i++) {
      for (int j = 0; j < cols; j++) {
            scanf("%d", &array);
      }
    }

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

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

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

      // 检查该最大值在其列中是否是最小值
      int minInCol = 1; // 假设是最小值
      for (int k = 0; k < rows; k++) {
            if (array < 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 小助理,如未能正确解答您的问题,请继续追问。

FishC 发表于 2024-11-6 10:15:45

要找到二维数组中的鞍点,我们需要遍历找出每个元素,并判断它是否是其所在行中的最大值且是其所在列中的最小值。以下是完成这个功能的代码示例:

#include <stdio.h>

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

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

    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 > matrix) {
                  isRowMax = 0;
                  break;
                }
            }

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

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

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

    return 0;
}

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

峥途 发表于 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 > arr) {
                  is_max_in_row = 0;
                  break;
                }
            }

            // 检查是否是该列的最小值
            for (int k = 0; k < rows; k++) {
                if (arr < arr) {
                  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);
                found = 1;
            }
      }
    }

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

    return 0;
}

wc8576 发表于 2024-11-6 20:12:38

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


为什么说int matrix;表达式的结果不为常数

FishC 发表于 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; // 错误:数组大小需要常量

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

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wc8576 发表于 2024-11-6 20:20:17



错误        C2036        “int ”: 未知的大小       

FishC 发表于 2024-11-6 20:20:25

wc8576 发表于 2024-11-06 20:20
错误        C2036        “int ”: 未知的大小

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

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

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

int array[]; // 错误:数组大小未知
解决方案:

int array; // 正确:提供了数组大小

或者使用初始化列表:

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; // 正确:指定已知大小

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wc8576 发表于 2024-11-6 20:20:53

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




错误      C2036      “int ”: 未知的大小

FishC 发表于 2024-11-6 20:21:13

wc8576 发表于 2024-11-06 20:20
错误      C2036      “int ”: 未知的大小

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

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

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

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

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

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

1. **全局或静态数组需要明确大小**:
   如果有如下定义:
   int array; // 错误:需要指定大小
   确保在定义时指定一个大小:
   int array; // 定义一个大小为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;
   FixedArray array; // 正确:有明确的大小指定

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-11-14 17:52:40

本帖最后由 jackz007 于 2024-11-14 23:54 编辑

#include <stdio.h>

#define MAX 256

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

D:\\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 = 52

D:\\C>

一打几 发表于 2024-11-28 09:24:44

#include<stdio.h>

int main() {
      int I,J;
      scanf("%d %d",&I,&J);
        int array;
        int i,j,k;
        printf("Give me a %d x %d array\n", I, J);

        for (i = 0; i < I; i++)//输入数组
        {
                for (j = 0; j < J; j++)
                {
                        printf("The array[%d][%d] = ", i, j);
                        scanf("%d", &array);
                }
        }

        int time = 0;
        for ( i = 0; i < I; i++)
        {
                int max = array;
                int place;
                int canOutPut = 1;
                for ( j = 0; j < J; j++)//找出每行最大值及其所在列
                {
                        if (array > max) {
                                max = array;
                                place = j;
                        }       
                }
                for (k = 0; k < I; k++)//与该列其他数比较
                {
                        if (array < max)
                        {
                                canOutPut = 0;
                                break;
                        }
                }

                if (canOutPut == 1) {
                        printf("%d\n\n", max);
                        time++;
                }
        }

        printf("There are(is) %d saddle number!", time);
}
页: [1]
查看完整版本: C语言作业