Learn C Programming

lesson ৭ / ৮ · C-র সঙ্গে পরিচয়: প্রথম program, চিহ্ন ধরে ধরে

Module ১ · C-র সঙ্গে পরিচয়: প্রথম program, চিহ্ন ধরে ধরে

Problem: প্রথম program-গুলো

FreeProblem

এই lesson-এ যা শিখবে

  • Input, Output, Constraints আর একটা sample দিয়ে লেখা একটা problem পড়তে পারবে।
  • এমন program লিখতে পারবে, যার output প্রত্যাশিত output-র সঙ্গে হুবহু মেলে।
  • Submit করার আগে constraints-র দুই মাথায় নিজের program পরীক্ষা করতে পারবে।

এতক্ষণ যা পড়েছ, সেটা পেছনে পড়ে গেছে। এই page-এ দশটা problem, আর grading করে এমন একটা মেশিন, যে তোমার program যা ছেপেছে তার সঙ্গে যা ছাপার কথা ছিল সেটা character ধরে ধরে মেলায়।

এদের আটটার সঙ্গে lesson-গুলোর ভেতরেই তোমার দেখা হয়েছে। দুইটা নতুন। একটারও loop বা condition লাগে না, কারণ এই module ওই দুইটার একটাও শেখায়নি।

Judge তোমার program কীভাবে পড়ে

Judge চালাক না, আর আসল কথাটা ওটাই। প্রতিটা hidden test-র জন্য সে চারটা কাজ করে।

সে তোমার program চালায়। Test-র input program-র standard input-এ পাঠিয়ে দেয়, ঠিক যেমন Playground-র input-র বাক্স করে। তোমার program যা ছেপেছে সবটা জমা করে। তারপর ওটা প্রত্যাশিত output-র সঙ্গে মেলায়।

মেলানোয় দুইটা জিনিস বাদ যায়, আর কিছু না: লাইনের শেষের space, আর তোমার output-র একদম শেষের newline। বাকি সব গোনা হয়। ছোট হাতের জায়গায় বড় হাতের একটা অক্ষর মানে ভুল উত্তর, আর colon-র পরে একটা space বাদ পড়াও তাই।

তাই যে program ঠিক সংখ্যাগুলো ভুল গড়নে ছাপে, সে শূন্য পায়। একদিন এটা কঠোর মনে হয়, তারপর এটাই অভ্যাস হয়ে যায়।

এখানকার প্রতিটা problem-র গড়ন

এই page-র প্রতিটা problem-র একই পাঁচটা অংশ, আর সত্যিকারের judge-র প্রতিটা problem-রও তাই।

  • গল্পটা বলে কে কী চায়। এটা প্রসঙ্গ, শর্তের তালিকা না।
  • Input বলে standard input-এ হুবহু কী আসে, আর কোন ক্রমে।
  • Output বলে হুবহু কী ছাপতে হবে। এই অংশটা দুইবার পড়ো।
  • Constraints প্রতিটা মানের সীমা দেয়। এগুলোই বলে দেয় কোন test-গুলো আছে।
  • Sample হলো একটা input আর তার output, যাতে কিছু লেখার আগেই তুমি নিজের বোঝাটা মিলিয়ে নিতে পারো।

Hidden test দেখানো হয় না, আর প্রতিটা problem-র ছয়টা বা তার বেশি আছে। ওতে সব সময় থাকে সবচেয়ে ছোট অনুমোদিত input, সবচেয়ে বড়টা, আর গল্প যে মাথার দিকে ইশারা করে সেটা।

তাই Constraints এই page-র সবচেয়ে কাজের অংশ: এটা সেই test-গুলোর তালিকা, যেগুলো তোমার হাতে চালিয়ে দেখা উচিত।

Input পড়া, Module 3 ওটা শেখানোর আগেই

এখানকার প্রতিটা starter তোমার হয়ে input-টা আগেই পড়ে নেয়। scanf ঠিকভাবে শেখানো হয় Module 3-এ। তার আগে ওই লাইনটাকে আসবাব ধরে নাও: ওটা input-কে variable-এ বসিয়ে দেয়, আর তোমার কাজ শুরু হয় পরের লাইনে।

দুইটা খুঁটিনাটি এখনই খেয়াল করার মতো, কারণ দুইটা problem ওগুলোর উপর নির্ভর করে।

