পটভূমি
সি তে চলক ঘোষণাপত্র বিবৃতিতে তিনটি অংশ থাকে: ভেরিয়েবলের নাম , এর বেস টাইপ এবং টাইপ সংশোধক (গুলি) ।
তিন ধরণের টাইপ মডিফায়ার রয়েছে:
- পয়েন্টার
*
(উপসর্গ) - অ্যারে
[N]
(পোস্টফিক্স) - ফাংশন
()
(পোস্টফিক্স)- আপনি পেরেনগুলির ভিতরে ফাংশন আর্গুমেন্টগুলির একটি তালিকা নির্দিষ্ট করতে পারেন তবে এই চ্যালেঞ্জের স্বার্থে আসুন আমরা এটিকে উপেক্ষা করে কেবল ব্যবহার করি
()
(যার প্রযুক্তিগত অর্থ "ফাংশনটি কোনও ধরণের আর্গুমেন্ট নিতে পারে")।
- আপনি পেরেনগুলির ভিতরে ফাংশন আর্গুমেন্টগুলির একটি তালিকা নির্দিষ্ট করতে পারেন তবে এই চ্যালেঞ্জের স্বার্থে আসুন আমরা এটিকে উপেক্ষা করে কেবল ব্যবহার করি
এবং স্বরলিপিগুলি পড়ার একটি উপায় নিম্নরূপ:
int i; // i is an int
float *f; // f is a pointer to a float
my_struct_t s[10]; // s is an array of 10 my_struct_t
int func(); // func is a function returning an int
ক্যাচটি হ'ল আমরা এগুলি সবগুলিকে আরও জটিল ধরণের তৈরি করতে পারি যেমন অ্যারের অ্যারে বা ফাংশন পয়েন্টারগুলির অ্যারে বা পয়েন্টারগুলির বিন্যাসে অ্যারে :
int arr[3][4];
// arr is an array of 3 arrays of 4 ints
int (*fptrs[10])();
// fptrs is an array of 10 pointers to functions returning an int
float *(*p)[16];
// p is a pointer to an array of 16 pointers to float
আমি এই জটিল বিবৃতিটি কীভাবে পড়লাম?
- পরিবর্তনশীল নাম থেকে শুরু করুন।
(name) is ...
- সর্বোচ্চ অগ্রাধিকার সহ পরিবর্তনকারী নির্বাচন করুন।
- এটি পড়ুন:
* -> pointer to ...
[N] -> array of N ...
() -> function returning ...
- সংশোধকগুলি অবসন্ন না হওয়া পর্যন্ত 2 এবং 3 পুনরাবৃত্তি করুন।
- অবশেষে, বেস টাইপ পড়ুন।
... (base type).
সি-তে, পোস্টফিক্স অপারেটরগণ প্রিফিক্স অপারেটরগুলির চেয়ে অগ্রাধিকার গ্রহণ করে এবং টাইপ সংশোধকগুলিও এর ব্যতিক্রম নয়। অতএব, []
এবং ()
তারপর প্রথমে বাঁধুন *
। এক জোড়া পেরেনের ভিতরে যে কোনও কিছু (...)
(ফাংশন অপারেটরের সাথে বিভ্রান্ত হওয়ার দরকার নেই) প্রথমে বাইরের কোনও কিছুকে আবদ্ধ করে।
সচিত্র উদাহরণ:
int (*fptrs[10])();
fptrs fptrs is ...
[10] array of 10 ... // [] takes precedence over *
(* ) pointer to ...
() function returning ...
int int
কার্য
সি-তে লেখা ভেরিয়েবল ডিক্লেয়ারেশন স্টেটমেন্টের একটি লাইন দেওয়া, উপরে বর্ণিত পদ্ধতিটি ব্যবহার করে লাইনটি বর্ণনা করে এমন ইংলিশ এক্সপ্রেশন আউটপুট করুন।
ইনপুট
ইনপুটটি একটি একক সি স্টেটমেন্ট যা একটি একক বেস প্রকার, একক ভেরিয়েবল নাম, শূন্য বা আরও বেশি টাইপ সংশোধক এবং সমাপ্তি সেমিকোলন অন্তর্ভুক্ত করে। উপরে বর্ণিত সমস্ত সিনট্যাক্স উপাদানগুলি আপনাকে প্রয়োগ করতে হবে, এবং আরও:
- বেস টাইপ এবং ভেরিয়েবল নাম উভয়ই নিয়মিত অভিব্যক্তির সাথে মেলে
[A-Za-z_][A-Za-z0-9_]*
। - তাত্ত্বিকভাবে, আপনার প্রোগ্রামের সীমাহীন সংখ্যক প্রকারের সংশোধককে সমর্থন করা উচিত।
আপনি নিম্নলিখিত উপায়ে অন্যান্য সি সিনট্যাক্স উপাদানগুলি সহজ করতে পারেন (সম্পূর্ণ বাস্তবায়নটিও স্বাগত):
- বেস টাইপ সবসময় একটি একক শব্দ, যেমন
int
,float
,uint32_t
,myStruct
। এরকম কিছুunsigned long long
পরীক্ষা করা হবে না। - অ্যারে চিহ্নিতকরণের জন্য
[N]
, সংখ্যাটিN
সর্বদা বেস 10 তে লিখিত একক ধনাত্মক পূর্ণসংখ্যার হবে be জিনিসগুলির মতোint a[5+5]
,int a[SIZE]
বাint a[0x0f]
পরীক্ষা করা হবে না। - ফাংশন স্বরলিপিটির জন্য
()
, উপরে উল্লিখিত অনুসারে কোনও পরামিতি নির্দিষ্ট করা হবে না। - সাদা স্থানগুলির জন্য, কেবলমাত্র স্থানের অক্ষর
0x20
ব্যবহার করা হবে। আপনি আপনার প্রোগ্রামটি স্বেচ্ছাসেবীগুলির নির্দিষ্ট ব্যবহারের মধ্যে সীমাবদ্ধ করতে পারেন, যেমন- বেস প্রকারের পরে কেবল একটি স্থান ব্যবহার করুন
- টোকেনের মাঝে সর্বত্র একটি স্থান ব্যবহার করুন
- তবে আপনি টোকেন বিভাজক হওয়ার চেয়ে আরও বেশি তথ্য জানাতে দুটি বা ততোধিক স্পেস ব্যবহার করতে পারবেন না।
সি সিনট্যাক্স অনুসারে, নিম্নলিখিত তিনটি সংমিশ্রণ অবৈধ, এবং সুতরাং এটি পরীক্ষা করা হবে না:
f()()
ফাংশন রিটার্ন ফাংশনf()[]
ফাংশন অ্যারে ফিরছেa[]()
এন ফাংশনগুলির অ্যারে
সি বিকাশকারীরা পরিবর্তে এই সমতুল্য ফর্মগুলি ব্যবহার করে (এবং এগুলি সব পরীক্ষার ক্ষেত্রে areাকা থাকে):
(*f())()
ফাংশনে ফাংশন ফিরতে পয়েন্টার*f()
অ্যারের প্রথম উপাদানটিতে পয়েন্টার ফাংশন ফিরছে(*a[])()
এন পয়েন্টারগুলির অ্যারেটি কাজ করবে
আউটপুট
আউটপুট একটি একক ইংরেজি বাক্য। আপনার দরকার নেই (তবে আপনি চাইলে করতে পারেন) ইংরেজী ব্যাকরণকে সম্মান করুন, যেমন a, an, the
, একক / বহুবচন ফর্মের ব্যবহার এবং শেষ বিন্দু (পিরিয়ড)। প্রতিটি শব্দ এক বা একাধিক সাদা স্পেস (স্পেস, ট্যাব, নিউলাইন) দ্বারা পৃথক করা উচিত যাতে ফলটি মানব-পঠনযোগ্য।
আবার, রূপান্তর প্রক্রিয়াটি এখানে:
- পরিবর্তনশীল নাম থেকে শুরু করুন।
(name) is ...
- সর্বোচ্চ অগ্রাধিকার সহ পরিবর্তনকারী নির্বাচন করুন।
- এটি পড়ুন:
* -> pointer to ...
[N] -> array of N ...
() -> function returning ...
- সংশোধকগুলি অবসন্ন না হওয়া পর্যন্ত 2 এবং 3 পুনরাবৃত্তি করুন।
- অবশেষে, বেস টাইপ পড়ুন।
... (base type).
পরীক্ষার মামলা
int i; // i is int
float *f; // f is pointer to float
my_struct_t s[10]; // s is array of 10 my_struct_t
int func(); // func is function returning int
int arr[3][4]; // arr is array of 3 array of 4 int
int (*fptrs[10])(); // fptrs is array of 10 pointer to function returning int
float *(*p)[16]; // p is pointer to array of 16 pointer to float
_RANdom_TYPE_123 (**(*_WTH_is_TH15)())[1234][567];
/* _WTH_is_TH15 is pointer to function returning pointer to pointer to array of
1234 array of 567 _RANdom_TYPE_123 */
uint32_t **(*(**(*(***p)[2])())[123])[4][5];
/* p is pointer to pointer to pointer to array of 2 pointer to function returning
pointer to pointer to array of 123 pointer to array of 4 array of 5 pointer to
pointer to uint32_t */
uint32_t (**((*(**(((*(((**(*p)))[2]))())))[123])[4])[5]);
// Same as above, just more redundant parens
some_type (*(*(*(*(*curried_func())())())())())();
/* curried_func is function returning pointer to function returning pointer to
function returning pointer to function returning pointer to
function returning pointer to function returning some_type */
স্কোরিং এবং জয়ের মানদণ্ড
এটি একটি কোড-গল্ফ চ্যালেঞ্জ। সবচেয়ে কম সংখ্যক বাইট বিজয়ী সহ প্রোগ্রামটি।
int arr[3][4];
হয় an array of 3 arrays of 4 ints
(যেমন আপনি বলতে), অথবা an array of 4 arrays of 3 ints
?
sizeof(arr[0]) == sizeof(int[4])
সুতরাং একটি আইটেমের arr
চারটি রয়েছে int
।
;
লাইনের শেষে থাকে ?