C बुनियाद पुनराभ्यास
हर प्रोग्राम का ट्रेस उसके वर्तमान पूर्णांक मानों से करें। कॉल में caller के चरों को helper के पैरामीटर और स्थानीय चरों से अलग रखें। लूप में अंत में गलत होने वाली जाँच भी लिखें। उत्तर के साथ अवस्था का छोटा ट्रेस बनाएँ, ताकि बाद में तर्क जाँच सकें।
यह पाँच C बुनियादी पाठों का निःशुल्क, बिना समय-सीमा वाला पुनराभ्यास है। इसमें 12 प्रश्न हैं; प्रत्येक 1 अंक का है, कुल 12 अंक। सही उत्तर पर +1 और गलत या छोड़े गए उत्तर पर 0 मिलता है। न ऋणात्मक अंक हैं, न आंशिक अंक, न उत्तीर्ण होने की कोई सीमा। यह इसी सीमित C बुनियाद का अभ्यास है, पूरा GATE CS पाठ्यक्रम या पूर्ण GATE प्रश्नपत्र नहीं।
- MCQ: ठीक एक विकल्प चुनें।
- MSQ: सभी सही विकल्प चुनें। चुना गया समुच्चय उत्तर से पूरी तरह मिलना चाहिए; कोई सही विकल्प छूटने या अतिरिक्त गलत विकल्प चुनने पर 0 मिलेगा। विकल्प चुनने का क्रम मायने नहीं रखता।
- NAT: माँगा गया पूर्णांक लिखें। इन तीन प्रश्नों के उत्तर सटीक पूर्णांक हैं।
- प्रश्न आज़माने के बाद हल देखें। संबंधित अवस्था-ट्रेस फिर पढ़ें और बिना टाइमर दोबारा प्रयास करें; अंक सीखने की प्रतिक्रिया हैं, चयन या योग्यता की भविष्यवाणी नहीं।
सभी प्रश्नों में C11 उपयोग करें। हर दिखाया code block पूरा और स्वतंत्र प्रोग्राम है: उसके अपने शुरुआती मानों से फिर शुरू करें। यहाँ गणना के सभी मान पोर्टेबल signed int सीमा -32767 से 32767 में आते हैं। हर मूल्यांकित भाग में भाजक गैर-शून्य है और भागफल निरूपित हो सकता है। कॉल से पहले प्रकार सहित फ़ंक्शन-परिभाषा दी गई है और हर पहुँचने वाले रास्ते पर helper पूर्णांक लौटाता है। int की कोई खास बिट-चौड़ाई नहीं मानी गई है। %d से छपने वाले मान पूर्णांक हैं और \n आउटपुट पंक्ति समाप्त करता है।
प्रश्न
प्रश्न 1 · MCQ · 1 अंक
कौन-सी जोड़ी छपती है? ठीक एक विकल्प चुनिए।
#include <stdio.h>
int main(void) {
int a=5,b=8;
a=b-a;
b=b+a;
printf("%d %d\n",a,b);
return 0;
}- A.
3 11 - B.
3 8 - C.
5 13 - D.
3 3
प्रश्न 2 · NAT · 1 अंक
छपने वाला पूर्णांक लिखिए।
#include <stdio.h>
int main(void) {
int total=58,group=9;
int leftover=total-group*(total/group);
printf("%d\n",leftover);
return 0;
}प्रश्न 3 · MCQ · 1 अंक
n, left, right के क्रम में कौन-से तीन मान छपते हैं? ठीक एक विकल्प चुनिए।
#include <stdio.h>
int main(void) {
int n=2;
int left=n++;
int right=++n;
printf("%d %d %d\n",n,left,right);
return 0;
}- A.
4 3 4 - B.
3 2 3 - C.
4 2 4 - D.
4 2 3
प्रश्न 4 · MSQ · 1 अंक
int p=-17 और q=5 पर सभी सही कथन चुनिए।
#include <stdio.h>
int main(void) {
int p=-17,q=5;
printf("%d %d %d\n",p/q,p%q,(p/q)*q+p%q);
return 0;
}- A. p/q का मान -3 है
- B. p%q का मान 3 है
- C. (p/q)*q+p%q का मान p है
- D. p/q का मान -4 है
प्रश्न 5 · MCQ · 1 अंक
tag का कौन-सा मान छपता है? ठीक एक विकल्प चुनिए।
#include <stdio.h>
int main(void) {
int c=7,tag=0;
if(c<5){tag=1;}else if(c%2==1){tag=2;}else{tag=3;}
printf("%d\n",tag);
return 0;
}- A.
1 - B.
2 - C.
3 - D.
0
प्रश्न 6 · MSQ · 1 अंक
int a=0 और b=6 पर किन व्यंजकों का मान 1 है? सभी सही विकल्प चुनिए।
#include <stdio.h>
int main(void) {
int a=0,b=6;
printf("%d %d %d %d\n",!a,a||(b>4),a&&(b>0),!(b==6));
return 0;
}- A.
!a - B.
a || (b > 4) - C.
a && (b > 0) - D.
!(b == 6)
प्रश्न 7 · NAT · 1 अंक
body के चलने की संख्या लिखिए।
#include <stdio.h>
int main(void) {
int count=0;
for(int k=3;k<=12;k+=3){count++;}
printf("%d\n",count);
return 0;
}प्रश्न 8 · MCQ · 1 अंक
कौन-सा पूर्णांक छपता है? हर भाग और शेषफल का ट्रेस कीजिए। ठीक एक विकल्प चुनिए।
#include <stdio.h>
int main(void) {
int n=19,sum=0;
while(n>0){sum+=n%3;n/=3;}
printf("%d\n",sum);
return 0;
}- A.
4 - B.
6 - C.
19 - D.
3
प्रश्न 9 · MSQ · 1 अंक
इस for लूप के सभी सही कथन चुनिए। अंतिम असफल जाँच भी गिनिए।
#include <stdio.h>
int main(void) {
int sum=0,i;
for(i=0;i<4;i++){sum+=2*i;}
printf("%d %d\n",sum,i);
return 0;
}- A. body 4 बार चलती है
- B. शर्त 4 बार जाँची जाती है
- C. अंतिम sum 12 है
- D. अपडेट i++ 4 बार चलता है
प्रश्न 10 · MCQ · 1 अंक
कौन-सी जोड़ी छपती है? ठीक एक विकल्प चुनिए।
#include <stdio.h>
int bump(int x){x+=3;return x;}
int main(void) {
int v=4;
int result=bump(v);
printf("%d %d\n",v,result);
return 0;
}- A.
7 7 - B.
4 7 - C.
4 4 - D.
7 4
प्रश्न 11 · NAT · 1 अंक
अंत में छपने वाला पूर्णांक लिखिए।
#include <stdio.h>
int accumulate(int n){int s=1;for(int k=1;k<=n;k++){s+=2*k;}return s;}
int main(void) {
int r=accumulate(3);
int t=accumulate(1);
printf("%d\n",r-t);
return 0;
}प्रश्न 12 · MSQ · 1 अंक
केवल -3 से 3 तक के input लें। choose के सभी सही कथन चुनिए।
#include <stdio.h>
int choose(int n){if(n<0){return -n;}return n+1;}
int main(void) {
int a=choose(-3);
int b=choose(0);
int c=choose(2);
int value=-2;
int result=choose(value);
printf("%d %d %d %d %d\n",a,b,c,value,result);
return 0;
}- A. choose(-3) का लौटाया मान 3 है
- B. choose(0) का लौटाया मान 0 है
- C. choose(2) का लौटाया मान 3 है
- D. choose(value) की कॉल caller के int चर value को नहीं बदलती
उत्तर और पूरे हल
नीचे दिए तर्क से केवल अंतिम संख्याएँ नहीं, अवस्थाएँ भी मिलाएँ।
प्रश्न 1
उत्तर: A
- शुरू में
a = 5, b = 8हैं। a = b - aवर्तमान 8 और 5 पढ़कर 3 निकालता है और उसेaमें रखता है। अवस्था:a = 3, b = 8।b = b + aअब 8 और अपडेट हुआ 3 पढ़ता है, इसलिएb = 11।- आउटपुट क्रम
a, bहै, इसलिए3 11छपता है।
विकल्पों की जाँच
- A: सही। दोनों असाइनमेंट क्रम से लागू किए गए हैं।
- B: गलत।
3 8पहली असाइनमेंट के बाद रुक जाता है औरbका अपडेट छोड़ता है। - C: गलत।
5 13पुरानेa = 5को बनाए रखता है और दूसरी असाइनमेंट में उपयोग करता है, जबकिaपहले ही 3 हो चुका है। - D: गलत।
b = b + aमें 8 और 3 जुड़ते हैं; यहaकोbमें कॉपी नहीं करता।
प्रश्न 2
उत्तर: 4
total / groupके दोनों operands पूर्णांक हैं:58 / 9से 6 पूरे समूह मिलते हैं।- समूह के आकार को भागफल से गुणा करें:
9 * 6 = 54। - कुल में से समूहों में लगी संख्या घटाएँ:
58 - 54 = 4। - अतः
leftover = 4और उत्तर पूर्णांक 4 है। जाँच:6 * 9 + 4 = 58, जहाँ0 <= 4और4 < 9दोनों सही हैं।
6 भागफल है, बची मात्रा नहीं। 54 पूरे समूहों में रखी संख्या है। 0 तब आएगा जब भाग को वास्तविक संख्याओं वाला सटीक भागफल माना जाए; C का पूर्णांक भाग गुणा से पहले ही भिन्न भाग हटा चुका है।
प्रश्न 3
उत्तर: C
- शुरू में
n = 2है। left = n++में व्यंजक का मान पुराना 2 है, इसलिएleft = 2; इस कथन के अंत तकn = 3हो जाता है।right = ++nपहलेnको 3 से 4 करता है, फिर 4 देता है, इसलिएright = 4।printfसे पहले दोनों अलग कथन पूरे हो चुके हैं। माँगे गएn, left, rightक्रम में4 2 4छपता है।
विकल्पों की जाँच
- A: गलत।
left = 3मानने पर postfixn++को बढ़ा हुआ मान देने वाला समझ लिया गया है। - B: गलत। दो बढ़ोतरी वास्तव में चलती हैं, इसलिए
nका अंतिम मान 3 नहीं है;rightको 4 मिलता है। - C: सही। रखे गए मान 2 और 4 हैं, जबकि अंतिम
nका मान 4 है। - D: गलत।
right = 3मानने पर prefix++nको पुराना मान देने वाला समझ लिया गया है।
प्रश्न 4
उत्तर: A, C
- गणितीय भागफल -3.4 है। C11 का पूर्णांक भाग भिन्न भाग हटाकर शून्य की ओर जाता है, इसलिए
p / q = -3। - पुनर्निर्माण पहचान उपयोग करें:
-17 = (-3) * 5 + r, इसलिएr = -2। अतःp % q = -2। - C के दोनों परिणाम रखने पर
(p / q) * q + p % q = (-3) * 5 + (-2) = -17, जोpके बराबर है। - इसलिए चुना गया समुच्चय ठीक A और C होना चाहिए।
विकल्पों की जाँच
- A: सही। -3.4 को शून्य की ओर काटने पर -3 मिलता है।
- B: गलत। धनात्मक शेषफल 3 भागफल -4 के साथ मेल खाता है, पर यहाँ C11 का भागफल -4 नहीं है। C का शेषफल -2 है।
- C: सही। भाजक शून्य नहीं है और भागफल निरूपित हो सकता है, इसलिए दी गई पहचान लागू होती है और -17 मिलता है।
- D: गलत। -4 ऋणात्मक अनंत की ओर नीचे का मान है; C11 का पूर्णांक भाग शून्य की ओर जाता है।
प्रश्न 5
उत्तर: B
- शुरू में
c = 7, tag = 0हैं। - पहली शर्त
c < 5गलत है, इसलिएtag = 1छोड़ दिया जाता है। - फिर
c % 2का मान 1 है, इसलिएc % 2 == 1सही है।tag = 2चलता है। - पिछली शाखा चुनी जा चुकी है, इसलिए अंतिम
elseछोड़ दिया जाता है। आउटपुट 2 है।
विकल्पों की जाँच
- A: गलत। 1 का असाइनमेंट उस शाखा में है जिसकी शर्त गलत है।
- B: सही। विषम संख्या वाली शर्त की शाखा चुनी जाती है।
- C: गलत। सही
else ifशाखा के बाद अंतिमelseनहीं चलता। - D: गलत। चलने वाला
tag = 2असाइनमेंट शुरुआती 0 को बदल देता है।
प्रश्न 6
उत्तर: A, B
aका मान 0 है, इसलिए तार्किक जाँच में वह गलत है।bका मान 6 है।!aअर्थात!0का मान 1 है।a || (b > 4)में बायाँ operand गलत है, इसलिए दायाँ operand जाँचा जाता है।6 > 4सही है और तार्किक OR का मान 1 है।a && (b > 0)में बायाँ operand गलत है, इसलिए दायाँ operand छोड़ दिया जाता है और तार्किक AND का मान 0 है।!(b == 6)में समानता सही है और उसका मान 1 है; उसे नकारने पर 0 मिलता है। केवल A और B का मान 1 है।
विकल्पों की जाँच
- A: सही। तार्किक निषेध शून्य को 1 में बदलता है।
- B: सही। कम से कम एक operand सही है, इसलिए
||का मान 1 है, गैर-शून्य चर का मान 6 नहीं। - C: गलत। बायाँ operand गलत होने पर
&&दाएँ operand को जाँचे बिना 0 देता है। - D: गलत। समानता
b == 6सही है, इसलिए उसका निषेध 0 है।
प्रश्न 7
उत्तर: 4
- आरंभीकरण से
count = 0और लूप काk = 3होता है। k = 3पर शर्त सही है: count 1 होता है; अपडेट सेk = 6।k = 6पर शर्त सही है: count 2 होता है; अपडेट सेk = 9।k = 9पर शर्त सही है: count 3 होता है; अपडेट सेk = 12।k = 12पर भी शर्त सही है क्योंकि अंतिम सीमा शामिल है: count 4 होता है; अपडेट सेk = 15।k = 15पर शर्त गलत है। चार body और चार अपडेट हुए, पर शर्त पाँच बार जाँची गई। माँगी गई body की संख्या 4 है।
3 में शामिल अंतिम मान 12 छोड़ दिया गया है। 5 में अंतिम असफल शर्त को भी body चलने जैसा गिना गया है। 10 में 3-3 की दूरी वाले वास्तविक मानों के बजाय 3 से 12 तक हर पूर्णांक गिना गया है।
प्रश्न 8
उत्तर: D
- शुरू में
n = 19, sum = 0;19 > 0सही है। - पहली body:
19 % 3 = 1, इसलिएsum = 1; फिरn /= 3से19 / 3 = 6रखा जाता है। - दूसरी जाँच
6 > 0सही है।6 % 3 = 0, इसलिएsum1 रहता है; पूर्णांक भाग सेn = 2। - तीसरी जाँच
2 > 0सही है।2 % 3 = 2, इसलिएsum = 3; पूर्णांक भाग सेn = 0। 0 > 0गलत है, इसलिए लूप समाप्त होता है। तीन body और चार जाँच हुईं; छपने वाली मात्रा शेषफलों का योग 3 है।
विकल्पों की जाँच
- A: गलत। 4 शर्त की जाँचों की संख्या है, शेषफलों का योग नहीं। अंतिम असफल जाँच कुछ नहीं जोड़ती।
- B: गलत। 6 पहली बार अपडेट हुए
nका मान है,sumसे छपने वाला अंतिम मान नहीं। - C: गलत। शुरुआती 19 को
sumमें नहीं जोड़ा जाता; हर body में केवलn % 3जुड़ता है। - D: सही। जुड़े शेषफल 1, 0 और 2 हैं, जिनका योग 3 है।
प्रश्न 9
उत्तर: A, C, D
sum = 0से शुरू करें, फिरi = 0आरंभ होता है।i = 0पर शर्त0 < 4सही है।2 * 0 = 0जोड़ने परsum = 0रहता है; अपडेट सेi = 1।i = 1पर शर्त1 < 4सही है। 2 जोड़ने परsum = 2; अपडेट सेi = 2।i = 2पर शर्त2 < 4सही है। 4 जोड़ने परsum = 6; अपडेट सेi = 3।i = 3पर शर्त3 < 4सही है। 6 जोड़ने परsum = 12; अपडेट सेi = 4।i = 4पर शर्त4 < 4गलत है। न पाँचवीं body चलती है, न पाँचवाँ अपडेट। body की संख्या 4, अपडेट की संख्या 4 और जाँच की संख्या 5 है। आउटपुट12 4है; सही कथन A, C और D हैं।
विकल्पों की जाँच
- A: सही। body
i = 0, 1, 2, 3पर चलती है। - B: गलत। चार सफल जाँच और एक अंतिम गलत जाँच मिलकर पाँच होती हैं।
- C: सही। जमा योग
0 + 2 + 4 + 6 = 12है। - D: सही। हर पूरी हुई body के बाद अपडेट चलता है; 3 से 4 करने वाला अपडेट भी इन चार में शामिल है।
प्रश्न 10
उत्तर: B
- caller में
v = 4है।bump(v)का आर्ग्युमेंट व्यंजक 4 देता है। - helper का अलग पैरामीटर
x = 4से शुरू होता है।x += 3से helper काx = 7होता है। return xhelper समाप्त करके 7 लौटाता है। caller इसेresultमें रखता है।- caller के
vको कोई नया मान असाइन नहीं हुआ; वह 4 रहता है। आउटपुट क्रमv, resultहै, इसलिए जोड़ी4 7है।
विकल्पों की जाँच
- A: गलत।
7 7मानता है कि helper के पैरामीटर का अपडेट caller केvको बदल देता है। - B: सही। आर्ग्युमेंट की कॉपी मिलती है और लौटा 7
resultमें रखा जाता है। - C: गलत।
4 4caller का मान सही रखता है, लेकिन return से पहले helper का जोड़ छोड़ देता है। - D: गलत। इसमें असाइनमेंट के बिना caller का
vबदल दिया गया है और पुराने मान को लौटे परिणाम के रूप में रखा गया है।
प्रश्न 11
उत्तर: 10
- पहली कॉल: पैरामीटर
n = 3; initializer के अनुसार स्थानीयsका शुरुआती मान 1 है। k = 1, 2, 3पर2, 4, 6जोड़ें।sके क्रमिक मान3, 7, 13हैं।k = 4पर शर्त गलत है, इसलिए 13 लौटता है औरr = 13रखा जाता है।- दूसरी कॉल: पैरामीटर
n = 1; इस कॉल का नया स्थानीयsफिर 1 से शुरू होता है। k = 1पर 2 जोड़ने सेs = 3। अपडेट सेk = 2; शर्त गलत है। 3 लौटता है औरt = 3रखा जाता है।- caller में
r - t = 13 - 3 = 10छपता है। उत्तर पूर्णांक 10 है।
13 पहली कॉल के बाद रुककर छपने वाले घटाव को छोड़ देता है। -2 तब आएगा जब दूसरी बार s को गलत ढंग से 13 से आगे बढ़ाकर 15 निकाला जाए और उसे 13 से घटाया जाए। 12 में दूसरी कॉल के लौटे 3 के बजाय उसका शुरुआती 1 घटाया गया है। केवल संख्या लिखना यह नहीं दिखाता कि दोनों स्थानीय आरंभीकरण का ट्रेस किया गया है।
प्रश्न 12
उत्तर: A, C, D
- दिए गए -3 से 3 तक हर पूर्णांक के लिए
n < 0जाँचें। ऋणात्मक input परreturn -nचलता है; शून्य और धनात्मक input परreturn n + 1। ऋणात्मक शाखा का return कॉल समाप्त करता है, इसलिए बाद का return भी साथ नहीं चलता। choose(-3)ऋणात्मक शाखा लेकर 3 लौटाता है।choose(0)में ऋणात्मक होने की शर्त गलत है और0 + 1 = 1लौटता है।choose(2)भी अंतिम return तक पहुँचता है और2 + 1 = 3देता है।- caller में
value = -2होने पर helper के अलग पैरामीटर को -2 मिलता है और वह 2 लौटाता है। caller काvalue-2 रहता है;result2 होता है। इसलिए दिखाया गया प्रोग्राम3 1 3 -2 2छापता है। - सही कथन ठीक A, C और D हैं। बताए गए inputs
-3, -2, -1, 0, 1, 2, 3पर क्रमशः outputs3, 2, 1, 1, 2, 3, 4हैं; पूरी अंकगणित दिए गए छोटे पूर्णांकों की सीमा में है।
विकल्पों की जाँच
- A: सही। -3 पर
n < 0सही है और-nका मान 3 है। - B: गलत। शून्य ऋणात्मक नहीं है; वह
return n + 1तक पहुँचकर 1 लौटाता है। - C: सही। धनात्मक 2 गैर-ऋणात्मक रास्ते से 3 लौटाता है।
- D: सही। helper को आर्ग्युमेंट का पूर्णांक मान मिलता है; गणना लौटाने से caller के
valueमें असाइनमेंट नहीं होता। बताई गई पूरी input सीमा में यह सही है।
किस बात का फिर अभ्यास करें
प्रश्न 1–प्रश्न 2: वर्तमान अवस्था और पूर्णांक अंकगणित। प्रश्न 3–प्रश्न 4: व्यंजक के मान और signed भाग। प्रश्न 5–प्रश्न 6: चुनी गई शाखाएँ और तार्किक जाँच। प्रश्न 7–प्रश्न 9: लूप की सटीक अवस्थाएँ और गिनती। प्रश्न 10–प्रश्न 12: पैरामीटर, स्थानीय आरंभीकरण और return। गलत प्रश्न में वह पहली अवस्था सुधारें जहाँ आपका ट्रेस अलग हुआ, फिर वहाँ से आगे दोबारा चलें।
स्रोत टिप्पणी
C11 के अर्थ-नियमों का संदर्भ WG14 का N1570 समिति मसौदा है। असाइनमेंट, अंकगणित, तार्किक ऑपरेटर, लूप और फ़ंक्शन के लिए §§6.5, 6.8.4–6.8.6 और 6.9.1 देखें।
उदाहरण से समझें
ट्रेस को ऐसा बही-खाता समझें जिसमें हर बदलाव की अलग पंक्ति है। असाइनमेंट एक प्रविष्टि बदलता है, शाखा चुनती है कि कौन-सी पंक्तियाँ चलेंगी और लूप शर्त गलत होने तक पंक्तियों का समूह दोहराता है। फ़ंक्शन कॉल अपने कॉपी किए पैरामीटर और स्थानीय चरों के लिए अलग कार्यपत्र खोलती है, फिर एक परिणाम लौटाती है। बही-खाते मिलाने से दिखता है कि दो सही लगने वाले उत्तरों में अंतर कहाँ शुरू हुआ।
सूत्र और नियम
- 12 प्रश्न, 12 अंक; निःशुल्क और बिना समय-सीमा; सही पर +1, गलत या खाली पर 0।
- MCQ: एक विकल्प। MSQ: ठीक पूरा सही समुच्चय, कोई आंशिक अंक नहीं। NAT: सटीक पूर्णांक।
- न ऋणात्मक अंक, न उत्तीर्ण सीमा। आगे किस बात का अभ्यास करना है, यह हल से पहचानें।
- हर प्रोग्राम उसके अपने शुरुआती मानों से शुरू करें; पिछले प्रश्न उसकी अवस्था नहीं बदलते।
- असाइनमेंट वर्तमान अवस्था उपयोग करता है। अलग बढ़ोतरी वाले कथन अगले कथन से पहले पूरे होते हैं।
- C11 का signed पूर्णांक भाग शून्य की ओर कटता है; शेषफल से भाज्य का पुनर्निर्माण होता है।
&&और||short-circuit करते हैं। तार्किक परिणाम 0 या 1 होते हैं।- सफल body, शर्त की जाँच और अपडेट अलग-अलग गिनें।
- पूर्णांक पैरामीटर caller के चर से अलग है। दिखाया हर स्थानीय initializer अपनी कॉल में फिर चलता है।
printfके आर्ग्युमेंट बताए आउटपुट क्रम में पढ़ें; इस क्रम को मूल्यांकन के सामान्य क्रम की गारंटी न समझें।
इस पाठ के नोट्स
प्रगति सहेजने के लिए साइन इन करें। साइन इन