鱼C论坛

 找回密码
 立即注册
查看: 943|回复: 7

函数调用问题

[复制链接]
发表于 2023-12-3 08:26:32 | 显示全部楼层 |阅读模式

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

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

x
题目描述
给定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[100][100],a[100][100];
char move[100];
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[i][j]);
                }
        }

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

        for (i = 0; i < m; i++) {//输出
                for (j = 0; j < n; j++) {
                        printf(j == 0 ? "%d" : " %d", dig[i][j]);
                }
                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[j][m - 1 - i] = dig[i][j];       
                                break;
                        case 'B':
                                a[m - 1 - j][i] = dig[i][j];       
                                break;
                        case 'C':
                                a[i][n - 1 - j] = dig[i][j];       
                                break;
                        case 'D':
                                a[n - 1 - i][j] = dig[i][j];       
                                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[i][j] = a[i][j];
                }
        }
}
请问为什么我的operate函数在main函数中只调用了一次,不应该是两次吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-3 08:26:53 | 显示全部楼层
首先,我们需要先读取输入的m和n,并创建一个大小为m×n的二维数组来表示图像。
m, n = map(int, input().split())image = [[0] * n for _ in range(m)]
接下来,我们需要读取每个像素点的灰度值,并将其存储到相应的位置上。
for i in range(m):    row = list(map(int, input().split()))    for j in range(n):        image[i][j] = row[j]
然后,我们需要依次执行给定的操作。对于每个操作,我们可以使用循环遍历图像的每个像素点,并根据操作类型进行相应的处理。
operations = input().strip()for op in operations:    if op == 'A':        # 顺时针旋转90度        rotated = [[0] * m for _ in range(n)]        for i in range(m):            for j in range(n):                rotated[j][m - i - 1] = image[i][j]        image = rotated        m, n = n, m    elif op == 'B':        # 逆时针旋转90度        rotated = [[0] * m for _ in range(n)]        for i in range(m):            for j in range(n):                rotated[n - j - 1][i] = image[i][j]        image = rotated        m, n = n, m    elif op == 'C':        # 左右翻转        flipped = [[0] * n for _ in range(m)]        for i in range(m):            for j in range(n):                flipped[i][n - j - 1] = image[i][j]        image = flipped    elif op == 'D':        # 上下翻转        flipped = [[0] * n for _ in range(m)]        for i in range(m):            for j in range(n):                flipped[m - i - 1][j] = image[i][j]        image = flipped
最后,我们需要输出最终图像的灰度值。
for i in range(m):    for j in range(n):        print(image[i][j], end=' ')    print()
完整代码如下:
m, n = map(int, input().split())image = [[0] * n for _ in range(m)]for i in range(m):    row = list(map(int, input().split()))    for j in range(n):        image[i][j] = row[j]operations = input().strip()for op in operations:    if op == 'A':        rotated = [[0] * m for _ in range(n)]        for i in range(m):            for j in range(n):                rotated[j][m - i - 1] = image[i][j]        image = rotated        m, n = n, m    elif op == 'B':        rotated = [[0] * m for _ in range(n)]        for i in range(m):            for j in range(n):                rotated[n - j - 1][i] = image[i][j]        image = rotated        m, n = n, m    elif op == 'C':        flipped = [[0] * n for _ in range(m)]        for i in range(m):            for j in range(n):                flipped[i][n - j - 1] = image[i][j]        image = flipped    elif op == 'D':        flipped = [[0] * n for _ in range(m)]        for i in range(m):            for j in range(n):                flipped[m - i - 1][j] = image[i][j]        image = flippedfor i in range(m):    for j in range(n):        print(image[i][j], end=' ')    print()
希望我对问题的解答能够帮到你。如果你还有其他问题,请随时提问。

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

使用道具 举报

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

我问的不是这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-3 08:42:22 | 显示全部楼层
1215787625 发表于 2023-12-03 08:42
我问的不是这个问题

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

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

使用道具 举报

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

为什么在//开始操作中move数组的值会被修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 = [1, 2, 3]print("Before function: ", my_list)modify_list(my_list)print("After function: ", my_list)
输出结果为:
Before function:  [1, 2, 3]Inside function:  [1, 2, 3, 4]After function:  [1, 2, 3, 4]
从输出结果可以看到,函数内部对`lst`进行的修改同样反映在原始列表`my_list`上。

因此,在您提到的操作中,如果`move`数组是一个可变对象(如列表),则对其进行的操作可能会修改其原始值。如果您希望避免修改原始数组的值,可以在函数内部创建一个副本进行操作。例如:
def process_moves(move):    move_copy = move.copy()  # 创建move数组的副本    # 对move_copy进行操作    # ...my_move = [1, 2, 3]process_moves(my_move)
通过在函数内部创建`move`的副本`move_copy`,您可以确保原始的`move`数组不会被修改。

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

使用道具 举报

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

我这是C语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-3 08:44:11 | 显示全部楼层

非常抱歉,我误解了你的问题。以下是关于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] = 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[0]);    printf("Before modify_array: ");    for (int i = 0; i < length; i++) {        printf("%d ", arr[i]);    }    printf("\n");    modify_array(arr, length);    printf("After modify_array: ");    for (int i = 0; i < length; i++) {        printf("%d ", arr[i]); // 这里输出是:0 2 4 6 8,因为modify_array函数中修改了原始数组的值    }    printf("\n");    return 0;}
在上面的例子中,`modify_int`和`modify_array`函数分别按值传递一个整数和一个整数数组。在`modify_int`函数中,修改形参`num`的值并不会影响到实参`num`的值。而在`modify_array`函数中,通过修改数组元素的值,直接影响到了原始数组。

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 09:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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