2012-11-14 26 views
10

संरचनात्मक सरणी को देखते हुए (सी में) मैं लिंग के समूहों में और संख्यात्मक क्रम से उप क्रम में परिणामों को मुद्रित करने का प्रयास कर रहा हूं। उदाहरण के लिए:संरचना सरणी

struct employee{ 
char gender[13] 
char name[13]; 
int id; 
}; 

कहो मैं बहुत तरह संरचना सरणी को परिभाषित:

struct employee info[2]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}}; 

मैं की तरह

1234 Matt 
1235 Josh 


2345 Jessica 

उत्तर

15

आप के रूप में आप

int compare(const void *s1, const void *s2) 
{ 
    struct employee *e1 = (struct employee *)s1; 
    struct employee *e2 = (struct employee *)s2; 
    int gendercompare = strcmp(e1->gender, e2->gender); 
    if (gendercompare == 0) /* same gender so sort by id */ 
    return e1->id - e2->id; 
    else 
    return -gendercompare; /* the minus puts "male" first as in the question */ 
} 

की आवश्यकता होती है और फिर मानक पुस्तकालय से qsort का प्रयोग कर एक सॉर्टिंग समारोह है कि structs तुलना लागू करने के लिए की आवश्यकता होगी।

qsort(data, count, sizeof(struct employee), compare); 

अंदर से काम आप आईडी बराबर होने के लिए जाँच करने के लिए चाहते हो सकता है, तो आप का नाम (भी strcmp() का प्रयोग करके) जैसे आप चाहें द्वारा सॉर्ट कर सकते हैं की तुलना करें।

केन

संपादित करें: बस संकलित और इसे ठीक करें। यह एक छोटा सा परीक्षण कार्यक्रम

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

    struct employee{ 
     char gender[13]; 
     char name[13]; 
     int id; 
    }; 

    int compare(const void *s1, const void *s2) 
    { 
     struct employee *e1 = (struct employee *)s1; 
     struct employee *e2 = (struct employee *)s2; 
     int gendercompare = strcmp(e1->gender, e2->gender); 
     if (gendercompare == 0) /* same gender so sort by id */ 
     return e1->id - e2->id; 
     else 
     return -gendercompare; 
    } 

    main() 
    { 
     int i; 
     struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}}; 

     for (i = 0; i < 3; ++i) 
     printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name); 

     qsort(info, 3, sizeof(struct employee), compare); 

     for (i = 0; i < 3; ++i) 
     printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name); 
    } 

है उत्पादन के साथ:

$ ./a.exe 
1234 male Matt 
2345 female Jessica 
1235 male Josh 
1234 male Matt 
1235 male Josh 
2345 female Jessica 
+1

मुझे लगता है कि हम "संख्यात्मक क्रम से उप क्रम" चाहते हैं – dreamcrash

+0

यहां एक तरह का सवाल है लेकिन कहें कि मैं एक फ़ंक्शन परिभाषित करता हूं। मैं उस समारोह में कर्मचारी जानकारी के शंकु कैसे पास करूं? – bardockyo

+0

अगर किसी को यह समझने में समस्या है, तो https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.bpxbd00/qsort.htm का संदर्भ ले सकते हैं –

2

परिणाम मुद्रण के बारे में कैसे जाना struct पर अपने पसंदीदा छँटाई कलन विधि का प्रयोग कर सकता है सरणी। सरणी के दो तत्वों की तुलना करते समय यह तय करने के लिए कि "अधिक" कौन सा है, उनके लिंग की तुलना करें; यदि लिंग समान हैं, तो उनकी संख्या की तुलना करें। (आप चीजों को स्पष्ट करने के लिए, इस तुलना करने के लिए एक अलग फ़ंक्शन को परिभाषित करना चाह सकते हैं।) बाद में, वांछित स्वरूपण का उपयोग करके क्रमबद्ध सरणी मुद्रित करें। जब लिंग पुरुष से मादा तक स्विच करता है तो ट्रैक रखें ताकि आप अपने उदाहरण में अतिरिक्त तीन न्यूलाइन डाल सकें।

संपादित करें: कलिकैक से लापरवाही से उधार लेने के लिए, आप बस अपने तुलनात्मक कार्य को qsort पर पास कर सकते हैं, लेकिन यदि यह एक "संरचना" है, तो 1 लौटा है, -1 यदि यह "कम" है और (यदि आवश्यक हो) 0 यह वही है (ऊपर उल्लिखित प्रक्रिया का उपयोग करके)। कस्टम तुलना फ़ंक्शन लिखने में सहायता के लिए How to write a compare function for qsort from stdlib? पर एक नज़र डालें।

+0

प्रतिक्रिया के लिए दोनों धन्यवाद। मैं सोच रहा था कि सॉर्टिंग एल्गोरिदम का उपयोग करते समय लिंग की जांच कैसे करें। उदाहरण के लिए कहें कि अगर मैं सही हूं तो बाएं और बाएं नर है तो मैं क्विकॉर्ट का उपयोग कर रहा हूं? – bardockyo

+0

मेरे उदाहरण में तुलना विधि देखें। ऑर्डर करने पर आपका निर्णय लेने के दौरान आप अपनी संरचना में से किसी भी फ़ील्ड को देख सकते हैं। – kallikak

0

सोचो यह समझना महत्वपूर्ण है, जैसा कि मैंने सूचक में कमजोर हूँ आसान है, आशा है कि यह मदद करता है ............

#include<bits/stdc++.h> 

using namespace std; 


struct employee{ 
    char gender[13]; 
    char name[13]; 
    int id; 
}; 

bool compare(employee s1,employee s2) 
{ 
    return s1.id<s2.id; 
} 

main() 
{ 
    int i; 
    struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}}; 
    sort(info,info+3,compare); 
    for (i = 0; i < 3; i++) 
    printf("%d\t%s\t%s\n",info[i].id,info[i].gender,info[i].name); 
}