鱼C论坛

 找回密码
 立即注册
查看: 1216|回复: 3

[已解决]自定义函数问题

[复制链接]
发表于 2019-5-21 20:26:08 | 显示全部楼层 |阅读模式

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

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

x
/*用冒泡法对20个随机元素的数组排序*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void mppx(int a[])
{
    int i, j, t, s;
    s = sizeof(a) / sizeof(a[0]);
    for (i = 0; i < s; i++)
    {
        for (j = 0; j < (s - 1); j++)
        {
            if (a[j] >= a[j + 1])
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }
    for (i = 0; i < s; i++)
    {
        printf("a[%d] = %d\n", i, a[i]);
    }
}
void main()
{
    int b[19], i;
    srand(time(NULL));
    printf("排序之前\n");
    for (i = 0; i < 20; i++)
    {

        b[i] = rand() % 20;
    }
    for (i = 0; i < 20; i++)
    {
        printf("b[%d] = %-3d\n", i, b[i]);
    }
    printf("排序之后\n");
    mppx(b);//调用函数对=数组b进行排序
}
-----------------------------------------------------------------------------------------------------------------------
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

E:\Administrator\Documents\My C>cmd /C "c:\Users\Administrator\.vscode\extensions\ms-vscode.cpptools-0.23.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-cgfzor0y.cvw --stdout=Microsoft-MIEngine-Out-b3zzwf1o.v24 --stderr=Microsoft-MIEngine-Error-0irwvajd.iqa --pid=Microsoft-MIEngine-Pid-dutcx0ls.r0s --dbgExe=E:\MinGW\bin\gdb.exe --interpreter=mi "
排序之前
b[0] = 8
b[1] = 15
b[2] = 15
b[3] = 13
b[4] = 0
b[5] = 13
b[6] = 18
b[7] = 14
b[8] = 11
b[9] = 1
b[10] = 5
b[11] = 14
b[12] = 7
b[13] = 14
b[14] = 7
b[15] = 11
b[16] = 0
b[17] = 2
b[18] = 9
b[19] = 19
排序之后
a[0] = 8

E:\Administrator\Documents\My C>
=================================
为什么不能正确输出排序后的数组,到底哪里出问题了??????????????
最佳答案
2019-5-21 22:14:15
当将数组作为实参传递到一个函数中时,就是将数组的首地址作为实参,
函数的形参相当于一个指针,mppx函数里的sizeof(a)得到的是指针的大小为8,
而int大小为4,相除得2,所以你的程序只会排序前两个元素。
建议参考如下代码:
/*用冒泡法对20个随机元素的数组排序*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void mppx(int a[],int s)
{
    int i, j, t;
   
   // printf("s=%d",s);
    for (i = 0; i < s; i++)
    {
        for (j = 0; j < (s - 1); j++)
        {
            if (a[j] >= a[j + 1])
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }
    for (i = 0; i < s; i++)
    {
        printf("a[%d] = %d\n", i, a[i]);
    }
}
int main()
{
    int b[19], i,s;
    srand(time(NULL));
    printf("排序之前\n");
    for (i = 0; i < 20; i++)
    {

        b[i] = rand() % 20;
    }
    for (i = 0; i < 20; i++)
    {
        printf("b[%d] = %-3d\n", i, b[i]);
    }
    printf("排序之后\n");
     s = sizeof(b) / sizeof(b[0]);
    mppx(b,s);//调用函数对=数组b进行排序
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-5-21 21:26:07 | 显示全部楼层
/*用冒泡法对20个随机元素的数组排序*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void main()
{
    int i, j, s;
    int arr[20];
    srand(time(NULL));
    for (i = 0; i < 20; i++)
    {
        arr[i] = rand() % 20;
    }

    s = sizeof(arr) / sizeof(arr[0]);
    for (i = 0; i < s; i++)
    {
        for (j = 0; j < (s - 1); j++)
        {
            int t;
            if (arr[j] > arr[j + 1])
            {
                t = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = t;
            }
        }
    }
    for (i = 0; i < s; i++)
    {
        printf("arr[%d] = %d  \n", i, arr[i]);
    }
}
============================================================
E:\Administrator\Documents\My C>cmd /C "c:\Users\Administrator\.vscode\extensions\ms-vscode.cpptools-0.23.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-wh0sgtdm.v55 --stdout=Microsoft-MIEngine-Out-2ykotrdf.ufk --stderr=Microsoft-MIEngine-Error-lto0p5do.blo --pid=Microsoft-MIEngine-Pid-012pmyxn.z01 --dbgExe=E:\MinGW\bin\gdb.exe --interpreter=mi "
arr[0] = 1
arr[1] = 4
arr[2] = 5
arr[3] = 5
arr[4] = 7
arr[5] = 7
arr[6] = 8
arr[7] = 9
arr[8] = 10
arr[9] = 11
arr[10] = 11
arr[11] = 12
arr[12] = 13
arr[13] = 13
arr[14] = 14
arr[15] = 14
arr[16] = 14
arr[17] = 17
arr[18] = 17
arr[19] = 18

E:\Administrator\Documents\My C>
-----------------------------------------------------------------------------------------------------
为啥这样就可以,搞成自定义函数就不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-21 22:09:15 | 显示全部楼层
void mppx(int a[])
{
    int i, j, t, s;
    s = sizeof(a) / sizeof(a[0]);
    for (i = 0; i < s; i++)
    {
        for (j = 0; j < (s - 1); j++)
        {
            if (a[j] >= a[j + 1])
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }
    for (i = 0; i < s; i++)
    {
        printf("a[%d] = %d\n", i, a[i]);
    }
}
当数组作为参数时传递的是指针而不是数组本身,也就是a的类型是int*,
所以 s=sizeof(a)/sizeof(a[0])即sizeof(int*)/sizeof(int)=2或1。
所以,在C语言中传递数组时,一般同时还会传递数组的大小:
void mppx(int a[],int s)
{
    int i, j, t;
    for (i = 0; i < s; i++)
    {
        for (j = 0; j < (s - 1); j++)
        {
            if (a[j] >= a[j + 1])
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }
    for (i = 0; i < s; i++)
    {
        printf("a[%d] = %d\n", i, a[i]);
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-21 22:14:15 | 显示全部楼层    本楼为最佳答案   
当将数组作为实参传递到一个函数中时,就是将数组的首地址作为实参,
函数的形参相当于一个指针,mppx函数里的sizeof(a)得到的是指针的大小为8,
而int大小为4,相除得2,所以你的程序只会排序前两个元素。
建议参考如下代码:
/*用冒泡法对20个随机元素的数组排序*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void mppx(int a[],int s)
{
    int i, j, t;
   
   // printf("s=%d",s);
    for (i = 0; i < s; i++)
    {
        for (j = 0; j < (s - 1); j++)
        {
            if (a[j] >= a[j + 1])
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }
    for (i = 0; i < s; i++)
    {
        printf("a[%d] = %d\n", i, a[i]);
    }
}
int main()
{
    int b[19], i,s;
    srand(time(NULL));
    printf("排序之前\n");
    for (i = 0; i < 20; i++)
    {

        b[i] = rand() % 20;
    }
    for (i = 0; i < 20; i++)
    {
        printf("b[%d] = %-3d\n", i, b[i]);
    }
    printf("排序之后\n");
     s = sizeof(b) / sizeof(b[0]);
    mppx(b,s);//调用函数对=数组b进行排序
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-3 19:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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