scanf("%d", &n) একটা পূর্ণসংখ্যা পড়ে, আর তার আগের space বা newline এড়িয়ে যায়। scanf("%c", &ch) ঠিক একটা character পড়ে, যা-ই হোক, space হলেও।

তাই character-র problem-গুলোতে space ছাড়া format string-টা ইচ্ছা করেই রাখা। ওটাকে " %c" করে দিলে যে test-র input একটা space, সেটা ভেঙে যায়।

Submit করার আগে কীভাবে পরীক্ষা করবে

চারটা যাচাই, এই ক্রমে, এই page-র প্রায় প্রতিটা ভুল উত্তর ধরে ফেলে।

  1. Sample চালাও। Sample-ই না মিললে আর কিছুতে কিছু আসে যায় না।
  2. Constraints-র দুই মাথা চালাও। সবচেয়ে ছোট অনুমোদিত মান আর সবচেয়ে বড়টা।
  3. নিজের output প্রত্যাশিত output-র পাশে রেখে পড়ো। Space গোনো। প্রতিটা বড় হাতের অক্ষর মিলিয়ে দেখো।
  4. শেষ লাইনটা দেখো। শেষে newline না ছাপা program এখানে চলে; বাড়তি একটা শব্দ ছাপা program চলে না।

তাই program লেখা হয়ে যাওয়ার পর পরীক্ষা করাটা বাড়তি কাজ না। program শেষ হয়েছে কি না, সেটা তুমি এভাবেই জানো।

Hint-র সিঁড়ি

নিচের প্রতিটা problem-এ তিনটা ধাপ আছে, ক্রমে খুলতে পারবে। Hint 1 বলে কী খেয়াল করতে হবে, আর Hint 2 পথটা কথায় বলে দেয়। তারপর Solution পুরো পদ্ধতিটা দুই অনুচ্ছেদে বোঝায়।

একটা hint খুললে তোমার কিছুই যায় না, আর ওটা শাস্তি না, শুধু লেখা থাকে। Solution পড়ার পরেও program-টা নিজে টাইপ করো, কারণ পড়াটা দক্ষতা না।

পড়ো, হিসাব করো, ছাপো: skeleton

#include <stdio.h>

int main(void)
{
    int n;                  declare what the input needs
    scanf("%d", &n);        read it, this line is given to you

    printf("...", n);       print exactly what Output asks for

    return 0;
}
  • Declaration আগে আসে, যাতে scanf-র মানটা রাখার জায়গা থাকে।
  • &n মানে "n-র address", আর এভাবেই scanf variable-টার কাছে পৌঁছায়। Module 11 এটা বোঝায়।
  • আর কিছুই ছাপা হয় না। কোনো prompt না, কোনো শিরোনাম না, কোনো ফাঁকা লাইন না।
  • return 0; judge-কে বলে program স্বাভাবিকভাবে শেষ হয়েছে।
Example 1: গোটা একটা problem, সমাধান করা

Problem-টা: দুইটা integer পড়ো আর তাদের যোগফল ছাপো। Input এক লাইনে দুইটা integer, output এক লাইনে একটা সংখ্যা।

#include <stdio.h>

int main(void)
{
    int a, b;
    scanf("%d %d", &a, &b);

    printf("%d\n", a + b);
    return 0;
}
11

ওই output-টা 7 4 input-র জন্য। Program-এ কী নেই সেটা খেয়াল করো: কোনো "Enter two numbers" prompt নেই, কোনো "The sum is" নেই, Output যা চায়নি এমন কিছুই নেই।

Compiler-এ চালাও
Example 2: হুবহু output, escape সহ

এখানকার অর্ধেক problem হুবহু output-র problem, তাই এই গড়নটায় সহজ হয়ে যাও। একটা tab, একটা quote, একটা percent চিহ্ন, তিন লাইনেই।

#include <stdio.h>

int main(void)
{
    printf("Name:\tZara\n");
    printf("Note:\t\"first attempt\"\n");
    printf("Score:\t80%%\n");
    return 0;
}
Name:	Zara
Note:	"first attempt"
Score:	80%

Source আর output character ধরে ধরে মেলাও। Source-র তিনটা জোড়া output-এ একটা করে character হয়ে গেছে, আর এটাই এক program-এ lesson 3-র পুরো escape table।

Compiler-এ চালাও
Example 3: একটা character পড়া

দশটার তিনটা problem সংখ্যা না, একটা character পড়ে। এটা সেই পড়াটা, আর যা এল সেটা ছাপার দুইটা উপায়।

