1215787625 发表于 2023-12-3 08:26:32

函数调用问题

题目描述
给定m行n列的图像各像素点灰度值,对其依次进行一系列操作后,求最终图像。
其中,可能的操作及对应字符有如下四种:
A:顺时针旋转90度;
B:逆时针旋转90度;
C:左右翻转;
D:上下翻转。

输入
第一行包含两个正整数m和n,表示图像的行数和列数,中间用单个空格隔开。1 <= m <= 100, 1 <= n <= 100。
接下来m行,每行n个整数,表示图像中每个像素点的灰度值,相邻两个数之间用单个空格隔开。灰度值范围在0到255之间。
接下来一行,包含由A、B、C、D组成的字符串s,表示需要按顺序执行的操作序列。s的长度在1到100之间。
输出
m'行,每行包含n'个整数,为最终图像各像素点的灰度值。其中m'为最终图像的行数,n'为最终图像的列数。相邻两个整数之间用单个空格隔开。
样例输入 复制
2 3
10 0 10
100 100 10
AC
样例输出 复制
10 100
0 100
10 10
#include <stdio.h>
#include <string.h>
#pragma warning(disable:4996)
int m, n, i, j;
int dig,a;
char move;
void operate(char c);
int main(void)
{
        scanf("%d%d", &m, &n);//获取行列

        for (i = 0; i < m; i++) {//输入行列
                for (j = 0; j < n; j++) {
                        scanf("%d", &dig);
                }
        }

        scanf("%s", move);//输入操作
        for (i = 0; i < strlen(move); i++) {//开始操作
                operate(move);
        }

        for (i = 0; i < m; i++) {//输出
                for (j = 0; j < n; j++) {
                        printf(j == 0 ? "%d" : " %d", dig);
                }
                putchar('\n');
        }

        return 0;
}
void operate(char c)
{
        for (i = 0; i < m; i++) {//转换
                for (j = 0; j < n; j++) {
                        switch (c) {
                        case 'A':
                                a = dig;       
                                break;
                        case 'B':
                                a = dig;       
                                break;
                        case 'C':
                                a = dig;       
                                break;
                        case 'D':
                                a = dig;       
                                break;
                        }
                }
        }

        if (c == 'A' || c == 'B') {//交换行列
                int tmp = m;
                m = n;
                n = tmp;
        }
       
        for (i = 0; i < m; i++) {//复制
                for (j = 0; j < n; j++) {
                        dig = a;
                }
        }
}
请问为什么我的operate函数在main函数中只调用了一次,不应该是两次吗?

FishC_GPT 发表于 2023-12-3 08:26:53

首先,我们需要先读取输入的m和n,并创建一个大小为m×n的二维数组来表示图像。

m, n = map(int, input().split())
image = [ * n for _ in range(m)]

接下来,我们需要读取每个像素点的灰度值,并将其存储到相应的位置上。

for i in range(m):
    row = list(map(int, input().split()))
    for j in range(n):
      image = row

然后,我们需要依次执行给定的操作。对于每个操作,我们可以使用循环遍历图像的每个像素点,并根据操作类型进行相应的处理。

operations = input().strip()
for op in operations:
    if op == 'A':
      # 顺时针旋转90度
      rotated = [ * m for _ in range(n)]
      for i in range(m):
            for j in range(n):
                rotated = image
      image = rotated
      m, n = n, m
    elif op == 'B':
      # 逆时针旋转90度
      rotated = [ * m for _ in range(n)]
      for i in range(m):
            for j in range(n):
                rotated = image
      image = rotated
      m, n = n, m
    elif op == 'C':
      # 左右翻转
      flipped = [ * n for _ in range(m)]
      for i in range(m):
            for j in range(n):
                flipped = image
      image = flipped
    elif op == 'D':
      # 上下翻转
      flipped = [ * n for _ in range(m)]
      for i in range(m):
            for j in range(n):
                flipped = image
      image = flipped

最后,我们需要输出最终图像的灰度值。

for i in range(m):
    for j in range(n):
      print(image, end=' ')
    print()

完整代码如下:

m, n = map(int, input().split())
image = [ * n for _ in range(m)]

for i in range(m):
    row = list(map(int, input().split()))
    for j in range(n):
      image = row

operations = input().strip()
for op in operations:
    if op == 'A':
      rotated = [ * m for _ in range(n)]
      for i in range(m):
            for j in range(n):
                rotated = image
      image = rotated
      m, n = n, m
    elif op == 'B':
      rotated = [ * m for _ in range(n)]
      for i in range(m):
            for j in range(n):
                rotated = image
      image = rotated
      m, n = n, m
    elif op == 'C':
      flipped = [ * n for _ in range(m)]
      for i in range(m):
            for j in range(n):
                flipped = image
      image = flipped
    elif op == 'D':
      flipped = [ * n for _ in range(m)]
      for i in range(m):
            for j in range(n):
                flipped = image
      image = flipped

