मैं यह पता लगाने की कोशिश कर रहा हूं कि मैंने जो फ़ंक्शन लिखा है उससे मैं पिछली स्थिति कैसे प्राप्त करूं। मैंने इसे घंटों तक हल करने की कोशिश की लेकिन नहीं कर सका। शत्रु (N) की प्रारंभिक स्थिति (0,0) है और उसके बाद प्रत्येक x और y मान यादृच्छिक रूप से उत्पन्न होते हैं। 'ओ' मेरा आधार है और यह (6,6) में स्थित है। सीमाएं 11x11. समस्या यह है कि रिफ्रेश_पोजिशन फ़ंक्शन हमेशा पिछली स्थिति को '0' के रूप में प्राप्त करके विस्थापन की गणना करता है। यहाँ कोड है:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
void track_machine();
void refresh_position(int *X, int *Y, double *D, double *R);

void main()
{
   track_machine();
}

void track_machine()
{
    int x=0, y=0;
    char op;
    double D, R;
    refresh_position(&x, &y, &D, &R);
    for(int i=1; i<=11; i++)
    {
        for(int j=1; j<=11; j++)
        {
            if(i==x && j==y)
                printf("N ");
            else if(i==6 && j==6)
                printf("O ");
            else
                printf(". ");
        }
        printf("\n");
    }
    printf("Enemies X position:%d\nY position:%d\nDisplacement:%f\nDistance to our camp:%f\nCommand waiting...:\n", x, y, D, R);

    scanf(" %c", &op);

    if(op=='R')
        track_machine();
    else if(op=='E')
        main();
    else
        printf("\nERROR!\n");
}

void refresh_position(int *X, int *Y, double *D, double *R)
{
    int x=*X, y=*Y, xD, yD, xR, yR;
    srand(time(0)); 
    while( (*X==0 || *X==6) || (*Y==0 || *Y==6) )
    {
        *X = rand()%11;
        *Y = rand()%11;
    }

    xD=abs(*X-x);
    yD=abs(*Y-y);

    xR=abs(*X-6);
    yR=abs(*Y-6);

    *D = sqrt( (xD*xD) + (yD*yD) );
    *R = sqrt( (xR*xR) + (yR*yR) );

}
c
0
Ahmet Tuğkan Ayhan 20 मार्च 2020, 01:22
1
बीज srand(time(0)); का उपयोग main() में किया जाना चाहिए अन्यथा यह प्रत्येक फंक्शन कॉल पर पुनः आरंभ होगा।
 – 