#include <stdio.h>

int main(void)
{
    char ch;
    scanf("%c", &ch);

    printf("%c%c%c\n", ch, ch, ch);
    printf("%d\n", ch);
    return 0;
}
QQQ
81

ওই output-টা Q input-র জন্য। একই variable দুইবার ছাপা, একবার character হিসেবে আর একবার সংখ্যা হিসেবে, আর সেটাই lesson 4-র একটামাত্র কথা।

Compiler-এ চালাও

এটা কোথায় কাজে লাগছে

  • প্রতিটা programming contest. ICPC, Codeforces আর Progsity-র contest platform ঠিক এভাবেই grading করে: hidden test, standard input, আর তোমার output-র হুবহু মেলানো।
  • সত্যিকারের project-এ golden-file test. Compiler আর command line tool পরীক্ষা করা হয় ওগুলো চালিয়ে আর output-কে জমানো একটা file-র সঙ্গে মিলিয়ে। GCC-র নিজের test suite এভাবেই চলে।
  • CI-র regression যাচাই. যে build বাড়তি একটা লাইন ছাপে, সেটা diff-এ ফেল করে, আর এভাবেই একটা দল টের পায় কোনো tool-র output ভুলে বদলে গেছে।
  • স্বয়ংক্রিয় নম্বর দেওয়া. এই track-র পরের graded exercise আর Skill Test-র build অংশ, দুইটাই এই দশটা problem-র একই judge ব্যবহার করে।

যে ভুলগুলো সবাই করে

১. একটা prompt ছেপে দেওয়া।

printf("Enter the stall number: ");
scanf("%d", &n);

Compiler-র কোনো message নেই; program দেখতে বেশি ভদ্র লাগে আর শূন্য পায়। Judge দেখে Enter the stall number: === PROGSITY ===, আর ওটা মেলায় === PROGSITY ===-র সঙ্গে। Output যা চায়নি, এমন কিছুই ছাপবে না।

২. প্রত্যাশিত output-এ নেই এমন space।

printf("Maths : %d\n", a);

Colon-র আগে একটা space বেশি। হুবহু output-র problem-এ এটাই সবচেয়ে সাধারণ ভুল উত্তর, আর একমাত্র ওষুধ হলো নিজের output-র পাশে sample-টা রেখে পড়া।

৩. দেওয়া scanf লাইনটা বদলে ফেলা।

scanf(" %c", &ch);

বাড়তি space-টা scanf-কে বলে whitespace এড়িয়ে যেতে, তাই যে test-র input একটা space, সেটা বদলে newline পড়ে ফেলে। Program ছয়টা test পাস করে একটা ফেল করে, আর এই ধরনের ব্যর্থতা সারানোই সবচেয়ে গোলমেলে।

৪. অন্য একটা problem সমাধান করে ফেলা।

printf("Area is %d\n", 4 * s);

কোনো message নেই, আর sample-ও পাস করে যায়। পরিসীমা আর ক্ষেত্রফল মেলে বাহু 4-এ, আর কোথাও না। Sample পাস করছে কিন্তু test করছে না, এমন হলে Output-র অংশটা আবার পড়ো, মুখে বলে বলে।

মাথা খাটাও

Bob-র 1 নম্বর problem-র program ঠিক banner আর ঠিক stall নম্বর ছাপছে। দুইটাই সে নিজের পর্দায় দেখতে পাচ্ছে। Judge প্রতিটা test-এ ভুল উত্তর বলছে, sample সহ।

#include <stdio.h>

int main(void)
{
    int n;
    printf("Stall number? ");
    scanf("%d", &n);

    printf("=== PROGSITY ===\n");
    printf("Stall %d\n", n);
    return 0;
}

বলো judge হুবহু কী মিলিয়েছে, আর Bob নিজের পর্দায় সমস্যাটা কেন দেখতে পাচ্ছে না। তারপর কঠিন অর্ধেকটা: "Submit করার আগে কীভাবে পরীক্ষা করবে"-র চারটা যাচাইয়ের কোনটা এটা ধরে ফেলত?

Program যে প্রতিটা character ছাপে, ক্রমে লিখে ফেলো, input পড়ার আগে যেগুলো যায় সেগুলো সহ। তারপর মনে রাখো, input-র বাক্সে তুমি যা লেখো সেটা তোমার program-র output-র অংশ না।

Problem 1: banner-two-linesসহজ

