C++ एक ही टाइप के एलिमेंट को क्रमबद्ध तरीके से रखने के लिए अलग-अलग कंटेनर देता है।
एक तय आकार वाले कंटेनर के लिए std::array है, और डायनैमिक रीसाइज़िंग की सुविधा वाला std::vector है।
जब आप कोई ऐरे या वेक्टर घोषित करते हैं, तो आपको उन एलिमेंट का टाइप बताना होता है जिन्हें वह कंटेनर रखेगा। ऐरे के लिए आकार भी बताना होता है। इन दोनों कंटेनर टाइप के इनिशियलाइज़ेशन देखने के लिए इन उदाहरणों पर नज़र डालिए:
#include <array>
#include <string>
// std::array<element_type, size> variable_name {list of elements}
std::array<std::string, 3> indie_rock {"yeah", "yeah", "yeah"};
// indie_rock contains the elements "yeah" three times
वेक्टर को आम तौर पर अधिक जगह चाहिए होती है, क्योंकि वे आगे बढ़ने के लिए मेमोरी आवंटित करते हैं। आपको आकार बताने की ज़रूरत नहीं है:
#include <vector>
// std::vector<element_type> variable_name {list of elements}
std::vector<int> countdown {3, 2, 1};
// countdown contains the elements 3, 2 and 1
ध्यान दें: टेम्पलेट की अवधारणा के पीछे का सटीक तरीका आपको अभी जानने की ज़रूरत नहीं है, सिलेबस में आगे इसका अपना कॉन्सेप्ट आएगा।
वेक्टर और ऐरे अपने एलिमेंट एक्सेस करने के लिए एक जैसे फंक्शन इस्तेमाल करते हैं।
कंटेनर के पहले और अंतिम एलिमेंट पाने के लिए आप मेम्बर फंक्शन front और back इस्तेमाल कर सकते हैं।
किसी खास एलिमेंट तक पहुँचने के लिए at और [] ऑपरेटर भी हैं।
countdown[0];
// => 3
countdown.at(2);
// => 1
countdown[1] = 4;
// countdown now contains 3, 4 and 1
indie_rock.back() = "yeahs";
// indie_rock is now "yeah", "yeah", "yeahs"
ध्यान दें: अगर आप ऐसी स्थिति चुनते हैं जो आपके कंटेनर की रेंज में नहीं है, तो
[]अपरिभाषित व्यवहार तक ले जा सकता है।atफंक्शन एक एक्सेप्शन उठाएगा, जो लंबे समय में आपका काम आसान बना सकता है।
चूँकि vector का आकार तय नहीं होता, इसलिए इसमें एलिमेंट जोड़े या हटाए जा सकते हैं।
इस काम के लिए दो आम फंक्शन हैं, emplace_back और pop_back.
std::vector<std::string> witches {"Holly", "Alyssa", "Shannen"};
witches.pop_back();
// Shannen is no longer with the witches
witches.emplace_back("Rose");
// Rose has joined the team
आप मेम्बर फंक्शन empty की मदद से देख सकते हैं कि कंटेनर खाली है या नहीं।
अगर आप एलिमेंट की संख्या जानना चाहते हैं, तो size इस्तेमाल कर सकते हैं।
आप एक टीचिंग असिस्टेंट हैं और छात्रों की परीक्षाएँ जाँचते हैं। नतीजों का हिसाब हाथ से रखना अब उबाऊ भी लगता है और गलतियों से भरा भी। इसलिए आपने कक्षा के नतीजे गिनने और निकालने के लिए कुछ फंक्शन बनाने का मन बनाया, ताकि यह काम थोड़ा और दिलचस्प हो जाए।
परीक्षा के सवालों पर आप "आंशिक अंक" दे सकते हैं, लेकिन पूरी परीक्षा के स्कोर int ही होने चाहिए।
इसलिए कक्षा के स्कोर के साथ कुछ और करने से पहले आपको सारे ग्रेड देखने होंगे और हर double स्कोर को int में बदलना होगा।
round_down_scores() नाम का फंक्शन बनाइए, जो student_scores का एक vector लेता है।
स्कूल जिस राउंडिंग की माँग करते हैं, वह दशमलव के बाद के अंक काट देना है।
अच्छी बात यह है कि C++ में static_cast की मदद से एक टाइप को दूसरे टाइप में बदला जा सकता है।
double से int में static_cast करने पर दशमलव के बाद का हर अंक कट जाता है।
यह फंक्शन इनपुट vector लेकर एक नया वेक्टर return करता है, जिसमें सभी स्कोर ints में बदल चुके होते हैं।
std::vector<double> student_scores {90.33, 40.5, 55.44, 70.05, 30.55, 25.45, 80.45, 95.3, 38.7, 40.3};
round_down_scores(student_scores)
// => {90, 40, 55, 70, 30, 25, 80, 95, 38, 40}
एक ही नतीजा पाने के और भी तरीके हैं, लेकिन कास्ट आम बात है।
int new_PI{static_cast<int>(3.14) + static_cast<int>(0.001592653589)};
// new_PI is 3.
जब आप परीक्षा जाँच रहे थे, तो आपने देखा कि कुछ छात्र उतना अच्छा नहीं कर पाए जितना आप चाहते थे। लेकिन आपका ध्यान भटक गया और आप यह नोट करना भूल गए कि कितने छात्र थे।
count_failed_students() नाम का फंक्शन बनाइए, जो student_scores का एक vector लेता है।
यह फंक्शन उन छात्रों की गिनती करता है जिनके स्कोर पास होने लायक नहीं हैं, और वह संख्या एक पूर्णांक के रूप में लौटाता है।
परीक्षा में पास होने के लिए छात्र का स्कोर 40 से अधिक होना चाहिए।
count_failed_students({90,40,55,70,30,25,80,95,38,40});
// => 5
जिस शिक्षक की आप मदद कर रहे हैं, वे संख्यात्मक स्कोर के साथ-साथ लेटर ग्रेड भी देना पसंद करते हैं। परीक्षा में छात्रों को 100 अंक कम ही मिलते हैं, इसलिए लेटर ग्रेड की निचली सीमाएँ परीक्षा में मिले सबसे ऊँचे स्कोर के आधार पर निकाली जाती हैं और सबसे ऊँचे स्कोर से लेकर <= 40 की फेल होने की सीमा तक बराबर-बराबर अंतराल पर बढ़ती जाती हैं।
letter_grades() नाम का फंक्शन बनाइए, जो पैरामीटर के रूप में परीक्षा का "सबसे ऊँचा" स्कोर लेता है और हर "अमेरिकी शैली" के ग्रेड अंतराल के लिए निचली स्कोर सीमाओं का एक array (वेक्टर नहीं) लौटाता है: ["D", "C", "B", "A"]।
/*Where the highest score is 100, and failing is <= 40.
"F" <= 40
41 <= "D" <= 55
56 <= "C" <= 70
71 <= "B" <= 85
86 <= "A" <= 100
*/
letter_grades(100);
// => {41, 56, 71, 86}
/*Where the highest score is 88, and failing is <= 40.
"F" <= 40
41 <= "D" <= 52
53 <= "C" <= 64
65 <= "B" <= 76
77 <= "A" <= 88
*/
letter_grades(88);
// => {41, 53, 65, 77}
आपके पास परीक्षा के स्कोर अवरोही क्रम में हैं और उनके साथ उन छात्रों के नाम भी (जो उनके परीक्षा स्कोर के क्रम में लगे हुए हैं)। आप हर छात्र के नाम को उसके परीक्षा स्कोर से मिलाना चाहते हैं और पूरी कक्षा की रैंकिंग छापना चाहते हैं।
student_ranking() नाम का फंक्शन बनाइए, जिसके पैरामीटर student_scores और student_names हों।
student_names vector में मौजूद हर छात्र के नाम को student_scores vector में उसके स्कोर से मिलाइए।
आप यह मान सकते हैं कि हर आर्गुमेंट vector सबसे ऊँचे स्कोर वाले से सबसे कम स्कोर वाले तक के क्रम में लगा हुआ है।
फंक्शन को <rank>. <student name>: <student score> प्रारूप वाली स्ट्रिंग्स का एक vector लौटाना चाहिए।
std::vector<int> student_scores {100, 99, 90, 84, 66, 53, 47};
std::vector<std::string> student_names {"Joci", "Sara","Kora","Jan","Indra","Bern", "Fred"};
student_ranking(student_scores, student_names)
// =>
// {"1. Joci: 100", "2. Sara: 99", "3. Kora: 90", "4. Jan: 84", "5. Indra: 66", "6. Bern: 53", "7. Fred: 47"}
परीक्षा में 100 का "परफेक्ट" स्कोर कम ही मिलता है, लेकिन यह जानना दिलचस्प होता है कि क्या कम से कम एक छात्र ने यह स्कोर पाया है।
perfect_score() नाम का फंक्शन बनाइए, जिसके पैरामीटर student_scores और student_names हों।
सूचियाँ वही हैं जो कार्य 4 में दी गई थीं।
फंक्शन को उस छात्र का पहला <name> (स्ट्रिंग के रूप में) return करना चाहिए, जिसने परीक्षा में 100 अंक पाए हों।
अगर 100 अंक पाने वाला कोई न मिले, तो खाली स्ट्रिंग "" लौटाई जानी चाहिए।
perfect_score({"Nur", "Tony", "Fatima"}, {90, 80, 100});
// => "Fatima"
perfect_score({"Nur", "Tony"}, {90, 80});
// => ""
Exercism पर साइन अप कीजिए और C++ को 19 कॉन्सेप्ट100 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।