anastaciu
20 मार्च 2020, 01:27
1
ओह, मैंने उस पर ध्यान नहीं दिया। इसे ठीक किया धन्यवाद लेकिन यह मुख्य समस्या नहीं है :(
 – 
Ahmet Tuğkan Ayhan
20 मार्च 2020, 01:34
मुझे संदेह है कि आप while( !((*X==0 && *Y==0) || (*Y==6 && *Y==6)) ) चाहते हैं। शायद अन्य त्रुटियां भी।
 – 
chux - Reinstate Monica
20 मार्च 2020, 01:58
मैं गलत था क्योंकि आप अपने विकल्पों में से एक में मुख्य() को कॉल करते हैं, समस्या बनी हुई है, आर और ई भी वही हैं क्योंकि इस उदाहरण में मुख्य() या ट्रैक_माचिन() को कॉल करना एक ही बात है। एक और चीज जिसे आपको ठीक करना चाहिए वह है आपका मुख्य(), इसे int वापस करना चाहिए। जहां तक ​​आपकी समस्या है, मुझे इसे अन्य उपयोगकर्ताओं पर छोड़ना होगा, क्योंकि मैं अभी इसका परीक्षण नहीं कर सकता।
 – 
anastaciu
20 मार्च 2020, 02:00

2 जवाब

  1. मुझे लगता है, यह एक तरह का बोर्ड गेम है और बोर्ड की पोजीशन 1 से 11 तक गिने जाते हैं। while लूप से मैं जो निष्कर्ष निकालता हूं, वह यह है कि आप *X और *Y नहीं चाहते हैं। 0' या '6'। हालाँकि, mod(11) w/o जोड़ने (वृद्धि) '1' का उपयोग करने से कभी भी यादृच्छिक परिणाम '11' उत्पन्न नहीं होगा। तो, आप बेहतर ढंग से उस लूप को अधिक कुशल do-while में बदल देंगे, जैसे;
do {
    *X = rand() % 11 + 1;
    *Y = rand() % 11 + 1;
} while((*X == 6) && (*Y == 6));

इस प्रकार, rand() % 11 एक संख्या b/w 0 - 10 (समावेशी) उत्पन्न करेगा, फिर '1' जोड़ने पर एक संख्या b/w 1 - 11 (समावेशी) उत्पन्न होगी। आपको '0' मानों की जाँच से छुटकारा मिल जाएगा।

  1. कोड के बारे में आपके प्रश्न को संबोधित करना (यह सुनिश्चित नहीं है कि मैंने आपका प्रश्न 100% समझ लिया है); मुझे लगता है कि समस्या track_machine फ़ंक्शन से उत्पन्न होती है जिसमें कोई पैरामीटर नहीं होता है। x और y को main में प्रारंभ करना और फिर पैरामीटर के माध्यम से उन वेरिएबल्स को फ़ंक्शन में पास करना आपकी समस्या का समाधान करेगा (बेशक, यदि मैं आपके प्रश्न को वास्तव में समझ गया हूं)।
// main should be
int main()
{
    int x = 1, y = 1;
    track_machine(x, y);
}

// function decoration should be
void track_machine(int x, int y) {...}

// and your recursive call line should read as
if (op == 'R')
    track_machine(x, y);
1
ssd 20 मार्च 2020, 16:09

मैंने अपनी समस्या का पर्याप्त वर्णन नहीं किया। इसके लिए खेद है लेकिन मैंने पाया कि मैंने क्या गलत किया। कोड x और y दोनों दिशाओं में 11 बिंदुओं को प्रिंट करता है। मेरा लक्ष्य N (जो कि 11x11 क्षेत्र में बेतरतीब ढंग से प्रत्येक 'R' कमांड में स्थित है) और O (जो मेरा आधार 6,6 में स्थित है) के बीच की दूरी का पता लगा रहा था और जब भी मैं 'R' देता हूं तो हर बार विस्थापन की खोज की जाती है। आदेश। यहां कामकाजी कोड है:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
void track_machine();
void refresh_position(int *X, int *Y, double *D, double *R)

int main()
{
   track_machine();
}
void track_machine()
{
    int x=1, y=1;
    char op;
    double D, R;
    srand(time(0));
    D = 0;
    R = 8.49;
    while(1==1){
        for(int i=1; i<=11; i++){
            for(int j=1; j<=11; j++){
                if(i==x && j==y)
                    printf("N ");
                else if(i==6 && j==6)
                    printf("O ");
                else
                    printf(". ");
            }
            printf("\n");
        }
        printf("Enemies X position:%d\nY position:%d\nDisplacement:%f\nDistance to our camp:%f\nCommand waiting...:\n", x, y, D, R);
        scanf(" %c", &op);

        if(op=='R')
            refresh_position(&x, &y, &D, &R);
        else if(op=='E'){
            main();
            break;
        }
        else
            printf("\nERROR!\n");
    }
}

void refresh_position(int *X, int *Y, double *D, double *R)
{
    int x=*X, y=*Y;

    do {
        *X = rand()%11+1;
        *Y = rand()%11+1;   
    } while((*X == 6) || (*Y == 6));

    *D = sqrt( ((*X-x)*(*X-x)) + ((*Y-y)*(*Y-y)) );
    *R = sqrt( ((*X-6)*(*X-6)) + ((*Y-6)*(*Y-6)) );

}

मैं ट्रैक_माचिन के लिए पैरामीटर का उपयोग नहीं कर सकता क्योंकि मुझे इसकी अनुमति नहीं है :)। हर बार जब मैं 'आर' देता हूं तो यह 'एन' के स्थान को रीफ्रेश करता है और जब तक मैं 'ई' कमांड नहीं देता तब तक नए 'डी' और 'आर' मानों की गणना करता हूं। असल में यह पूरा कोड नहीं है, यह इसका एक छोटा सा हिस्सा है। जब यह मुख्य पर लौटता है तो यह स्विच केस में अन्य कार्यों को चुनने के लिए 'ऑप' के लिए कहता है। मुझे आशा है कि मैंने इसे इस बार पर्याप्त रूप से समझाया। हालांकि मदद के लिए धन्यवाद!

0
Ahmet Tuğkan Ayhan 20 मार्च 2020, 15:53
आपके कोड में उस जबकि शर्त ...} while((*X == 6) || (*Y == 6)); के बारे में; यदि आप नहीं चाहते कि 'N' पंक्ति 6 ​​(स्तंभ से स्वतंत्र) पर स्थित हो या स्तंभ 6 (पंक्ति से स्वतंत्र) पर स्थित न हो, तो कोई बात नहीं। हालाँकि, यदि आपका उद्देश्य 'N' को 'O' के शीर्ष पर स्थित होने से रोकना है, तो आपकी स्थिति ...} while((*X == 6) && (*Y == 6)); होनी चाहिए।
 – 
ssd
21 मार्च 2020, 03:05