Alice স্কুলের মেলায় বই বেচে, আর তার stall-র জন্য একটা সাইন লাগবে। সাইনটা দুই লাইনের: একটা বাঁধা banner, তারপর Stall শব্দটা আর তার stall নম্বর।

Input. এক লাইনে একটা integer n, stall নম্বর।

Output. দুই লাইন। প্রথমটা হুবহু === PROGSITY ===। দ্বিতীয়টা Stall, একটা space, তারপর n।

Constraints. 1 <= n <= 999।

Sample. Input 7 দিলে আসে === PROGSITY ===, তারপর Stall 7।

#include <stdio.h>

int main(void)
{
    int n;
    scanf("%d", &n);

    /* Your two printf calls go here. */

    return 0;
}
Compiler-এ চালাও

Hint 1

Input যা-ই হোক, banner কখনো বদলায় না। দুইটা লাইনের একটাতেই একটা সংখ্যা আছে।

Hint 2

দুইটা printf call। প্রথমটা নেয় একটা বাঁধা string, কোনো মান না; দ্বিতীয়টা নেয় একটা %d সহ string আর n variable-টা।

Solution

Banner-টা একটা বাঁধা string দিয়ে ছাপো, শেষে \n। তারপর দ্বিতীয় লাইনটা এমন একটা format string দিয়ে ছাপো যেখানে লেখা Stall %d, আর মান হিসেবে n পাঠাও। আর কিছুই ছাপা হয় না।

গোনার জিনিস একটাই, banner: তিনটা সমান চিহ্ন, একটা space, শব্দটা, একটা space, তিনটা সমান চিহ্ন। মুখস্থ থেকে না লিখে Output-র অংশ থেকে টুকে নাও, কারণ চার নম্বর সমান চিহ্নটা প্রতিটা test-এ ভুল উত্তর।

Problem 2: three-printf-linesসহজ

Maria চায় তার তিন বিষয়ের নম্বর ছোট একটা card-র মতো ছাপা হোক, প্রতি লাইনে এক বিষয়, তিনটা আলাদা printf call দিয়ে।

Input. এক লাইনে তিনটা integer a b c, মানে Maths, Physics আর Chemistry-র নম্বর।

Output. তিন লাইন: Maths: a, Physics: b, Chemistry: c। প্রতিটা colon-র পরে একটা space।

Constraints. 0 <= a, b, c <= 100।

Sample. Input 90 85 77 দিলে আসে Maths: 90, Physics: 85, Chemistry: 77।

#include <stdio.h>

int main(void)
{
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);

    /* Three printf calls, one per subject. */

    return 0;
}
Compiler-এ চালাও

Hint 1

তোমার প্রথম লাইন চলার সময় তিনটা মান আগেই a, b আর c-তে বসে আছে। তোমার call-র ক্রমটাই output-র ক্রম।

Hint 2

প্রতিটা লাইন মানে একটা বিষয়ের নাম, একটা colon, একটা space আর একটা %d। প্রথমটা লেখো, তারপর দুইবার copy করে প্রতিটায় দুইটা জিনিস বদলাও।

Solution

তিনটা call, Maths, Physics, Chemistry ক্রমে, প্রতিটার format string Subject: %d গড়নের আর শেষে \n, আর প্রতিটা নিজের variable পাঠাচ্ছে। Statement উপর থেকে নিচে চলে, তাই তুমি যে ক্রমে লিখবে judge সেই ক্রমেই দেখবে।

ফাঁদটা হলো colon-র পরের space। Maths:%d আর Maths : %d দুইটাই ভুল, আর দুইটাই তোমার পর্দায় প্রায় ঠিক লাগে। Sample-র output নিয়ে গুনে দেখো।

Problem 3: tab-and-quoteমাঝারি

Bob-র report লাইনটায় একটা tab আর একজোড়া উদ্ধৃতি চিহ্ন থাকতে হবে। খালি একটা quote string-টা আগেই শেষ করে দিত, তাই একটা escape লাগে।

Input. এক লাইনে একটা integer s, Bob-র score।

Output. দুই লাইন। প্রথমটা Bob wrote:, একটা tab, তারপর "Hello, C.", quote সহ ছাপা। দ্বিতীয়টা Score:, একটা tab, তারপর s।

Constraints. 0 <= s <= 100।

Sample. Input 95 দিলে আসে Bob wrote:, একটা tab, "Hello, C.", তারপর Score:, একটা tab, 95।

#include <stdio.h>