for i in range(m):
    for j in range(n):
      print(image, end=' ')
    print()

希望我对问题的解答能够帮到你。如果你还有其他问题,请随时提问。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

1215787625 发表于 2023-12-3 08:42:15

FishC_GPT 发表于 2023-12-3 08:26
首先,我们需要先读取输入的m和n,并创建一个大小为m×n的二维数组来表示图像。



我问的不是这个问题

FishC_GPT 发表于 2023-12-3 08:42:22

1215787625 发表于 2023-12-03 08:42
我问的不是这个问题

非常抱歉,可能是我理解错了您的问题。那么请您重新描述一下您遇到的函数调用问题,我会尽力帮助您解答。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

1215787625 发表于 2023-12-3 08:42:50

FishC_GPT 发表于 2023-12-3 08:42
非常抱歉,可能是我理解错了您的问题。那么请您重新描述一下您遇到的函数调用问题,我会尽力帮助您解答。 ...

为什么在//开始操作中move数组的值会被修改

FishC_GPT 发表于 2023-12-3 08:43:02

1215787625 发表于 2023-12-03 08:42
为什么在//开始操作中move数组的值会被修改

在Python中,函数参数传递方式有两种:值传递和引用传递。对于不可变对象(如数值、字符串、元组),采用的是值传递方式;而对于可变对象(如列表、字典),则采用的是引用传递方式。

当您在函数中修改一个可变对象时,会直接修改原始对象的值,因为传递的是对象的引用。这意味着在函数内部对该对象的任何修改都会反映到原始对象上。

以下是一个示例代码解释了这个问题:

def modify_list(lst):
    lst.append(4)
    print("Inside function: ", lst)

my_list =
print("Before function: ", my_list)
modify_list(my_list)
print("After function: ", my_list)

输出结果为:

Before function:
Inside function:
After function:

从输出结果可以看到,函数内部对`lst`进行的修改同样反映在原始列表`my_list`上。

因此,在您提到的操作中,如果`move`数组是一个可变对象(如列表),则对其进行的操作可能会修改其原始值。如果您希望避免修改原始数组的值,可以在函数内部创建一个副本进行操作。例如:

def process_moves(move):
    move_copy = move.copy()# 创建move数组的副本
    # 对move_copy进行操作
    # ...

my_move =
process_moves(my_move)

通过在函数内部创建`move`的副本`move_copy`,您可以确保原始的`move`数组不会被修改。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

1215787625 发表于 2023-12-3 08:43:56

FishC_GPT 发表于 2023-12-3 08:43
在Python中,函数参数传递方式有两种:值传递和引用传递。对于不可变对象(如数值、字符串、元组),采用 ...

我这是C语言

FishC_GPT 发表于 2023-12-3 08:44:11

1215787625 发表于 2023-12-03 08:43
我这是C语言

非常抱歉,我误解了你的问题。以下是关于C语言中的函数参数传递方式的解释。

在C语言中,函数参数传递有两种方式:按值传递和按引用传递(指针传递)。

1. 按值传递:将函数参数的值复制一份给形参,在函数内部对形参的修改不会影响实参的值。这意味着,如果你在函数中修改了一个变量的值,实际上是在修改该变量的副本。
2. 按引用传递(指针传递):传递参数的地址给函数,在函数内部可以通过指针访问和修改原始数据。这样,对形参的任何修改都会影响到实参的值。

举个例子:

#include<stdio.h>

void modify_int(int num) {
    num = 10; // 修改形参的值
}

void modify_array(int arr[], int length) {
    for (int i = 0; i < length; i++) {
      arr = i * 2; // 修改数组元素的值
    }
}

int main() {
    int num = 5;
    printf("Before modify_int: %d\n", num);
    modify_int(num);
    printf("After modify_int: %d\n", num); // 这里输出仍然是5,因为modify_int函数中的修改只影响到了形参的副本

    int arr[] = {1, 2, 3, 4, 5};
    int length = sizeof(arr) / sizeof(arr);
    printf("Before modify_array: ");
    for (int i = 0; i < length; i++) {
      printf("%d ", arr);
    }
    printf("\n");
    modify_array(arr, length);
    printf("After modify_array: ");
    for (int i = 0; i < length; i++) {
      printf("%d ", arr); // 这里输出是:0 2 4 6 8,因为modify_array函数中修改了原始数组的值
    }
    printf("\n");

    return 0;
}

在上面的例子中,`modify_int`和`modify_array`函数分别按值传递一个整数和一个整数数组。在`modify_int`函数中,修改形参`num`的值并不会影响到实参`num`的值。而在`modify_array`函数中,通过修改数组元素的值,直接影响到了原始数组。

希望这次回答能够帮到你。如果你还有其他问题,请随时提问。

以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 函数调用问题