इस कार्यक्रम में मुझे यह पता लगाना है कि मैट्रिक्स में कितनी प्रभावशाली संख्याएं हैं। एक प्रमुख संख्या एक संख्या है जो दाईं ओर नीचे की ओर से बड़ी है (कृपया मेरी अंग्रेजी के साथ भालू)।

मैंने इसे दर्ज किया:

5 (9) 2  4  1 (7)  2  4///
3  5  6  2  5 (6)  1  2///
1  3  4  7  8 (8) (3) 0///
1  3  5  6  7  8   2  1///

जिन लोगों की मैंने परिक्रमा की, उन्हें प्रमुख माना जाता है, लेकिन इसने मुझे 6 वापस कर दिया, क्या गलत हुआ?

#include <stdio.h>
#include <stdlib.h>

#define NR 4
#define NC 8

int dominants(int a[NR][NC]);
int main(int argc, char * argv[]){
int array[NR][NC];
int ndom;
int i,j;


for(i=0;i<NR;i++){
        for(j=0;j<NC;j++){

        scanf("%d", &array[i][j]);
        }
}
printf("array entered:\n\n");
for(i=0;i<NR;i++){
        printf("\n");
        for(j=0;j<NC;j++){

        printf("%d  ", array[i][j]);
        }
}

ndom=dominants(array);

printf("amount of dominant numbers:%d", ndom);
return 0;
}
int dominants(int a[NR][NC]){
int domflag;
int i,j, l, m;
int numdom=0;
for(i=0;i<NR-1;i++){
    for(j=0;j<NC-1;j++){
        for(l=i+1;l<NR;l++){
                domflag=1;
                for(m=j+1;m<NC;m++){
                if(a[i][j]<=a[l][m]){
                    domflag=0;
                                    }
                                   }
                           }
            if(domflag==1){
                numdom++;
                          }
        }

    }
    return numdom;
}
0
Fish 15 फरवरी 2020, 14:32

2 जवाब

domflag = 1; लूप के अंदर है for (l = i + 1; l < NR; l++) लेकिन इसके बाहर होना चाहिए।

इस तरह की त्रुटियों को कम करने का एक अच्छा तरीका केवल उन पहचानकर्ताओं को परिभाषित करना है जहां उनकी आवश्यकता है। यदि दिनचर्या के शीर्ष पर परिभाषा int domflag; हटा दी जाती है और कथन domflag = 1; को int domflag = 1; में बदल दिया जाता है, तो संकलक बाद में एक त्रुटि देगा जहां domflag == 1 का परीक्षण किया जाता है , क्योंकि यह परिभाषा के दायरे से बाहर होगा।

0
Eric Postpischil 15 फरवरी 2020, 14:47

सभी तर्कों को मुख्य कार्य में न डालें। कार्यों का उपयोग करने का प्रयास करें। यह चीजों को बहुत आसान बनाता है

int isdominant(int *arr, size_t cols, size_t rows, size_t col, size_t row)
{
    int *rowend = arr + (row + 1) * cols - 1;
    int *pos = arr + row * cols + col;
    while(rowend > pos)
        if(*pos <= *rowend--) return 0;
    return 1;
}

#define COLS 10
#define ROWS 7

int main()
{
    int arr[ROWS][COLS];
    int *ptr = &arr[0][0];
    unsigned dominants = 0;


    for(size_t index = 0; index < ROWS * COLS; index++) *ptr++ = rand() % 50;

    for(size_t row = 0; row < ROWS; row++)
    {
        for(size_t col = 0; col < COLS; col++)
        {
            int dom = 0;
            if(col != COLS - 1) dom = isdominant(arr[0], COLS, ROWS, col, row);
            printf("%s%d%s\t", dom ? "(" : "", arr[row][col], dom ? ")" : "");
            dominants += dom;
        }
        printf("\n");
    }
    printf("Dominant numbers: %u\n", dominants);
}

https://godbolt.org/z/tpwnm2

-1
0___________ 15 फरवरी 2020, 15:34
(ए) प्रश्न में दिए गए इनपुट पर गलत उत्तर मिलता है क्योंकि यह अंतिम पंक्ति में तत्वों को प्रभावी होने की अनुमति देता है (मूल कोड के लिए नीचे-दाएं सबमैट्रिस गैर-रिक्त होना आवश्यक है)। (बी) अन्य इनपुट पर गलत उत्तर प्राप्त करता है क्योंकि यह उम्मीदवार की तुलना केवल एक पंक्ति से करता है, न कि नीचे-दाएं सबमैट्रिक्स के लिए, जैसा कि मूल कोड कोशिश करता है। (सी) इस स्तर पर एक छात्र को समझाए बिना अनावश्यक रूप से पॉइंटर्स और पॉइंटर अंकगणित का उपयोग करता है। (डी) कोड का बेतुका पुनर्लेखन (दस्तावेज़ीकरण के बिना) जो ओपी के प्रश्न का उत्तर नहीं देता है "क्या गलत हुआ?" उनके कोड में त्रुटि की व्याख्या करके।
 – 
Eric Postpischil
15 फरवरी 2020, 16:02