int main(void)
{
    int s;
    scanf("%d", &s);

    /* Two printf calls, with two escape sequences in the first. */

    return 0;
}
Compiler-এ চালাও

Hint 1

Tab একটা character, আর ওটা চারটা space না। Lesson 3-র table-এ ওটার escape দেখে নাও, তারপর quote-রটাও।

Hint 2

String-র ভেতরে একটা quote-র আগে একটা backslash লাগে। ওটা না দিলে string ওখানেই শেষ হয়ে যায়, আর compiler বাকি লাইনটা নিয়ে নালিশ করে।

Solution

প্রথম লাইনের format string-এ থাকে Bob wrote: কথাটা, তারপর \t, তারপর একটা escape করা quote, বার্তাটা, আরেকটা escape করা quote, আর \n। দ্বিতীয় লাইনটা Score:, \t, %d, \n, আর মান হিসেবে s।

Quote শেষ না হওয়ার message দিয়ে build ফেল করলে বুঝবে, string-র মাঝখানে তুমি একটা খালি " লিখেছ। এই problem ওই error-টাই শেখাতে আছে, তাই সারানোর আগে একবার ওটা পড়ো।

Problem 4: fix-the-syntaxসহজ

Bob-র দ্বিগুণ করার program-এ তিনটা syntax error আছে, আর আর কিছুই ভুল নেই। Compile হওয়া পর্যন্ত সারাও, তারপর দেখো উত্তরটা ঠিক আসছে কি না।

Input. এক লাইনে একটা integer n।

Output. এক লাইন: Double of n is 2n, দুইটা সংখ্যা বসানো অবস্থায়।

Constraints. 0 <= n <= 1000।

Sample. Input 21 দিলে আসে Double of 21 is 42।

#include <stdio.h>

