调用它们后,我的功能无法正常工作

时间:2019-12-01 18:15:24

标签: c

我已经用printf来检查该功能是否起作用,但是我不知道为什么它不起作用。

数字在函数中都是正确的,但不会执行。

我不确定为什么该功能无法正常工作,我对C语言的了解不多,因此如果有人可以帮助我,将不胜感激。

该程序应该通过计算教室中周围人员的几率来计算您通过考试的几率。

示例:

  P
NXNXNXNXN
ZNZNXXXXX
XNZXNNNZX
ZNXHXXXXZ
NNNNZNNXN

P - professor Z - prepared student N - unprepared student X - an empty seat H - Me

输入:

3 4
2 50
X X X X
Z H N X
Z N X X

预期输出:

Sanse za prolaz su 62.50%

得到的输出:

Sanse za prolaz su -0.00
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


    ///FUNKCIJA POSTOTAK
float fudaljenost(int visina, int sirina,char array[visina][sirina])
{
    float postotak=0;
    float udaljenostx=0,udaljenosty=0,udaljenost=0;
    int Hx,Hy;
    int Zx,Zy;
    int Nx,Ny;

    for(int i=0;i<visina+1;i++)
    {
        for(int j=0;j<sirina;j++)
        {
             if(array[i][j]=='H')
             {
                Hx=i;
                Hy=j;
             }

        }
    }

    for(int i=0;i<visina+1;i++)
    {
        for(int j=0;j<sirina;j++)
        {
             if(array[i][j]=='Z')
             {
                Zx=i;
                Zy=j;

                udaljenostx=abs(Hx-Zx);///A
                udaljenosty=abs(Hy-Zy);///B

                printf("Z A=%f B=%f\n",udaljenostx,udaljenosty);
                udaljenost=sqrt((udaljenostx*udaljenostx)+(udaljenosty*udaljenosty));///UDALJENOST

                postotak+=90/(udaljenost*udaljenost);///POSTOTAK
             }
        }
    }

    for(int i=0;i<visina+1;i++)
    {
        for(int j=0;j<sirina;j++)
        {
             if(array[i][j]=='N')
             {
                Nx=i;
                Ny=j;

                udaljenostx=abs(Hx-Nx);///A
                udaljenosty=abs(Hy-Ny);///B
                printf("N A=%f B=%f\n",udaljenostx,udaljenosty);

                udaljenost=sqrt((udaljenostx*udaljenostx)+(udaljenosty*udaljenosty));///UDALJENOST

                postotak-=30/(udaljenost*udaljenost);///POSTOTAK
             }
        }
    }

    return postotak;
}

///FUNKCIJA PROFESOR
float fprofesor(float strogost,int visina, int sirina,char array[visina][sirina])
{
    float postotak=0;
    int Hx,Hy;
    int Px,Py;
    float udaljenostx=0,udaljenosty=0,udaljenost;

    for(int i=0;i<visina+1;i++)
    {
        for(int j=0;j<sirina;j++)
        {
             if(array[i][j]=='H')
             {
                Hx=i;
                Hy=j;
             }

        }
    }


    for(int i=0;i<visina+1;i++)
    {
        for(int j=0;j<sirina;j++)
        {
             if(array[i][j]=='P')
             {
                Px=i;
                Py=j;

                udaljenostx=abs(Hx-Px);///A
                udaljenosty=abs(Hy-Py);///B

                udaljenost=sqrt((udaljenostx*udaljenostx)+(udaljenosty*udaljenosty));///UDALJENOST

                postotak=strogost/(udaljenost*udaljenost);///POSTOTAK
             }



        }
    }

    return postotak;
}
int main()
{
    int i=0,j=0;
    int visina,sirina;
    int prof;
    float strogost;
    float posto1,posto2,posto;
    char Ucionica[50][50]={0};


    float postotak=0;
    float udaljenostx=0,udaljenosty=0,udaljenost=0;
    int Hx,Hy;
    int Zx,Zy;
    int Nx,Ny;

    scanf(" %d%d",&visina,&sirina);
    scanf(" %d%f",&prof,&strogost);

    ///UPIS MATRICE
    for(i=1;i<visina+1;i++)
    {
        for(j=0;j<sirina;j++)
        {
             scanf(" %c",&Ucionica[i][j]);
        }
    }
    Ucionica[0][prof-1]='P';

    posto1 = fudaljenost(visina,sirina,Ucionica);
    posto2 = fprofesor(strogost,visina,sirina,Ucionica);
    posto = posto1-posto2;

    printf("Sanse za prolaz su %.2f",posto);
    return 0;
}

Stackoverflow不允许我在不添加更多单词的情况下发布此信息,因此即时通讯使用文本的这一部分来添加更多单词,抱歉,像这样在系统中四处走动的stackoverflow,但在此方面我已经用完了时间。

2 个答案:

答案 0 :(得分:0)

函数写错了,

float fudaljenost(int visina, int sirina,char array[visina][sirina])

与之前发送的[50] [50]数组大小不同

以下内容将解决问题:

float fudaljenost(int visina, int sirina,char array[50][50])
float fprofesor(float strogost,int visina, int sirina,char array[50][50])

值得指出的是,最好使用#define MAX_ARRAY_SIZE 50,并使用MAX_ARRAY_SIZE而不是50。如果需要更改数字,这将更容易避免错误,并提供50的提示。

答案 1 :(得分:0)

当前代码传递给主变量char Ucionica[50][50]={0}的函数中,该函数需要float fprofesor(float strogost,int visina, int sirina,char array[visina][sirina])的原型。

从上下文来看,似乎[50],[50 [表示最大的输入大小,但程序仅使用前几行/列(在示例中为3、4)。无论将使用多少数据,被调用函数中的定义都应与数据大小匹配。

float fprofesor(float strogost,int visina, int sirina,char array[50][50]) { ... }
float fudaljenost(int visina, int sirina,char array[50][50]) { ... }

旁注,gcc -Wall在未使用的变量上标记了许多警告,但在传递较小数组大小不匹配的数组时没有警告

此外,最好“ #define”最大大小,而不是对50次重复进行硬编码。