int main(void)
{
    int n
    scanf("%d", &n);
    Printf("Double of %d is %d\n", n, n * 2);
    return 0;
Compiler-এ চালাও

Hint 1

তিনটা ভুল, আর compiler তার দুইটার নাম প্রায় হুবহু বলে দেবে। সে যে প্রথম message দেয় সেটা সারাও, আর আবার build করো।

Hint 2

একটা হলো বাদ পড়া semicolon, আর ওটার message পরের লাইনের নাম বলে। একটা বড় হাতের অক্ষর নিয়ে। একটা brace গোনা নিয়ে।

Solution

n-র declaration-এ একটা semicolon লাগে। Printf-র p ছোট হাতের লাগে, কারণ C ছোট আর বড় হাতের অক্ষর আলাদা গোনে আর বড় হাতের নামটা কেউ লেখেনি। আর function-র শেষ brace-টা লাগে, আর "end of input" message-টা ওটা নিয়েই।

হিসাবটা শুরু থেকেই ঠিক ছিল। এই problem-র আসল কথাটাই সেটা: তিনটা message, এক character-র তিনটা সারাই, আর উত্তরটা নিয়ে কোনো ভাবনা না।

Problem 5: square-areaমাঝারি

এই program প্রথম চেষ্টাতেই compile হয়, আর তবুও ভুল। Maria চায় একটা বর্গাকার tile-র ক্ষেত্রফল, আর program ছাপছে ওটার চারপাশের দূরত্ব।

Input. এক লাইনে একটা integer s, বর্গের বাহু সেন্টিমিটারে।

Output. এক লাইন: Area is X, যেখানে X হলো ক্ষেত্রফল বর্গ সেন্টিমিটারে।

Constraints. 1 <= s <= 100।

Sample. Input 4 দিলে আসে Area is 16। এই input-এ starter-টাও 16 ছাপে, আর ওটাই ফাঁদ।

#include <stdio.h>

int main(void)
{
    int s;
    scanf("%d", &s);

    printf("Area is %d\n", 4 * s);

    return 0;
}
Compiler-এ চালাও

Hint 1

Starter-টা input 5 দিয়ে চালাও, আর কাগজে হিসাব করো উত্তরটা কী হওয়া উচিত। Sample-ই সেই একমাত্র input যেখানে bug-টা অদৃশ্য।

Hint 2

বাহুর চার গুণ হলো tile-র চারপাশের দূরত্ব। ক্ষেত্রফল হলো বাহু গুণ সেই বাহুই।

Solution

4 * s-র বদলে s * s লেখো, আর কিছুই বদলাবে না। Output-র লেখা, newline আর পড়াটা সবই আগে থেকেই ঠিক, আর সেজন্যই এটা একটা semantic bug, syntax-র না।

সারাইটা না, শিক্ষাটা রাখো: পাস করা একটা sample বাকি test নিয়ে কিছুই প্রমাণ করে না। বাহু 4-ই একমাত্র জায়গা যেখানে পরিসীমা আর ক্ষেত্রফল মেলে, আর কেবল বাহু 4 নিয়ে বানানো একটা test-র সেট ভাঙা program-টাকেই ঠিক বলত।

Problem 6: restore-symbolsমাঝারি

Zara হাতে নোট নিচ্ছিল, আর চিহ্নের বদলে চিহ্নগুলোর নাম লিখে ফেলেছে। আসল চিহ্নগুলো ফিরিয়ে দাও, যাতে program-টা expression আর তার মান ছাপে।

Input. এক লাইনে দুইটা integer a b।

Output. ঠিক এক লাইন: (a + b) * 2 = X, দুইটা সংখ্যা আর উত্তরটা বসানো অবস্থায়।

Constraints. 0 <= a, b <= 1000।

Sample. Input 7 4 দিলে আসে (7 + 4) * 2 = 22।

#include <stdio.h>

int main(void)
{
    int a, b;
    scanf("%d %d", &a, &b);

    /* Print: open-paren, a, space, plus, space, b, close-paren,
       space, asterisk, space, 2, space, equals, space, the value. */
    printf("%d\n", 0);

    return 0;
}
Compiler-এ চালাও

Hint 1

ওই চিহ্নগুলোর কিছু ছাপার মতো লেখা, আর একটা হলো program-র করা হিসাব। টাইপ করার আগে ঠিক করো কোনটা কোনটা।

Hint 2

একটা printf, একটা format string যাতে তিনটা %d আছে, আর তার পরে তিনটা মান। Bracket আর asterisk string-র ভেতরে সাদামাটা character হিসেবেই বসে।

Solution

Format string-টা হলো একটা খোলা parenthesis, %d, একটা space, একটা plus, একটা space, %d আর একটা বন্ধ parenthesis। তারপর একটা space, একটা asterisk, একটা space, 2, একটা space, একটা সমান চিহ্ন, একটা space, %d আর একটা newline। তিনটা মান হলো a, b আর (a + b) * 2 expression-টা।

খেয়াল করো, parenthesis দুইবার আসছে দুইটা আলাদা কাজে: string-র ভেতরে character হিসেবে, আর expression-এ দল বাঁধার জন্য। C দুইটাকে কখনো মিলিয়ে ফেলে না, কারণ একটা quote-র ভেতরে আর একটা বাইরে।

Problem 7: char-codeসহজ

Maria এমন একটা tool বানাচ্ছে, যেটা যেকোনো key-র code দেখায়। একটা character পড়ো, আর তার decimal ASCII code ছাপো।

Input. এক লাইনে ঠিক একটা character, যেটা space-ও হতে পারে।

Output. এক লাইনে ওটার decimal ASCII code।

Constraints. Character-টা ছাপা যায় এমন ASCII, code 32 থেকে 126।

Sample. Input A দিলে আসে 65।

#include <stdio.h>

int main(void)
{
    char ch;
    scanf("%c", &ch);

    /* One printf. Which specifier do you need? */

    return 0;
}
Compiler-এ চালাও

Hint 1

Character-টা আগেই একটা সংখ্যা। তোমাকে কিছু বদলে নিতে হবে না; একই byte আরেকটা কাচ দিয়ে ছাপতে হবে।

Hint 2

একটা printf, একটা specifier, একটা variable। Lesson 4-র প্রথম example একই variable দুইভাবে ছেপেছিল।

Solution

ch-কে %d দিয়ে আর একটা newline সহ ছাপো। পুরো program ওটুকুই: input যে byte ch-তে বসিয়েছে সেটাই তার ASCII code, আর %d printf-কে বলে আকারটা না, সংখ্যাটা দেখাতে।

দেওয়া scanf-টা হুবহু যেমন আছে তেমনই রাখো। %c-র আগে একটা space program-কে whitespace এড়িয়ে যেতে বলত, আর একটা hidden test ইচ্ছা করেই তোমাকে একটা space দেয়।

Problem 8: digit-sum-threeমাঝারি

Amara এমন একটা form মেলাচ্ছে, যেখানে তিনটা অঙ্ক character হিসেবে আসে, মাঝে কিছু নেই। ওরা যা বোঝায়, সেগুলো যোগ করো।

Input. এক লাইনে ঠিক তিনটা অঙ্কের character, কোনো space নেই।

Output. এক লাইনে তিনটা অঙ্কের মানের যোগফল।

Constraints. প্রতিটা character '0' থেকে '9'।

Sample. Input 407 দিলে আসে 11।

#include <stdio.h>

int main(void)
{
    char a, b, c;
    scanf("%c%c%c", &a, &b, &c);

    /* Trick two, three times. */

    return 0;
}
Compiler-এ চালাও

Hint 1

আগে একটা character %d দিয়ে ছেপে দেখো, হাতে আসলে কী আছে। 4 অঙ্কটা 4 হিসেবে আসে না।

Hint 2

প্রতিটা character সে যে অঙ্ক দেখায় তার চেয়ে 48 বেশি। Lesson 4 তোমাকে ওই 48 লেখার এমন একটা উপায় দেয়, যাতে সংখ্যাটা টাইপ করতে হয় না।

Solution

তিনটা character-র প্রতিটা থেকে '0' বিয়োগ করো আর তিনটা ফল যোগ করো, একটা printf-র ভেতরে %d দিয়ে। a - 48-র বদলে a - '0' লেখাটাই পড়ার মতো রূপ, আর দুইটাই একই machine code বানায়।

যে যাচাইটা জরুরি: input 000 দিলে অবশ্যই 0 ছাপতে হবে। 144 ছাপলে বুঝবে তুমি মানের বদলে code যোগ করেছ, আর এই problem ওই ভুলটাই ধরতে আছে।

Problem 9: escape-invoiceমাঝারি

Kenji ছোট একটা receipt-র নিচের অংশ ছাপে। ওতে আছে একটা Windows path, একটা শতকরা আর quote-এ রাখা একটা কথা, মানে তিন লাইনে তিনটা escape।

Input. এক লাইনে একটা integer n, ছাড়ের শতকরা।

Output. তিন লাইন। Path:, একটা tab, তারপর C:\progsity\bin। তারপর Discount:, একটা tab, n, একটা percent চিহ্ন। তারপর Note:, একটা tab, আর quote-এ "keep the receipt"।

Constraints. 0 <= n <= 100।

Sample. Input 15 দিলে মাঝের লাইনে আসে Discount:, একটা tab, তারপর 15%।

#include <stdio.h>

int main(void)
{
    int n;
    scanf("%d", &n);

    /* Three printf calls. Watch the backslashes and the percent sign. */

    return 0;
}
Compiler-এ চালাও

Hint 1

এই output-র দুইটা character সোজা format string-এ টাইপ করা যায় না। একটা হলো backslash, আর আরেকটা সেই চিহ্ন যেটা একটা placeholder শুরু করে।

Hint 2

দুইটাই একবার ছাপার জন্য source-এ দুইবার লেখা হয়। Lesson 3-র escape table-এ backslash আছে; ওই table-র শেষ সারিতে আরেকটা।

Solution

তিনটা call। প্রথমটা ছাপে Path:, একটা tab, আর path-টা, যার প্রতিটা backslash source-এ দুইবার লেখা। দ্বিতীয়টা ছাপে Discount:, একটা tab, সংখ্যাটার জন্য %d, তারপর দুইটা percent চিহ্ন, যেটা printf একটা বানিয়ে দেয়। তৃতীয়টা ছাপে Note:, একটা tab, আর দুই মাথায় escape করা quote সহ কথাটা।

সাধারণ একটা অক্ষরের আগে একটা মাত্র backslash হলো ফাঁদ: \p undefined, আর \b একটা backspace, যেটা তার আগের character খেয়ে ফেলে। তোমার path প্রায় ঠিক দেখালে output-এ না, source-এ backslash গোনো।

Problem 10: alphabet-positionমাঝারি

Zara তাক-এ নাম বসাচ্ছে, আর একটা অক্ষর নিয়ে দুইটা তথ্য লাগবে: বর্ণমালায় ওটার অবস্থান, আর বড় হাতে ওটা দেখতে কেমন। কোনো library function না, কেবল হিসাব।

Input. এক লাইনে একটা ছোট হাতের অক্ষর, 'a' থেকে 'z'।

Output. দুই লাইন। প্রথমটা অক্ষরটা, তারপর is letter number, তারপর তার অবস্থান, যেখানে a মানে 1। দ্বিতীয়টা uppercase:, একটা space, আর অক্ষরটা বড় হাতে।

Constraints. Input সব সময় ছোট হাতের অক্ষর।

Sample. Input c দিলে আসে c is letter number 3, তারপর uppercase: C।

#include <stdio.h>

int main(void)
{
    char ch;
    scanf("%c", &ch);

    /* Two printf calls, and two of the three tricks. */

    return 0;
}
Compiler-এ চালাও

Hint 1

Lesson 4-র তিনটা কৌশলের দুইটা এই problem-এ আছে। একটা অবস্থান দেয়, আর একটা case বদলায়।

Hint 2

'a' - 'a' মানে 0, আর problem চায় a হোক 1 নম্বর। একটা অক্ষরের বড় হাতের রূপ তার 32 নিচে।

Solution

প্রথম লাইনে character-টা %c দিয়ে আর অবস্থানটা %d দিয়ে ছাপো, যেখানে অবস্থান হলো ch - 'a' + 1। ওই এক যোগ করাটাই অবস্থান আর দূরত্বের পুরো তফাত, আর ওটা ভুলে যাওয়াই এখানকার সবচেয়ে সম্ভাব্য ভুল উত্তর।

দ্বিতীয় লাইনে ch - 32 ছাপো %c দিয়ে। এর বদলে ch - ('a' - 'A') লেখা লম্বা, নিজের মানেটা বলে দেয়, আর হুবহু একই ফল দেয়; দুইটাই পাস করে।

যে প্রশ্নগুলো সবার মনে আসে

  • কতবার submit করতে পারি?

    যতবার চাও। ফেল করা একটা submit-এ ওই run ছাড়া তোমার কিছুই যায় না, আর ফেল করা test-র নম্বর পড়লেই বুঝবে কোন মাথাটা তুমি বাদ দিয়েছ।

  • Judge কি আমার variable-র নাম বা comment দেখে?

    না। সে কেবল তোমার program যা ছেপেছে সেটাই পড়ে। নাম আর comment লেখো পরের মানুষটার জন্য, ঠিক যেমন lesson 5 চায়।

  • শেষ লাইনের পরে একটা newline লাগবে?

    এখানে দুইভাবেই চলে, কারণ মেলানোয় একদম শেষের newline বাদ যায়। তবু ছেপে দাও: অন্য বেশিরভাগ judge ওটা চায়, আর খরচ একটা character।

  • Starter-র চেয়ে আলাদা ভাবে input পড়া যায়?

    যায়, আর দুইটা problem-এ সেটা করা উচিত না। Character-র problem-গুলো %c-র উপর নির্ভর করে, তার আগে কোনো space ছাড়া, আর উপরের তৃতীয় অংশে সেটা বোঝানো আছে।

  • Solution পড়াটা কি নকল করা?

    না, আর ওটা শাস্তির কিছু না, শুধু লেখা থাকে। পড়ো, বন্ধ করো, আর নিজের বোঝা থেকে program-টা টাইপ করো; নম্বর আসে judge থেকে, আর দক্ষতা আসে টাইপ করা থেকে।

মূল কথা

  • Judge তোমার program-কে input দেয়, তার output জমা করে, আর হুবহু মিলিয়ে দেখে।
  • কেবল শেষের space আর শেষের newline ক্ষমা পায়। বাকি সব গোনা হয়।
  • Output যা চায়নি এমন একটা prompt, নাম বা শিরোনাম মানেই ভুল উত্তর।
  • Constraints হলো হাতে চালানোর test-র তালিকা, শুরুটা সীমার দুই মাথা থেকে।
  • দেওয়া scanf লাইনটা problem-রই অংশ; ওটা বদলালে ছয়টার একটা test ভাঙতে পারে।
  • Hint বিনা পয়সার আর শুধু লেখা থাকে, আর program নিজে টাইপ করাটাই শেখায়।

পরে আসছে module test: Part Zero আর এই module-র সবকিছু নিয়ে দশটা প্রশ্ন, সঙ্গে এই problem-গুলোর দুইটা আবার।

Module test

এই module এর উপর দশটা প্রশ্ন। 70% পেলে pass, আর যতবার খুশি দেওয়া যায়।

Module test দিন

lesson ৭ শেষ

সব problem accepted হলেই lesson শেষ।

১০ টা problem-এর মধ্যে ০ টা accepted

পরেরটা: Module test: C-র সঙ্গে পরিচয়