History Paper 8 || BA Diaries || World History - Part 1

আন্তর্জাতিক ইতিহাস

  1. দাঁতাত রাজনীতির বৈশিষ্ট্য ও ব্যর্থতা আলোচনা কর। (Analyse the features and failures of Détente Politics)

    ঠাণ্ডা লড়াইয়ের প্রথম পর্যায়ের ফলাফল ছিল অমীমাংসিত। যার ফলে বিশ্ব ব্যাপি সামরিক কৌশলের অচলাবস্থার মধ্য দিয়ে উষ্ণতার আভাস ফুঁটে ওঠে। বার্লিন প্রাচীর মার্কিন যুক্তরাষ্ট্র ও সোভিয়েত ইউনিয়ার স্ব স্ব অঞ্চলের প্রভাব প্রতিপত্তিকে প্রতিষ্ঠা করেছিল। এর ফলে স্বসস্ত্র সংঘর্ষের সম্ভবনা হয়ে ছিল ক্ষীণ। সোভিয়েত ইউনিয়ান ও মার্কিন যুক্তরাষ্ট্রের পারস্পারিক নীতির পরিবর্তন ঘটে। দুই দেশই অস্ত্র প্রতিযোগিতার অসারত্ব উপলব্ধি করে।

    অস্ট্রিয়া চুক্তি সম্পর্কের উষ্ণতার বৃদ্ধির জন্য মার্কিন যুক্তরাষ্ট্র নিজেকে কোরিয়া থেকে সরিয়ে আনে। ১৯৬৬ খ্রিঃ অস্ট্রিয়ার চুক্তি অনুসারে রাশিয়া অন্যান্য দেশের সঙ্গে অস্ট্রিয়া থেকে সৈন্য বাহিনী প্রত্যাহার করে নেয়। তবে এই উষ্ণতা ছিল সামরিক। বরং এই উষ্ণতা উভয়কে কিছুটা হত বুদ্ধি করে ছিল। উভয়ই বিশ্বের নিজেদের প্রভাবাধিন প্রলয় সৃষ্টিতে স্বচেষ্ট ছিল। এর প্রমাণ কঙ্গো, কিউবা, কোরিয়া এবং সুয়েজ খাল প্রশ্নে উভয়ে মত বিরোধ। আবার ইসরায়েল যুদ্ধেও উভয়ে পরস্পর বিরোধী নীতি গ্রহণ করে ছিল। একদিকে মার্কিন যুক্তরাষ্ট্র, হাঙ্গেরি ও চেকোস্লোভাকিয়ায় সোভিয়েত হস্তক্ষেপে সমালোচনা করে, অন্যদিকে ভিয়েতনাম যুদ্ধে সোভিয়েত ইউনিয়ান মার্কিন নীতির বিরুদ্ধে তীব্র প্রতিক্রিয়া ব্যাক্ত করে। এইভাবে ১৯৭০ পর্যন্ত এই দুই শক্তির মধ্যে সঞ্চিত হতে থাকে স্নায়ু যুদ্ধের উত্তেজনা।

    দাঁতাত অর্থ ১৯৪৬ থেকে ১৯৭০ পর্যন্ত ঠাণ্ডা লড়াইয়ের অধ্যায় অতিক্রম করার পর ৭০-এর দশকে এসে এই উত্তেজনা ক্রমশ স্থীমিত হয়ে পড়ে। এই পর্বকে কেউ বলেন নতুন ঠাণ্ডা লড়াই, আবার কেউ বলেন দাঁতাত। 'দাঁতাত' হল একটি ফরাসি শব্দ যার অর্থ হল উত্তেজনা কমিয়ে আন্তঃরাষ্ট্র সম্পর্ককে স্বাভাবিক করে তোলা। ৫০-এর দশকে ফরাসি রাষ্ট্রপতি দ্য গোল প্রথম কূটনৈতিক অর্থে শব্দটি প্রয়োগ করেছিলেন। দাঁতাতের অর্থ কিন্তু যাবতীয় বিরোধ ভুলে যাওয়া নয়। দাঁতাত হল অতীতের উত্তেজনা ভুলে উভয় রাষ্ট্র ও গোষ্ঠীর মধ্যে আলাপ আলোচনার মধ্যে বিরোধের মীমাংসার জন্য আগ্রহ প্রদর্শন। ৭০-এর দশকে মার্কিন রাষ্ট্রপতি রিচার্ড নিক্সনের নিরাপত্তা উপদেষ্টা হেনরি কিসিঞ্চার সোভিয়েত-মার্কিন সম্পর্কের ক্ষেত্রে দাঁতাত শব্দটি প্রথম প্রয়োগ করে। তবে ঠিক কবে থেকে দাঁতাতের সূচনা হয়েছিল তা নিয়ে মত পার্থক্য আছে। অনেকের মতে ১৯৬২ তে কিউবার ক্ষেপণাস্ত্র সংকটের কেন্দ্র করে যে উত্তেজনার সৃষ্টি হয়েছিল তাতে উভয় পক্ষ সংযত না হলে আর একটা বিশ্ব যুদ্ধ ঘটতে পারত। নিক্সন মার্কিন কংগ্রেসকে বলেন, সোভিয়েত ইউনিয়ানকে প্রবল প্রতিপক্ষ রূপে গণ্য না করে উভয়ের মধ্যে একটা বোঝাপড়ার সম্পর্কে গড়ে তোলা প্রয়োজন।

    ব্যাপক দাঁতাতের অর্থ ব্যাপক। দাঁতাত বলতে শুধু সোভিয়েত-মার্কিন উত্তেজনা প্রশমন বোঝায় না। চীনের সঙ্গে এই দুই দেশের সম্পর্কের উন্নতিকেও বোঝান হয়। মার্কিন যুক্তরাষ্ট্র যে দাঁতাতকে ব্যাপক অর্থে গ্রহণ করতে চেয়েছিল তার প্রমাণ হল ১৯৭০-এর দশকের সূচনায় চীনের সঙ্গে সম্পর্ক স্বাভাবিক করার তাদের প্রয়াস। বস্তুত ১৯৬৯-৭০ খ্রিস্টাব্দে আলাপ আলোচনার যুগের সূচনা হয়েছিল বলে মার্কিন যুক্তরাষ্ট্র মনে করে নিক্সনের মস্কো ও বেজিং সফরের পর স্বাক্ষরিত হয় Strategic Arms Limitations Treaty(SALT)। ১৯৭১-৭৫-এর মধ্যে রুশ মার্কিন রাষ্ট্রপ্রধানদের মধ্যে বহুবার শীর্ষ সম্মেলন আয়োজিত হয়। এই সময় আন্তর্জাতিক পরিস্থিতির পরিবর্তনকে 'দাঁতাত' বলা হয়।

    আমেরিকার উপর চাপ অভ্যন্তরীণ ও আন্তর্জাতিক চাপে দাঁতাতের প্রতি আগ্রহ দেখতে বাধ্য হয়। ভিয়েতনাম যুদ্ধ দেশের অভ্যন্তরে মার্কিন নীতির পরিবর্তনের জন্য একটা চাপ সৃষ্টি করে ছিল। আন্তর্জাতিক ক্ষেত্রে জোট নিরপেক্ষ আন্দোলন সূচনা করে ছিল আর একটা চাপ। তাছাড়া ইউরোপীয় ও জাপানিপুঞ্জির প্রতিদ্বন্দ্বতাও আমেরিকাকে সংযত হতে বাধ্য করে ছিল। এই সময় ইসরায়েলকে সমর্থন করে আমেরিকা আরব দেশগুলির বিরাগ ভাজন হয়েছিল। ফলে আমেরিকা ঠাণ্ডা লড়াই জনিত উত্তেজনার হ্রাসে উদ্যোগী হতে বাধ্য হয়। অন্যদিকে পূর্ব ইউরোপের সংকট এবং চীনের সঙ্গে বিরোধ সোভিয়েত রাশিয়াকে চাপের মুখে ফেলে দেয়। তাই চীন-সোভিয়েত বিরোধে সুযোগে আমেরিকা-চীনের সঙ্গে সম্পর্ক স্থাপনে আগ্রহী হয়। ফলে রাশিয়াকে ও দাঁতাতের কথা ভাবতে হয়।

    ফরাসি নীতি দাঁতাতের প্রভাবে মার্কিন যুক্তরাষ্ট্র যেমন চীনের সুসম্পর্ক গড়ে তুলতে আগ্রহী হয়েছিল। তেমনি ইউরোপের অন্যান্য দেশেও দাঁতাতের প্রভাব লক্ষ্য করা জায়। ১৯৬০-এর দশকে রাষ্ট্রপতি দ্য গোল প্রাচ্য ও পাশ্চাত্যের মধ্যে বোঝা-পোড়ায় মন দেন। তিনি ফ্রান্সকে উত্তর আটলান্টিক(NATO) থেকে বিযুক্ত করেন এবং সোভিয়েত ইউনিয়ানের প্রতি নমনীয় দৃষ্টিভঙ্গি গ্রহণ করেন। দ্য গোল নতুন ইউরোপীয় বিধি ব্যাবস্থা গড়ে সোভিয়েত রাশিয়ার সঙ্গে যুক্ত করতে আগ্রহী হন।

    জার্মানি চুক্তি শুধু ফ্রান্স নয়, পশ্চিম জার্মানির মনভাবেও পরিবর্তনের ছোঁয়া লেগেছিল। ১৯৬৯ খ্রিঃ সোশ্যাল ডেমোক্রেটিক দল-এর নেতা উইলি ব্রান্ট চ্যানসেলার হয়ে পূর্ব ইউরোপের সাম্যবাদী শিবিরে সঙ্গে বোঝাপড়ার সিধান্ত নেন। পূর্ব ইউরোপের যে সমস্ত দেশের জনগণ নাৎসি আক্রমণের শিকার হয়েছিল তাদের সাহায্যের কথা ঘোষণা করা হয়। ১৯৭০-এ জার্মানি সোভিয়েত ইউনিয়ানের সঙ্গে অনাক্রমণ চুক্তিতে স্বাক্ষর করেন। পরের বছর আমেরিকা, ব্রিটেন, ফ্রান্স আর সোভিয়েত রাশিয়া বার্লিন চুক্তি স্বাক্ষর করেন। এই সময় দুই জার্মানির মধ্যে সম্প্রীতি গড়ে তোলার জন্য উদ্যোগী হন। তিনি জার্মানি ডেমোক্রেটিক রেপাবলিককে স্বীকৃতি নেন এবং পোল্যান্ডের সঙ্গে সীমান্তে মীমাংসা করে নেন। এই ভাবে দাঁতাতের প্রভাবে দুই বৃহৎ জোটের বাইরে পারস্পরিক বোঝাপড়ার পরিবেশ সৃষ্টি হয়।

    পূর্ব ইউরোপের ভাঙ্গন দাঁতাতের মাধ্যমে এই বোঝাপড়া বৃদ্ধি পেলে ইউরোপীয় সমব্যায় আরও সহত হয়। দাঁতাতের ঠিক আগে পশ্চিমের সঙ্গে অসম প্রতিযোগিতার কারণে অর্থনৈতিক সংকট পূর্ব ইউরোপের রাজনৈতিক ক্ষেত্রে সমস্যার কারণ হয়ে দাঁড়িয়ে ছিল। ডেভিড রেনল্ডস মনে করেন এই পরিস্থিতিতে দাঁতাত সোভিয়েত জোটকে ধরে রাখতে সাহায্য করেছিল। কিন্তু দাঁতাতের একটা দ্বৈত্য চরিত্র ছিল। পশ্চিমী সাহায্য পূর্ব ইউরোপের কোন কোন দেশের অর্থনৈতিক উন্নতি ঘটলেও মূল্যবৃদ্ধির সংকট সৃষ্টি করে। দেখা যায় রাজনৈতিক অসন্তোষ। এইভাবে দাঁতাত পূর্ব ইউরোপের ভাঙ্গনের সম্ভবনা সৃষ্টি করে।

    দুই মহাশক্তির মধ্যে বোঝাপড়ার ক্ষেত্রে তিনটি দিক উল্লেখযোগ্য- (ক) সংস্কৃতিক ও অর্থনৈতিক সংযোগিতা, (খ) সংকট মোচন ও নিয়ন্ত্রণ, এবং (গ) অস্ত্র সংবরণ

    ব্যর্থতা দাঁতাত অবশ্য কোন সুনিশ্চিত স্থায়ী বিষয় হয়ে উঠতে পারেনি। কারণ দাঁতাত সংঘাতের সম্ভবনা ও উত্তেজনা হ্রাস করলেও স্থায়ী শান্তির পথ দেখাতে পারেনি। এটি ছিল সংঘাত ও মৈত্রীর মধ্যবর্তীর অবস্থা একেস্থায়ী শান্তি না বলে দীর্ঘকালীন যুদ্ধ বিরতি বলা যায়। দাঁতাত উত্তেজনা হ্রাস করলেও আদর্শগত প্রতিদ্বন্দ্বিতার অবসান ঘটতে পারেনি। অস্ত্র সংবরণ চুক্তিতে স্বাক্ষর করলেও গোপনে দুই বৃহৎ শক্তিবর্গ অস্ত্রবৃদ্ধির প্রকল্প জারি রাখে। ফলে ভিয়েতনাম, মধ্যপ্রাচ্য ও আফগানিস্থানকে কেন্দ্র করে পুনঃরায় ঠাণ্ডাযুদ্ধের সৃষ্টি হয়।

    ১৯৭০-এর দশকে অ্যাঙ্গোলা, আফ্রিকা বিশ্ব রাজনীতির ঝটিকা কেন্দ্রে পরিণত হয়। এখানকার রাজনৈতিক সংকট মার্কিন-সোভিয়েত সংঘাতের ক্ষেত্র প্রস্তুত করেন। ১৯৭৫-এ পর্তুগালের কাছ থেকে অ্যাঙ্গোলা স্বাধীনতা লাভের পূর্বেই এখানে গৃহযুদ্ধ শুরু হয়ে যায়, এই গৃহযুদ্ধ জড়িয়ে পড়ে মার্কিন যুক্তরাষ্ট্র ও সোভিয়া। অ্যাঙ্গোলার রাজনীতিতে সক্রিয় হস্তক্ষেপের কোন প্রস্তুতি বা স্বার্থ আমেরিকার ছিল না। কিন্তু কিউবায় সোভিয়েত ইউনিয়ান হস্তক্ষেপ করায় আমেরিকার অ্যাঙ্গোলায় মনোযোগ দিতে বাধ্য হয়। অ্যাঙ্গোলায় জাতিয় ফ্রন্তেরর প্রতি মার্কিন ও চীনের সমর্থন রাশিয়াকে উৎবৃঙ্গ করেছিল। আমেরিকা মনে করেছিল অ্যাঙ্গোলায় সোভিয়েত হস্তক্ষেপ দুই দেশের বোঝাপড়াকে নষ্ট করছে। কিন্তু রাশিয়া মনে করে সাম্রাজ্যবাদ বিরোধী মুক্তি সংগ্রামে সাহায্য দান দাঁতাত থেকে সরে আসা নয়।

    ১৯৭৯ খ্রিঃ আফগানিস্থান ও ইরানের ঘটনা মার্কিন-সোভিয়েত দাঁতাত বিপণ করে।। উভয়ের মধ্যে মত বিরোধ দেখা যায়। আফগানিস্থানে রাশিয়া সশস্ত্র হস্তক্ষেপের সিদ্ধান্ত গ্রহণ করে। এই হস্তক্ষেপের মাধ্যমে রাশিয়া আঞ্ছলিত এবং বিশ্ব রাজনীতিতে প্রভাব বৃদ্ধি করতে চেয়েছিল। কিন্তু এই ঘটনা মার্কিন সোভিয়েত দাঁতাতের উপর প্রতিকূল প্রভাব ফেলেছিল।

    মার্কিন যুক্তরাষ্ট্র তৃতীয় বিশ্বের বিভিন্ন স্থানে বিশেষ করে ল্যাতিন আমেরিকায় হস্তক্ষেপ নীতি অব্যহত রেখেছিল। মধ্যপ্রাচ্য মাকিন যুক্তরাষ্ট্র রাশিয়াকে অগ্রাহ্য করে একত্বটা শান্তি প্রতিষ্ঠায় উদ্যোগী হয়। গ্রেনেডায় মার্কিন আগ্রাসন সোভিয়েত-মার্কিন সম্পর্ককে তিক্ত করেছিল। তবে ১৯৮৫-এর পর থেকে সোভিয়েতও মনভারের পরিবর্তন শুরু হয়। গর্বাবে, গ্লাসনস্ত ও পেরেস্ত্রৈকা ঘোষণা করলে এর ফলে উভয় রাষ্ট্রপ্রধানের মধ্যে একাধিক শীর্ষ সম্মেলন নতুন দাঁতাতের পথ প্রস্তুত করে।

    এই ক্ষণস্থায়ী দাঁতাতের কিছু ইতিবাচক দিকছিল। কিছুদিনের জন্য হলেও দাঁতাত আন্তর্জাতিক ক্ষেত্রে উত্তেজনা হ্রাস করে। পূর্ব ও পশ্চিম ইউরোপের মধ্যে সম্পর্ক অনেকটা স্বাভাবিক হয় এবং অস্ত্র প্রতিযোগিতা হ্রাস পায়।

  2. লিগ অফ নেশানস বা জাতি সংঘের ব্যর্থতা কারণ। (Reasons for the failure of League of Nations)

    ইউরোপকে যুদ্ধ থেকে মুক্ত রাখার জন্য এবং স্থায়ী শান্তি প্রতিষ্ঠার জন্য উনিশ শতকের বিভিন্ন সময়ে বিভিন্ন রাষ্ট্রগুলি সমবেত ভাবে প্রচেষ্টা চালিয়ে ছিল। জাতি সংঘের ছিল মুক্ত কূটনীতি, পারস্পরিক সহযোগিতা ও যৌথ নিরাপত্তা ব্যবস্থা, কিন্তু জাতি সংঘের উদ্দেশ্য ব্যর্থ হয়। প্রাথমিক কিছু সাফল্য লাভের পর ত্রিশের দশকে আন্তর্জাতিক রাজনীতিতে যে সঙ্কটের কালো মেঘ জমতে থাকে তার প্রভাবে জাতি সংঘ দূর্বল হয়ে পড়ে।

    হ্যানস মরগেনথাউ তাঁর 'Politics Among Nations' গ্রন্থে জাতি সংঘের ব্যর্থতার কারণগুলিকে তিনটি শ্রেণিতে ভাগ করেছে - সংবিধানিক ত্রুটি, কাঠামোগত দুর্বলতা ও রাজনৈতিক ব্যর্থতা।

    সাংবিধানিক দুর্বলতা লিগের সমবেত নিরাপত্তা ব্যবস্থা বহু বাঁধা বিঘ্নের দ্বারা কণ্টকিত ছিল। জাতি সংঘের চুক্তিপত্রের কোথাও যুদ্ধ বেআইনি বলে ঘোষিত হয়নি। চুক্তিপত্র অনুসারে কয়েকটি বিশেষ ক্ষেত্রে সদস্য রাষ্ট্রসমূহকে যুদ্ধেলিপ্ত হতে নিষেধ করা হয়েছিল। লিগ চুক্তিপত্রে ছিদ্রের সুযোগে যুদ্ধ ঘোষণা সম্ভব হয়েছিল। লিগ চুক্তিপত্রের ১৫ সংখ্যক ধারা অনুসারে গৃহীত শান্তিপূর্ণ মীমাংসার সাধারণ সভার সংখ্যাগরিষ্ঠ ভোটে গৃহীত না হলে যুদ্ধ ঘোষণা করার পথে বাঁধা ছিল না। লিগে আপোষ মীমাংসা গ্রহণ করার জন্য কোন রাষ্ট্রকে বাধ্য করা সম্ভব ছিল না। শাস্তি মূলক ব্যবস্থা অবলম্বনের পথে অনেক বাঁধা ছিল। এই ব্যবস্থা কার্যকর করার জন্য প্রয়োজন ছিল সদস্য রাষ্ট্রগুলির সহযোগিতা কিন্তু জাতিয় স্বার্থ নিয়ন্ত্রিত আন্তর্জাতিক রাজনীতিতে সার্বিক মত ঐক্য ছিল একান্ত অসম্ভব। লিগের হাতে কোন আন্তর্জাতিক সামরিক বাহিনী ছিল না। এটাই ছিল লিগের প্রধানতম সাংবিধানিক দুর্বলতা।

    সীমাবদ্ধতা একইভাবে কার্যগত দুর্বলতা লিগকে একটা সীমাবদ্ধ অসম্পূর্ণ প্রতিষ্ঠানে পরিণত করে। প্রথম বিশ্বযুদ্ধ উত্তর আন্তর্জাতিক রাজনীতিতে অনেক মৌলিক পরিবর্তন ঘটে যায় বিশ্ব রাজনীতি আর ইউরোপ কেন্দ্রিক ছিল না। কিন্তু মার্কিন যুক্তরাষ্ট্র ও জাপান বিশ্ব রাজনীতিতে প্রভাব ফেলেছিল। কিন্তু মার্কিন যুক্তরাষ্ট্র লিগের সদস্য পথ গ্রহণ করেনি। অথচ রাষ্ট্রপতি উইলসন যে চোদ্দদশ শর্ত পেশ করেন তার ভিত্তিতে লিগ গড়ে ওঠে। অন্যদিকে ইউরোপের অন্যতম রাষ্ট্র জার্মানি ও সোভিয়েত রাশিয়াকে ইচ্ছাকৃত ভাবে লিগের সদস্য পথ দেওয়া হয়নি। তাই আপাতত দৃষ্টিতে লিগ একটা আন্তর্জাতিক সংস্থা হলেও তা কার্যক্ষেত্রে ইউরোপের মধ্যে সীমাবদ্ধ ছিল। আন্তর্জাতিক শান্তি ও নিরাপাত্তার জন্য প্রয়োজন ছিল লিগকে আন্তর্জাতিক সংগঠনে পরিণত করা। কিন্তু লিগ মূলক ব্রিটেন ও ফ্রান্সের নিয়ন্ত্রণ ছিল যারা পরিচালিত হয়ে ছিল জাতিয় স্বার্থের দ্বারা।

    ভার্সাই চুক্তি ও সদস্য পদত্যাগ জাতি সংঘের চুক্তিপত্রকে ভার্সাই সন্ধির অন্তর্ভুক্ত করা হয়েছিল। কিন্তু জার্মানি এই সন্ধিকে মনে করেছিল একটা কঠোর চুক্তি যা বলপূর্বক তার উপর আরোপিত হয়েছে। লিগের কাঠামোগত দুর্বলতার আর একটা দিক হল সদস্য রাষ্ট্রগুলির সদস্যপদ প্রত্যাহারের প্রবণতা। চুক্তি পত্রের এক নম্বর ধারায় কোন সদস্য রাষ্ট্রকে দুবছরের বিগ্রপ্তি মাধ্যমে সদস্যপদ নাকোচের অধিকার দেওয়া হয়। বহু রাষ্ট্র এই সুযোগে সদস্যপদ প্রত্যাহার করে। ৩০-এর দশকে জাপান, জার্মানি, ইতালি প্রভৃতি রাষ্ট্র জাতি-সংঘ ত্যাগ করে। ফলে দ্বিতীয় বিশ্বযুদ্ধের সময় সদস্য সংখ্যাক্রমে দাঁড়ায় মাত্র ৪৮।

    প্রতিষ্ঠান লিগ ছিল সার্বভৌম রাষ্ট্রগুলি সহযোগিতামূলক প্রতিষ্ঠান, কিন্তু এই আন্তর্জাতিক সংস্থা পরিচালনার জন্য যে মানসিকতা ও সহযোগিতার মনভাব থাকা প্রয়োজন তা অধিকাংশ রাষ্ট্রের ছিল না। প্রথম বিশ্বযুদ্ধের অবসানের অল্পকালের মধ্যে আন্তর্জাতিক রাজনীতির ক্ষেত্রে গোপন চুক্তি, অস্ত্র সম্ভার প্রতিযোগিতা এবং শক্তিসাম্যের নীতি প্রবর্তিত হয়েছিল। সদস্য রাষ্ট্রগুলি জাতিয় স্বার্থের ঊর্ধ্বে উঠতে পারেনি। ফ্রান্স জার্মানির আক্রমণের বিরুদ্ধে প্রতিরোধ মূলক ব্যবস্থার জন্য লিগের সহযোগিতা অপেক্ষা বিভিন্ন রাষ্ট্রের সঙ্গে চুক্তির সঙ্গে বেশি গুরুত্ব দিয়েছিল। স্বার্থের খাতিরে ইতালিকে তোষণ করা জন্য ইংল্যান্ড ও ফ্রান্স ইতালি কর্তৃক আবিসিনিয়া আক্রমণের বিরোধিতা না করে সমবেত নিরাপত্তার স্বার্থকে বিসর্জন দিয়েছিল। ব্রিটেন সর্বদায় স্বীয়ে সাম্রাজ্য রক্ষার স্বার্থে ব্যস্ত ছিল। এই কারণে লিগের চুক্তিপত্র অনুসারে আক্রমণ করার বিরুদ্ধে শাস্তিমূলক ব্যবস্থা গ্রহণে যে ক্ষমতা ছিল তা প্রয়োগ করা সম্ভব হয়নি। একইভাবে জাপানের ম্যাঞ্চুরিয়া আক্রমণ করলে বৃহৎ রাষ্ট্রগুলির নিঃস্পৃহতার কারণে লিগ কোন ব্যবস্থা গ্রহণ করতে পারেনি।

    বিরোধী দুটি জোট আসলে যুদ্ধ উত্তর কালে আন্তর্জাতিক রাজনীতিকে দুটি পরস্পর ধ্যান ধারনার সমাবেশ ঘটেছিল। এক দিকে ছিল কিছু রাষ্ট্র যারা ১৯১৯-এর বিধিব্যাবস্থা সংরক্ষণ স্থায়ী করতে আগ্রহী, অন্যদিকে এই বিধি ব্যবস্থার বিরোধী সংশোধন বাদী গোষ্ঠী। এই দুটি পরস্পর বিরোধী রাষ্ট্রের অবস্থান জাতি সংঘের সংহতিকে বিপন্ন করে তুলেছিল।

    শান্তি ও গণতন্ত্র বিপন্ন ৩০-এর দশকে রাজনীতি পরিস্থিতিকে জটিল করে তুলেছিল এই সমস্ত সংশোধন বাদী রাষ্ট্র গোষ্ঠী। একে চার্চিল 'ত্যাটিলার কূটনীতি' বলেছেন ওদিকে বিট্রেন ও ফ্রান্স লিগের ভিতরে ও বাইরে কোন সক্রিয় প্রতিরোধ মূলক ব্যবস্থা গড়ে তুলতে আগ্রহী ছিল না। কারণ তারা মনে করেছিল যে, বোঝাপড়া নীতি গ্রহণ না করে প্রতিরোধ গড়ে তুলতে গেলে শান্তি বিনয় করার ঝুঁকি নিতে হবে ফলে গণতন্ত্র বিরোধী একনায়কতন্ত্রীর দেশগুলির আগ্রাসী নীতি বিরুদ্ধে ব্যবস্থা গ্রহণ করতে লিগ ব্যর্থ হয়। চার্চিল মনে করেছিলেন যে, যদি ইংল্যান্ড লিগের কাঠামোর মধ্যে যৌথ নিরাপত্তা ব্যাবস্থার সঠিক নেতৃত্ব দিত তাহলে শান্তিও গণতন্ত্র বিপন্ন হত না।

    বস্তুত লিগের ব্যর্থতার জন্য বৃহৎ শক্তিগুলির তন্ত্রদ্বন্দ্ব প্রধানত দায়ি ছিল। অর্থনৈতিক ক্ষেত্রে প্রতিযোগিতা ও উপনিবেশের প্রশ্নে সাম্রাজ্যবাদী শক্তিগুলির মধ্যে দ্বন্দ্ব লিগের ব্যর্থতার অন্যতম কারণ। ইতালি, জাপান ও জার্মানিতে যথাক্রমে ফ্যসিবাদ, জঙ্গিবাদ ও ন্যসিবাদের অভ্যুত্থান লিগকে অসহায় করে তুলেছিল। অথচ পশ্চিমী রাষ্ট্রগুলির কাছে ফ্যাসিবাদ অপেক্ষা সোভিয়েত রাশিয়ার সমাজতন্ত্রবাদ অধিকতর ভয়ের কারণ হয়েছিল। লিগের সমবেত নিরাপত্তা নীতি বিসর্জন দিয়ে ব্রিটেন ও ফ্রান্সের রাষ্ট্রনীতির প্রধান অঙ্গে পরিণত হয়েছিল। রুশনীতি ও নাৎসি তোপের পরিণতি ছিল লিগের ব্যর্থতা।

    লিগের প্রতিষ্ঠাতাদের আশাও আদর্শ সফল হয়নি, কিন্তু শান্তি রক্ষায় লিগের ব্যর্থতার অর্থ এই নয়য়ে আন্তর্জাতিক সহযোগিতার ক্ষেত্রে লিগের কোন অবদান নেই। অনেক ক্ষেত্রে লিগ স্থাপন এবং বিবাদের মীমাংসা করতে পেরেছিল। সামাজিক, মানসিক ও আর্থিক ক্ষেত্রে লিগের প্রচেষ্টা প্রশংসনীয়। প্রথম আন্তর্জাতিক সংগঠন হিসাবে পরীক্ষা নিরীক্ষা একেবারে অর্থহীন ছিল না। কারণ এই সংগঠনই সম্মেলিত জাতিপুঞ্জ প্রতিষ্ঠার ক্ষেত্রে প্রেরণায় উৎসরূপে পারগনিত হয়েছিল।

  3. কমিউনিস্ট চীনের উত্থান কীভাবে তৎকালীন আন্তর্জাতিক রাজনীতিকে প্রভাবিত করেছিল? (How the rise of Communist China impacted the world politics of the time?)

    ১৯৪৫ খ্রিঃ কুও-মিন-তান ও কমিউনিস্টদের মধ্যে যে গৃহযুদ্ধ শুরু হয় তাতে কমিউনিস্ট দল জয়ী হলে চীনে কমিউনিস্ট সরকার প্রতিষ্ঠিত হয়। কমিউনিস্ট চীনের অভ্যুত্থান দ্বিতীয় বিশ্বযুদ্ধের পর বিশ্বের ইতিহাসে অন্যতম উল্লেখযোগ্য ঘটনা যা বিশ্বের রাজনীতিতে বিরাট পরিবর্তনের সূচনা করে। এতদিন চীনের উপর মার্কিন যুক্তরাষ্ট্রের পরোক্ষ আধিপত্য ছিল। কিন্তু কমিউনিস্টদের অভ্যুত্থানের ফলে চীনের সত্তা আবার ফিরে এল। মাও-সে-তুং মার্কসবাদ ও লেনিনবাদকে প্রয়োগ করে চীনকে তার উপযুক্ত আসনে প্রতিষ্ঠিত করলেন।

    সেই সঙ্গে আন্তর্জাতিক ক্ষেত্রে চীন বৃহৎ শক্তির মর্যাদা পেল। চীনের ক্রম বর্ধমান সামরিক শক্তি এবং বৈজ্ঞানিক উন্নতির সঙ্গে সঙ্গে চীনের অর্থনীতিরও বিকাশ ঘটল। চীনে সামরিক শক্তি, অর্থনৈতিক বিকাশ এবং বিপুল লোকবল তাকে আন্তর্জাতিক রাজনীতিতে প্রভাব বিস্তারে সুযোগ করে দেয়।

    কোরিয়া চীনে কমিউনিস্ট অভ্যুত্থানের মাত্র চার মাস পরে চীন কোরিয়া যুদ্ধে জড়িয়ে পড়ে মার্কিন সৈন্য দক্ষিণ কোরিয়ার সপক্ষে উত্তর কোরিয়া আগ্রসন করলেও রাষ্ট্র সংঘ উত্তর কোরিয়াকে আক্রমকারি বলে ঘোষণা করে, এবং তার বিরুদ্ধে রাষ্ট্র সংঘ বাহিনী প্রেরিত হয়। রাষ্ট্র সংঘ বাহিনী প্রধান জেনারেল ম্যাক অর্থার চীনের সীমানায় উপস্থিত হলে, চীন রাষ্ট্র সংঘ বাহিনীকে বিতাড়িত করে। পরে ১৯৫৪ ক্রিস্তাব্দে জেনেভা সম্মেলনে শান্তি স্থাপিত হয়। কোরিয়ায় এই ঘটনা প্রমাণ করে যে, পূর্ব এশিয়ার রাজনীতিতে চীনের অভ্যুত্থান গুরুত্বপূর্ণ পরিবর্তন এনেছে এবং চীনকে অবহেলা করে পূর্ব এবং দক্ষিণ-পূর্ব এশিয়ার শক্তি সাম্য নিধারন করা সম্ভব নয়।

    তিব্বত ক্ষমতা লাভের পর চীনের কমিউনিস্ট সরকার পূর্বতন দাবি ও অধিকারগুলি পুনঃস্থাপনে তৎপর হয়েছিল। ফলে চীন তিব্বতের উপর তার সার্বভৌমত্বের দাবি পেশ করেন। এই সূত্রে ১৯৫০ খ্রিঃ তিব্বতে চীন সৈন্য প্রবেশ করে। ফলে তিব্বতে শতাব্দী ব্যাপী বিছিন্নতার অবসান ঘটে। ভারতও তিব্বতে চীনের সার্বভৌমত্ব স্বীকার করে নিয়েছিল।

    ভিয়েতনাম ইন্দো-চীনেও ফরাসি সাম্রাজ্যবাদের বিরুদ্ধে উত্তর ভিয়েতনামের হো-চি-মিন সরকার চীনের কাছ থেকে মূল্যবান সাহায্য লাভ করে। পরবর্তীকালে যুক্তরাষ্ট্র উত্তর ভিয়েতনামের বিরুদ্ধে দখিন ভিয়েতনামের সাহায্য করলে চীন সরকার উত্তর ভিয়েতনামকে সমর্থন করে। বিশ্বের বিভিন্ন অংশে সরকার চীনের বিরুদ্ধাচরণ করছে। এই অভিযোগে চীন শ্রীলংকা, ব্রহ্মদেশ, সুইজারল্যান্ড, কোরিয়া প্রভৃতি রাষ্ট্রের সঙ্গে কূটনৈতিক সম্পর্ক ছিন্ন করে। ১৯৬৭ খ্রিঃ ব্রহ্মদেশ থেকে চীনের আর্থিক সাহায্য সম্পর্কিত প্রতিনিধি দলকে প্রত্যাহার করা হয়। একই ঘটনা ঘটে কোরিয়ায়। তবে আফ্রিকার রাষ্ট্রগুলির সঙ্গে চীনের ঘনিষ্ঠ সম্পর্ক গড়ে উঠে। ইংল্যান্ড ও ফ্রান্স কমিউনিস্ট চীনকে শুধুমাত্র স্বীকৃতিই দেয়নি, রাষ্ট্র সংঘের সদস্য করার পক্ষে মত দিয়েছিল।

    মার্কিন বিরোধী তবে চীনের কমিউনিস্ট সরকার প্রতিষ্ঠা মার্কিন যুক্তরাষ্ট্রের অভিপ্রেত ছিল না। এই জন্যই কমিউনিস্টদের বিরুদ্ধে মার্কিন সরকার বিপুল পরিণামে সাহায্য দিয়েছিল চিয়াং কাইশেককে। শুধু তাই নয় চিয়াং কাইশেক ফরমোজায় আশ্রয় গ্রহণ করলে মার্কিন সপ্তম নৌবহর ফরমোজায় নিরাপত্তার দায় গ্রহণ করেছিল। মার্কিন সরকারের পৃষ্ঠপোষকতায় ফরমোজায় রাষ্ট্র সংঘের নিরাপত্তা পরিসদের সদস্য পদলাভ করে। কমিউনিস্ট চীনের প্রতি মার্কিন যুক্তরাষ্ট্রের এই অবাঞ্ছিত আচরণের উত্তর চীন ফরমোজায় অধিকৃত কুময়োত মাৎস দ্বীপ আক্রমণ করে। এই পরিপেক্ষিতে মার্কিন সরকার চীনের সঙ্গে আলাপ আলোচনার জন্য আগ্রহ প্রকাশ করে।

    রুশ বিরোধী চীন ও রাশিয়া উভয়ই কমিউনিস্ট রাষ্ট্র হলেও চীনের কমিউনিস্ট অভ্যুত্থানের পর উভয়ের মধ্যে বিরোধের সূচনা হয়। প্রথম দিকে অবশ্য দুই দেশের মধ্যে সহযোগিতার সম্পর্ক গড়ে উঠেছিল। ১৯৫৩ খ্রিস্টাব্দে রাশিয়া ম্যাঞ্ছুরিয়ার রেলপথের উপর তার দাবি ত্যাগ করে। পোর্ট আর্থার চীনকে ফিরিয়ে দেওয়া হয় রাশিয়া প্রায় এক বিলিয়ন রুবেল চীনকে ঋণ হিসেবে দেয়, কিন্তু রুশ-চীন মৈত্রী স্থায়ী হয়নি। মোঙ্গোলিয়া, ম্যাঞ্চুরিয়া ও সিংকিয়াং অঞ্চলে রাশিয়া ও চীনের মধ্যে সীমানা বিরোধ উভয় দেশে মৈত্রীর পথে বাঁধা হয়ে দাঁড়িয়েছিল। অতীতে চীনের দুর্বলতার সুযোগে চীনের কয়েকটি স্থানে জারতন্ত্র তার প্রভাব বিস্তার করেছিল। কমিউনিস্ট চীনের অভ্যুত্থানের ফলে এই সমস্ত স্থানকে কেন্দ্র করে উভয়ের দেশের মধ্যে বিরোধের সূচনা হয়। ১৯৬৯ খ্রিঃ ডামনেস্কি দ্বীপকে কেন্দ্র করে রুশ-চীন সংঘর্ষ হয়েছিল।

    কুশ্চেভ আদর্শগত দিক থেকে বিচার করলে রুশো-চীনের বিরোধের কারণ কুশ্চেভের সহবস্থান নীতি। চীন মার্কিন যুক্তরাষ্ট্রের সঙ্গে রাশিয়ার সহবস্থান নীতিকে সমর্থন করতে পারেনি। ১৯৫৬ থেকে উভয়ের মধ্যে বিরোধ শুরু হয়। ১৯৬২ খ্রিঃ রাশিয়া কিউবা থেকে রকেট অপসারণ করতে অসম্মত হলে চীন তার সমালোচনা করেছিল। অপরদিকে চীন-ভারত সংঘর্ষে রাশিয়া চীনকে সমর্থন করেনি। ১৯৬৯ খ্রিঃ মস্কোতে কমিউনিস্ট রাষ্ট্রগুলির যে সম্মেলন হয় তাতে চীন যোগদান করেনি।

    ভারতের সঙ্গে সম্পর্ক চীন আণবিক অস্ত্রের অধিকারী হবার পর, আন্তর্জাতিক শক্তি সাম্যের ক্ষেত্রে গুরুতর পরিবর্তনের সূচনা হয়। ভারত ও চীন পরস্পরের প্রতিবেশী। ম্যাঞ্চু রাজবংশের পতনের পর ১৯১৪ খ্রিঃ চীন ভারত সীমানা নিধারনের জন্য যে সম্মেলন হয় তাতে যোগদান করে তিব্বত ও চীনের প্রতিনিধিরা। ব্রিটিশ প্রতিনিধি স্যার অর্থার ম্যাকমোহন উভয় দেশের মধ্যে সীমানা নিধারন করেন এই সীমানাকে উভয় দেশ স্বীকৃতি দিয়েছিল। চীনে কমিউনিস্ট সরকার প্রতিষ্ঠিত হলে স্বাধীন ভারত তাকে স্বীকৃতি দেয়। ভারত ও চীন পঞ্চশীল চুক্তিতে সাক্ষর দান করে। বান্দুং সম্মেলন পঞ্চশীল চুক্তিকে স্বীকৃতি দিয়েছিল। কিন্তু ১৯৫৫ থেকে ১৯৬২ পর্যন্ত চীনের ভারত সীমানা লঙ্ঘনকে কেন্দ্র করে উভয় দেশের মধ্যে সম্পর্কের অবনতি ঘটতে থাকে। শেষ পর্যন্ত ১৯৬২ খ্রিঃ ভারত-চীন সীমান্তে উভয় দেশের সৈন্যদের মধ্যে ব্যাপক সংঘর্ষ শুরু হয়। ওই বছর কলম্বতে আফ্র-এশিয়ার ৬-টি রাষ্ট্রের সম্মেলনে ভারত ও চীনের মধ্যে শান্তিস্থাপনের জন্য প্রস্তাব পেশ করা হয়েছিল। ভারত এই প্রস্তাব গ্রহণ কিন্তু চীন অসম্মতি গ্যাপন করেন।

    অন্যান্য অন্যান্য রাষ্ট্রের সঙ্গে চীনের সম্পর্কের মধ্যে এশিয়ায় তার নেতৃত্বে প্রতিষ্ঠা লক্ষ্যনিয় হয়ে উঠেছিল। কোরিয়া ভিয়েতনাম প্রভৃতি দেশের সঙ্গে চীনের ঐতিহাসিক সম্পর্ককে চীন বিশেষ মূল্য দিয়েছিল। বান্দুং ও জেনেভা সম্মেলনে চীন বৃহৎ শক্তি হিসাবে মর্যাদা পায়।

    মার্কিন যুক্তরাষ্ট্রের সঙ্গে চীনের সম্পর্ক নিধারিত হয় কোরিয়া যুদ্ধের সময়। আসলে কমিউনিস্ট চীনের উত্থান মার্কিন যুক্তরাষ্ট্রকে বিব্রত করেছিল, কারণ এর ফলে এশিয়া শক্তি সাম্যে বিরাট পরিবর্তন ঘটে যায়। কোরিয়া যুদ্ধের সময় মার্কিন সেনাপতি জেনারল ম্যাক আর্থার চীনে পারমানবিক বোমা ব্যাবহার করতে চেয়েছিলেন। এই পরিকল্পনা কার্যকর নাহলেও মার্কিন যুক্তরাষ্ট্র দীর্ঘকাল চীনকে জাতিপুঞ্জ থেকে বিছিন্ন করে রেখেছিল।

    দ্বিতীয় বিশ্বযুদ্ধের পর আপাতদৃষ্টিতে বিশ্বের শক্তিগুলি রাশিয়া এবং মার্কিন যুক্তরাষ্ট্র এই দুই শিবিরে বিভক্ত হয়ে গেলেও কমিউনিস্ট চীনের উত্থান দুই বৃহৎ শক্তির কাছে অসস্থির বিষয় হয়ে উঠেছিল। এতদিনে এশিয়ার শক্তির সাম্যে জাপানের যে প্রভাব ছিল তা ধীরে ধীরে সরে যায়। চীন এশিয়া তথা আন্তর্জাতিক রাজনীতিতে প্রভাব বিস্তার করতে থাকে।

  4. ঠান্ডা লড়াইয়ের অবসানের কারণ কি? (What are the reasons for the end of Cold War?)

    আন্তর্জাতিক ক্ষেত্রে প্রায় তিন দশক ঠান্ডা লড়াই আন্তর্জাতিক শক্তি সাম্যকে বজায় রেখেছিল। বিশেষজ্ঞদের মতে ১৯৯০-এ ঠান্ডা লড়াইয়ের আনুষ্ঠানিক সমাপ্তি ঘটলেও। ১৯৭০-এর দশকে মধ্য ভাগ থেকে ঠান্ডা লড়াই অন্তর্হিত হয়। তবে উল্লেখযোগ্য হয়, আন্তর্জাতিক ক্ষেত্রে সংকট ও যুদ্ধ বিগ্রহের আশংকা মার্কিন যুক্তরাষ্ট্র ও সোভিয়েত রাশিয়া আলোচনার মাধ্যমে সম্পূর্ণ ভাবে সমস্যা সমাধানের চেষ্টা করলেও আনুষ্ঠানিক ভাবে ঠান্ডা লড়াইয়ের অবসানের জন্য কোন উদ্যোগ নেয়নি। ১৯৭০-এর দশক থেকে আন্তর্জাতিক ক্ষেত্রে এমন কিছু ঘটনা ঘটর ও পরিস্থিতির সৃষ্টি হয়, যা শেষ পর্যন্ত ১৯৯০ খ্রিঃ ঠান্ডা যুদ্ধের অবসান ঘটায়।

    হেলসিঙ্কি হেলসিঙ্কি সম্মেলনের শেষে বিশ্বের প্রায় সমস্ত বৃহৎ শক্তি ইউরোপে নিরাপত্তা ও অর্থ-সামাজিক সহযোগিতার ব্যপারে ঐক্যমত প্রসার করেন। মার্কিন যুক্তরাষ্ট্র ও সোভিয়েত রাশিয়া এই সম্মেলনের গুরুত্বপূর্ণ ভূমিকা ভূমিকা পালন করেন। হেলসিঙ্কি সম্মেলনের পর এজাতীয় একাধিক সম্মেলনে, বৃহৎ শক্তি বর্গের মধ্যে যে সহযোগিতা, সম্পত্তি ও বন্ধুত্বের বাতাবরণ তৈরি হয়, তা বৃহৎ দুই শক্তির মধ্যে ঠান্ডা লড়াইয়ের উত্তেজনা হ্রাস করেছিল।

    গর্বাচেভ ১৯৮৬ খ্রিঃ রাশিয়ায় গর্বাচেভের ক্ষমতা লাভ করে। ঠান্ডা লড়াই এর গুরুপুর্ন ভূমিকা লাভ করেছিল। ১৯৮৮ খ্রিঃ ডিসেম্বর গর্বাচেভ তাঁর ভাষণে বলেন যে, সমস্ত রাষ্ট্রেই স্বাধীন মতামত ও সিদ্ধান্ত গ্রহণের ক্ষমতা এনেছে। এই গ্লাসনস্ত বা মুক্ত চিন্তার ঘোষণা পূর্ব ইউরোপের জনগণকে সাহসী করে তুলেছিল। ফলে যে বার্লিন প্রাচীর প্রায় তিন দশক ধরে ইউরোপের ঠান্ডা লড়াইয়ের প্রতীক হিসাবে অবস্থান করেছিল তা অবসান হয়।

    উভয় দেশে অর্থনৈতিক বিপর্যয় ক্ষমতা লাভের পর রাশিয়ার সঙ্কটজনক আর্থিক অবস্থার পেক্ষিতে গর্বাচেভ উপলব্ধি করেন যে, বৃহৎ শক্তি মর্যাদা লাভের বাসনায় রাশিয়াকে যথেষ্ট আর্থিক ক্ষতি স্বীকার করতে হয়েছে। তাই তিনি রাশিয়ায় অভ্যন্তরন সংস্কারে পাশাপাশি বৈদেশিক নীতিতে পরিবর্তন আনেন। সংঘাত থেকে সরে এসে রাশিয়া সমঝতার পথ অনুসরণ করেন ফলে ঠান্ডা লড়াই সীমিত হয়ে পড়ে, সোভিয়েত রাশিয়ার তুলনায় মার্কিন অর্থনীতি অনেক উন্নত ও স্থীতিশীল হলেও ঠান্ডা লড়াইয়ের কারনে আমেরিকাকে যথেষ্ট আর্থিক খেসারত দিতে হয়েছিল। উপসাগরীয় অঞ্চলে ব্যয় বহুল সামরিক ঘাঁটি বজায় রাখার ফলে মার্কিন অর্থনীতি উপর চাপ পড়ে। তা ছাড়া বিভিন্ন আঞ্চলিক সংঘর্ষ এবং ভিয়েতনাম, এ্যাঙ্গোলা ও আফগানিস্থানে ছায়া যুদ্ধের ফলে উভয় দেশের অর্থনীতি ক্ষতিগ্রস্থ হয়।

    দাঁতাত ঠান্ডা লড়াইয়ের অবসানে দাঁতাতের একটা ভূমিকা ছিল। দাঁতাতের ফলে এই দুই মহা শক্তিশালী রাষ্ট্র পরস্পরের কাছে আসতে সক্ষম হয়। এ ব্যাপারে পশ্চিম জার্মানি রাষ্ট্র প্রধান Willy Brandt Ostopolitik সূচনা করলে বোঝা পড়ার সম্ভনা দেখা দেয়। সমরাস্ত্র নিয়ে প্রতিযোগিতা অনেকটা নিয়ন্ত্রিত হয়।

    দ্বি মেরুকরণ দ্বিতীয় বিশ্বযুদ্ধের অর্ব্বহিত পড়ে আমেরিকা ও রাশিয়া আন্তর্জাতিক ক্ষেত্রে নিজ নিজ প্রভাব বৃদ্ধির জন্য নিজেদের অনুগামী রাষ্ট্রের সংখ্যা বৃদ্ধি করতে স্বচেষ্ট হয়। এই সময় বিশ্ব স্পষ্টত দুটি গোষ্ঠীতে বিভক্ত হয়ে পড়ে। সৃষ্টি হয় বিশ্ব রাজনীতির ডিবি মেরুকরণ এই পরিস্থিতিতে ঠান্ডা লড়াই তীব্র আকার নেয়। কিন্তু কিছুদিনের মধ্যে এই দুই বৃহৎ শক্তির অনুগামী রাষ্ট্রগুলি শর্তহীন আনুগত্য প্রদর্শন না করে স্বাধীন বৈদেশিক নীতি অনুসরণের সিদ্ধান্ত নেয়। মার্কিন জোটের সদস্য ফ্রান্সের রাষ্ট্রপতি দ্য গোল একছত্র মার্কিন আধিপত্যের বিরুদ্ধে বিদ্রোহ ঘোষণা করে ফ্রান্সকে এক স্বতন্ত্র শক্তিরূপে বিশ্ব রাজনীতিতে প্রতিষ্ঠা করতে উদ্যোগী হয়। এরপর ব্রিটেন ও ফ্রান্সের পথ অনুসরণ করে। ফলে সৃষ্টি হয় বহু কেন্দ্রিকতার একই ভাবে সোভিয়েত শিবিরে ও ভাঙন লক্ষ্য করা যায়। পূর্ব ইউরোপে দেশ সমূহে ১৯৫০-এর দশক থেকেই সোভিয়েত আধিপত্য বাদের বিরুদ্ধে যে ক্ষোভের সৃষ্টি হয়েছিল তা বিদ্রোহের রূপ নেয়। তা ছাড়া ১৯৬০-এর দশকের মধ্যভাগে চীন-সোভিয়েত মত বিরোধ সমাজতান্ত্রিক সমাজের ভাঙন ধরিয়ে ছিল। ফলে দুই বৃহৎ শক্তি নিজ অনুগামী রাষ্ট্র সমূহের উপর নির্মাঙ্কুশ প্রাধান্য বিস্তারে ব্যর্থ হয়। এই পরিস্থিতে ঠান্ডা লড়াই তীব্রতা হারিয়ে ছিল।

    তৃতীয় বিশ্ব তৃতীয় বিশ্বের দেশগুলি উপলব্ধি করেছিল ঠান্ডা লড়াই অব্যহত থাকলে তাদের মত উন্নয়নশীল দেশ সমূহের বিকাশ ব্যহত হবে। কারণ দুই বৃহৎ শক্তির মধ্যে ঠান্ডা লড়াইয়ের অবসম্ভার পরিণাম হল বিশ্বব্যাপী অস্ত্র প্রতিযোগিতা বৃদ্ধি। এই প্রতিযোগিতায় জড়িয়ে পড়লে তৃতীয় বিশ্বের দেশগুলো বাঁধা পাবে। তাই প্রায় শতাধিক তৃতীয় বিশ্বের দেশ নির্জোট আন্দোলন গড়ে তোলে, এবং প্রথম থেকেই দ্বি-মেরু করেনের বিরোধিতা করেন। রাষ্ট্রগুলি পৃথকভাবে দূর্বল হলেও তাদের সম্মেলিত চাপকে ঠান্ডা লড়াইয়ের তীব্রতা হ্রাসের কারণ রূপে গণ্য করা যায়।

    প্যারিস সনদ ১৯৭৫ খ্রিঃ ৩৫টি দেশ হেলসিঙ্কিতে ইউরোপীয় সহযোগিতা ও নিরাপত্তার যে ভিত্তি প্রতিষ্ঠা করে তাকে আরো সুদৃঢ় করার জন্য গর্বাচেভের উদ্যোগে ১৯৯০-এর নভেম্বর মাসে প্যারিসের সনদ স্বাক্ষরিত হয়। এই সনদ ইউরোপে সহযোগিতা ও নিরাপত্তা সুদৃঢ় করার পাশাপাশি ঠান্ডা লড়াইয়ের অবসানের গুরুত্ব পূর্ন ভূমিকা পালন করেছিল। প্যারিস সনদে ইউরোপীয় রাষ্ট্র সমব্যয় প্রতিষ্ঠা করার প্রস্তাব - রাশিয়া, ব্রিটেন ও ফ্রান্স এই তিন বৃহৎ শক্তির দূরত্ব হ্রাস করেছিল।

    ১৯৮৯ খ্রিঃ এমন কতগুলি ঘটনা ঘটে যা আন্তর্জাতিক সম্পর্কের গতি প্রকৃতিকে সম্পূর্ণ বদলে দেয় ওই বছর দুই জার্মানির ঐক্যবদ্ধ হয় এবং পূর্ব ইউরোপে সাম্যবাদের অবসান সূচিত হয়। ফলে ঠান্ডা লড়াইয়ের ভিত্তি রূপে ইউরোপে কাষ্টমোগত বিভাজন ছিল তার অবসান ঘটে। এই পরিবর্তন আন্তর্জাতিক রাজনীতিতে সোভিয়েত ইউনিয়নের আধিপত্যের অবসান ঘটায় এরপরে দুই বছরের মধ্যে সোভিয়েত রাষ্ট্র ব্যবস্থা ভেঙে পড়ে। রাশিয়া থেকে সাম্যবাদ বিদায় ছিল। দূর্বল রাশিয়া কাছে ঠান্ডা লড়াই অপ্রাসঙ্গিক হয়ে পড়ে। ফলে পশ্চিম এশিয়া সহ তৃতীয় বিশ্বের বিভিন্ন অঞ্চলে দুই বৃহৎ শক্তির মধ্যে যে ছায়া যুদ্ধ চলছিল তার অবসান ঘটে।

    ঠান্ডা লড়াইয়ের অবসানে পারমাণবিক অস্ত্র সংবরণের সদিচ গুরুত্বপূর্ণ ভূমিকা পালন করেছিল। পারমাণবিক অস্ত্রের ভয়াবহতা উপলব্ধি করে দুই বৃহৎ শক্তি সংযত হয়েছিল। জর্জ ব্রুশ এবং গর্বাচেভ উভয়ই পারমাণবিক অস্ত্র ধ্বংস করতে সম্মত হয়। এই সিদ্ধান্ত ঠান্ডা লড়াইয়ের অবসানের গুরুত্বপূর্ণ পদক্ষেপ।

  5. বিশ্বায়ন ও তার প্রভাব। (Globalisation and its impact)

    আন্তর্জাতিক সম্পর্কের ক্ষেত্রে বিশ্বায়ন বহু আলোচিত এবং বিতর্কিত বিষয়। একথাটি ৭০-এর দশকের মঝামাঝি প্রথম চালু করে আমেরিকান এক্সপ্রেস ব্যাংক তাদের ক্রেডিট কার্ডের বিজ্ঞাপনে। অধ্যাপক জেমস রোসেণু বিশ্বায়নের কতগুলি বৈশিষ্ট্য তুলে ধরেছেন। সেগুলি হল - মুক্ত বাজার পুঁজির অবাধ বিচরণ, তথ্য ও প্রযুক্তির প্রসার, জাতীয় অর্থনীতি আন্তর্জাতিকীকরন।

    চ্যাটার্জীর বক্তব্য অধ্যাপক পার্থ চ্যার্টার্জীর বক্তব্য হল ইতিহাসের তথ্য থেকে দেখা যায় উনিশ শতকের শেষ দিকে একটা বড় ধরনের বিশ্বায়ন চলছিল। বিশ্বের বিভিন্ন অংশে ব্যাপক পরিমান মূলধন রপ্তানী হচ্ছিল ইউরোপ থেকে। আন্তর্জাতিক মূলধনের আদান প্রদান ধরলে উনিশ শতকের শেষে যতটা বিশ্বায়ন হয়েছিল আজও তা সে জায়গায় পৌঁছায়নি। তথাপি বিংশ শতাব্দীর শেষদিকে এবং একবিংশ শতকে বিশ্বায়নের বিষয়টি গুনগত দিক দিয়ে পৃথক বলে অধ্যাপক চ্যাটার্জী মনে করেন।

    অর্থ সংকট দ্বিতীয় বিশ্বযুদ্ধোত্তর কালে সোভিয়েত ইউনিয়নসহ ইউরোপীয় রাষ্ট্রগুলি অর্থনৈতিক সংকটের সম্মুখিন হয়েছিল। কিন্তু মার্কিন যুক্তরাষ্ট্রের ক্ষেত্রে তা হয়নি। ইউরোপের অন্যান্য দেশগুলিও পুঁজির অভাব জনিত সংকটের মুখে পড়েছিল। তাই ইউরোপের দেশগুলিতে মার্কিন পুঁজিবিনিয়োগের একটা সুযোগ দেখা দেয়। মার্কিন যুক্তরাষ্ট্রের উদ্যোগে গড়ে ওঠে বিশ্বব্যংক। বিশ্বব্যাংকে প্রথম থেকেই মার্কিন ডলারের আধিপত্য ছিল। বিশ্বব্যাংক মারফত ইউরোপ ও তৃতীয় বিশ্বের বাজারে ঋণ অর্থনীতি হিসাবে আমেরিকা ডলার বিনিয়োগ করে।

    ইউরো-ডলার সৃষ্টি ১৯৪৮-১৯৫২ খ্রিঃ মধ্যে আমেরিকা ইউরোপের দেশগুলিও জাপানের ১৭ মিলিয়ন ডলার চড়া সুদে ঋণ দেয়। ফলে ইউরোপ ও জাপানে ডলারের চাহিদা বৃদ্ধি পায়। ১৯৫৬ থেকে আমেরিকা ও ইউরোপের অনেক ব্যাংক বিভিন্ন সংস্থাতে প্রচুর ডলার ঋণ হিসাবে বিনিয়োগ করে। এই ভাবে ইউরো ডলারের সৃষ্টি হয়।

    উন্নয়নশীল দেশ বিশ্বায়নের মধ্যে দিয়ে উন্নত দেশগুলির লক্ষ্য হল যত বেশি সম্ভব মুনাফা অর্জন। অর্থনৈতিক অগ্রগতির সঙ্গে সঙ্গে মানুষের ক্রয় ক্ষমতা বৃদ্ধি পায় ও ভোগ্য পণ্যের চাহিদা বাড়ে। ফলে নানাবিধ পণ্যের বাজার সৃষ্টি হয়। তবে উন্নত দেশগুলির তুলনার উন্নয়নশীল দেশগুলিতে ক্রয় ক্ষমতা সীমিত বলে পণ্যের চাহিদা সীমিত। বর্তমান ভোগবাদী অর্থনীতি উন্নয়নশীল দেশগুলির সমাজ ও অর্থনীতির উপর নেতিবাচক প্রভাব ফেলেছে। উন্নয়নশীল দেশের মুক্ত বাজারে ধনী ও মধ্যবিত্ত শ্রেণী বিভিন্ন ভোগ্য পণ্য ক্রয়ের দিকে ঝুকেছে। অপর দিকে নিম্ন মধ্যবিত্ত এবং দরিদ্র শ্রেণী দূর্বল ক্রয় ক্ষমতার জন্য এই বাজারের বাইরে থেকে যাচ্ছে। ফলে ধনী দরিদ্রের বৈষম্য আরো তীব্র হচ্ছে। শুধু তাই নয় মুক্ত বাজারের বহু দ্রব্যের অবধি ও অনিয়ন্ত্রিত ব্যবহারের ফলে পরিবেশ দূষিত হচ্ছে।

    অন্তরাষ্ট্রীয় ক্ষেত্রে পণ্য চলাচলে বিধি নিষেধ তুলে দেওয়া বিশ্বায়নের অন্যতম শর্ত। এজন্য আমদানি ও অন্তর্দেশীয় শুল্কের মধ্যে ভারসাম্য রাখা দরকার। এ কাজটি সম্পন্ন করার দায়িত্ব বিশ্ববাণিজ্যিক সংস্থার। বলা হয় এর ফলে জাতীয় সংস্কার হবে। শিল্প বাণিজ্যের বিকাশ ঘটবে, সরকারী এ বাড়বে, শিল্পে এবং কৃষিতে সরকারী ভর্তুকি বন্ধ হয়। কিন্তু উন্নয়নশীল দেশগুলির পক্ষে এই নিয়ম বাস্তবে পরিণত করা কঠিন।

    বিশ্ব অর্থনীতি সব দেশের রাজনীতিতে ভীষণভাবে প্রভাবিত করেছে। সবচেয়ে বেশি প্রভাব ফেলেছে আন্তর্জাতিক মূলধন নিয়ন্ত্রণকারী প্রতিষ্ঠানগুলি। ফলে যে দেশ বিদেশী পুঁজির উপর বেশি নির্ভরশীল এই প্রতিষ্ঠানগুলি সে দেশ থেকে সরে যাবার ভয় দেখিয়ে সুবিধাজনক শর্ত আদায় করে। এর ফলে রাষ্ট্রের সার্বভৌমত্বকর হয়। বিশ্ব-ব্যাংকও একথা স্বীকার করে নিয়েছে বিশ্বায়নের ফলে ধনী ও দরিদ্র রাষ্ট্রের মধ্যে ব্যবধান ক্রমশই বেড়ে চলেছে।

    বিশ্বায়নের দরুন প্রযুক্তি ও যন্ত্রনির্ভর উৎপাদনের উপর জোর দেওয়ার ফলে শ্রমিক ছাটাই-এর সমস্যা দেখা দেয়। ফলে শ্রমিকদের অধিকার ও নিরাপত্তা প্রশ্নটি গৌণ হয়ে দাড়ায়। বিশ্বায়নের ফলে কমধনীর রাষ্ট্রগুলির ক্রমশই ঋণের জলে জড়িয়ে পড়েছে। স্থানীয় সংস্কৃতি বিপন্ন হচ্ছে। বিশ্বায়নের দরুন বিভিন্ন রাষ্ট্রের সীমানা তুলনামূলক ভাবে নমনীয় হয়ে ওঠায় সেই সুযোগকে কাজে লাগাচ্ছে সন্ত্রাসবাদীরা এবং মাদক দ্রব্যের চোরাচালানকারিরা। ভারতে বিশ্বায়ন প্রক্রিয়া শুরু হয়েছিল ১৯৮০ সালে নরসিমা রায় আন্তর্জাতিক অর্থসংস্থা ও বিশ্বব্যাংকের কাছ থেকে বিপুল পরিমানে ঋণ নিয়েছিল। বিশ্ববাজারের কাছে সে সময় ভারতের অর্থনীতিকে মুক্ত করে দেওয়া হয়। ফলে ভারতে বাণিজ্য ঘাটতি ছিল প্রায় ৬০০ কোটি ডলার। ১৯৯৪-৯৫ এ বৈদেশিক ঋণের বোঝা ভারী হয়ে ওঠে। ফলে ১৯৯৬ থেকে ভারত বিশ্বায়নের সঙ্গে সামঞ্জস্য বজায় রেখে অর্থনৈতিক ক্ষেত্রে সংস্কার শুরু করে। এই সংস্কারের কুফল মুদ্রাস্ফীতির হার বৃদ্ধি। ফলে সাধারণ মানুষের স্বার্থ বিপন্ন হয়েছে। এই প্রবনতা রোধ করার ক্ষমতা ভারতের নেই। শুধু তাই নয় বিশ্বায়ন বদলে দিয়েছে গণতন্ত্র, জাতীয়তা এবং দেশ প্রেমের ধারনা।

Share:

Project 1 || Wong Edition || C++ Project || B.Tech Diaries

Project #1 - Sorted Date List

  • Read a sequence of dates from file input.
  • Permissible formats for dates include
    dd/mm/yyyy e.g. 01/01/1970
    
    d MMM yyyy e.g. 1 JAN 1970
    
    MMM d, 1970 e.g. JAN 1, 1970
    
    MMMM d, yyyy e.g. January 1, 1970.
    
  • Sort and output the dates such that the later dates come first.
  • Use functions from the STL's: `<string>`, `<algorithm>`, `<regex>`, `<iterator>`, `<array>`.
  • Create your customised MyDate class.

Solution:


#include <iostream>
#include <string>
#include <algorithm>
#include <regex>
#include <iterator>
#include <array>
#include <fstream>
#include <iomanip>

#define N 25

class Date
{
private:
    int day;
    int month;
    int year;
    std::array<std::string, 12> _months = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

public:
    Date()
    {
        day = 9999;
        month = 9999;
        year = 9999;
    }
    Date(std::string str_date)
    {
        day = 1;
        month = 1;
        year = 1970;
        _date_parser(str_date);
    }
    ~Date() {}
    bool is_valid()
    {
        if (day > 31 || day < 1)
            return false;
        if (month > 12 || month < 1)
            return false;
        if (year > 9999 || year < 1000)
            return false;
        return true;
    }
    void _date_parser(std::string str_date)
    {
        std::string _months_abbr_pattern = "", _months_pattern = "";
        for (size_t i = 0; i < _months.size(); i++)
        {
            _months_abbr_pattern += _months[i].substr(0, 3);
            if (_months.size() - 1 != i)
            {
                _months_abbr_pattern += "|";
            }
        }
        for (size_t i = 0; i < _months.size(); i++)
        {
            _months_pattern += _months[i];
            if (_months.size() - 1 != i)
            {
                _months_pattern += "|";
            }
        }

        std::array<std::regex, 10> patterns({
            std::regex("([0-2][1-9]|3[0-1])\\s*[, /\\-]\\s*(0[1-9]|1[0-2])\\s*[, /\\-]\\s*([1-5]\\d{3})"),
            std::regex("([1-9]|[1-2][1-9]|3[0-1])\\s*[, /\\-]\\s*(" + _months_abbr_pattern + ")\\s*[, /\\-]\\s*([1-5]\\d{3})", std::regex::icase),
            std::regex("(" + _months_abbr_pattern + ")\\s*[, /\\-]\\s*([1-9]|[1-2][1-9]|3[0-1])\\s*[, /\\-]\\s*([1-5]\\d{3})", std::regex::icase),
            std::regex("(" + _months_pattern + ")\\s*[, /\\-]\\s*([1-9]|[1-2][1-9]|3[0-1])\\s*[, /\\-]\\s*([1-5]\\d{3})", std::regex::icase),
        });

        std::smatch match;
        bool check = false;
        for (size_t i = 0; i < patterns.size(); i++)
        {
            if (std::regex_match(str_date, patterns[i]))
            {
                std::regex_search(str_date, match, patterns[i]);
                switch (i)
                {
                case 0:
                    day = std::stoi(match[1].str());
                    month = std::stoi(match[2].str());
                    year = std::stoi(match[3]);
                    break;
                case 1:
                    day = std::stoi(match[1].str());
                    month = _months.size();
                    for (size_t i = 0; i < _months.size(); i++)
                    {
                        if (_months[i].substr(0, 3) == match[2].str())
                        {
                            month = i + 1;
                            break;
                        }
                    }
                    year = std::stoi(match[3]);
                    break;
                case 2:
                    day = std::stoi(match[2].str());
                    month = _months.size();
                    for (size_t i = 0; i < _months.size(); i++)
                    {
                        if (_months[i].substr(0, 3) == match[1].str())
                        {
                            month = i + 1;
                            break;
                        }
                    }
                    year = std::stoi(match[3]);
                    break;
                case 3:
                    day = std::stoi(match[2].str());
                    month = _months.size();
                    for (size_t i = 0; i < _months.size(); i++)
                    {
                        if (_months[i] == match[1].str())
                        {
                            month = i + 1;
                            break;
                        }
                    }
                    year = std::stoi(match[3]);
                    break;
                }
                check = true;
                break;
            }
        }
        if (!check)
            std::cout << "Invalid Format" << std::endl;
    }

    bool operator>(Date d)
    {
        if (year > d.year)
            return true;
        else if (year == d.year)
        {
            if (month > d.month)
                return true;
            else if (month == d.month)
            {
                if (day > d.day)
                    return true;
                else
                    return false;
            }
            else
                return false;
        }
        return false;
    }

    bool operator<(Date d)
    {
        if (year < d.year)
            return true;
        else if (year == d.year)
        {
            if (month < d.month)
                return true;
            else if (month == d.month)
            {
                if (day < d.day)
                    return true;
                else
                    return false;
            }
            else
                return false;
        }
        return false;
    }

    std::string _str()
    {
        std::string str_date = "";
        str_date += std::to_string(day) + " ";
        str_date += _months[month - 1] + " ";
        str_date += std::to_string(year);
        return str_date;
    }

    friend std::ostream &operator<<(std::ostream &os, Date &date)
    {
        os << date._str();
        return os;
    }
};

std::array<Date, N> get_dates(std::string filename)
{
    std::ifstream infile;
    std::string str_date;

    std::array<Date, N> date_array;
    std::cout << "Get Dates from " << filename << " ... " << std::endl;
    int i = 0;
    infile.open(filename);
    while (std::getline(infile, str_date))
    {
        if (str_date != "")
            date_array[i++] = Date(str_date);
    }
    infile.close();

    return date_array;
}

int main(int argc, char const *argv[])
{
    std::array<Date, N> dates = get_dates("date_list.txt");

    std::cout << "Sorting Dates ... " << std::endl;
    std::sort(dates.begin(), dates.end());

    std::array<Date, N>::iterator it;
    for (it = dates.begin(); it != dates.end(); it++)
    {
        if (it->is_valid())
            std::cout << *it << std::endl;
    }

    return 0;
}

Input (date_list.txt):


30/01/3055
30-02-4849
30 01, 3459
16/11/5509
30-06/1571
13-Aug-1768
30/ Apr/1002
2 May 2668
29 JAN, 5802
31 Jul 2224
Jan 7 3106
Apr 31 1632
Mar 6 ,3214
Feb 19, 5063
Sep 6-3652
April 30, 5889
January 13 ,4035
May 21 2671
June 30, 4785
JANUARY 4 2324

Output:


Get Dates from date_list.txt ... 
Sorting Dates ...
30 April 1002
30 June 1571
31 April 1632
13 August 1768
31 July 2224
4 December 2324
2 May 2668
21 May 2671
30 January 3055
7 January 3106
6 March 3214
30 January 3459
6 September 3652
13 January 4035
30 June 4785
30 February 4849
19 February 5063
16 November 5509
29 December 5802
30 April 5889

Share:

Programming with C++ - Day8 || Wong Edition || B.Tech Diaries

Lab #8 - Standard Template Library (STL)

Resources

Question 1 - Acrobatics with Strings

Write a program that creates 2 strings then prints out the letters they have in common.

Solution:


#include <bits/stdc++.h>

// Question 1
void commonLetters(std::string s1, std::string s2)
{
    std::string s = "";
    auto it = std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), std::back_inserter(s));
    std::cout << s << std::endl;
}

int main(int argc, char const *argv[])
{
    std::string s1 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Nec feugiat in fermentum posuere urna. Nunc sed blandit libero volutpat sed cras ornare. Commodo quis imperdiet massa tincidunt nunc pulvinar sapien et ligula. A scelerisque purus semper eget. Pellentesque elit ullamcorper dignissim cras tincidunt lobortis. Mattis aliquam faucibus purus in massa tempor nec feugiat nisl. Tortor id aliquet lectus proin. Nulla posuere sollicitudin aliquam ultrices sagittis. Sed adipiscing diam donec adipiscing. Bibendum enim facilisis gravida neque convallis a cras.",
                s2 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Sit amet nisl suscipit adipiscing bibendum. Sed viverra ipsum nunc aliquet bibendum enim facilisis gravida. Ipsum suspendisse ultrices gravida dictum fusce ut placerat orci nulla. Et magnis dis parturient montes. Blandit massa enim nec dui nunc mattis enim ut tellus. Tempus quam pellentesque nec nam aliquam. Aenean pharetra magna ac placerat vestibulum lectus mauris ultrices eros. Tristique nulla aliquet enim tortor at auctor urna nunc id. In fermentum et sollicitudin ac orci phasellus. Senectus et netus et malesuada fames ac.";
    commonLetters(s1, s2);
    return 0;
}

Output:


Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ut iumvvrsuuuussrvidauv

Question 2 - Sorting Vehicles

Create instances of the Vehicle class (from Lab #7) e.g. 3 BUSes, 4 CARs, 2 AUTOs, 5 SCOOTERs.

Store them in a Vector and sort them according to size.

Solution:


#include <bits/stdc++.h>

// Question 2
class Vehicle
{
private:
    std::string name;
    int legs;
    double cost;

public:
    Vehicle()
    {
    }
    Vehicle(std::string n, int l, double c)
    {
        legs = l;
        cost = c;
        name = n;
    }
    ~Vehicle()
    {
    }

    double _cost()
    {
        return cost;
    }

    bool operator>(Vehicle v)
    {
        return (legs > v.legs) || (legs == v.legs && cost > v.cost);
    }
    bool operator<(Vehicle v)
    {
        return (legs < v.legs) || (legs == v.legs && cost < v.cost);
    }

    bool operator==(Vehicle v)
    {
        return (legs == v.legs) && (cost == v.cost);
    }

    std::string to_string()
    {
        return name + "(" + std::to_string(legs) + "," + std::to_string(cost) + ")";
    }

    operator std::string() const
    {
        return name + "(" + std::to_string(legs) + "," + std::to_string(cost) + ")";
    }

    friend std::ostream &operator<<(std::ostream &out, Vehicle &v)
    {
        out << v.to_string();
        return out;
    }
};

void sortVehicles(std::vector<Vehicle> &vehicles)
{
    struct
    {
        bool operator()(Vehicle v1, Vehicle v2)
        {
            return v1._cost() > v2._cost();
        }
    } smallerSize;

    std::sort(vehicles.begin(), vehicles.end(), smallerSize);
    // return vehicles;
}

int main(int argc, char const *argv[])
{
    std::vector<Vehicle> vehicles;
    vehicles.push_back(Vehicle("car", 4, 100));
    vehicles.push_back(Vehicle("car", 4, 200));
    vehicles.push_back(Vehicle("car", 4, 300));
    vehicles.push_back(Vehicle("car", 4, 400));
    vehicles.push_back(Vehicle("bus", 4, 400));
    vehicles.push_back(Vehicle("bus", 4, 300));
    vehicles.push_back(Vehicle("bus", 4, 200));
    vehicles.push_back(Vehicle("auto", 3, 400));
    vehicles.push_back(Vehicle("auto", 3, 300));
    vehicles.push_back(Vehicle("scooter", 2, 50));
    vehicles.push_back(Vehicle("scooter", 2, 100));
    vehicles.push_back(Vehicle("scooter", 2, 120));
    vehicles.push_back(Vehicle("scooter", 2, 150));
    vehicles.push_back(Vehicle("scooter", 2, 200));
    sortVehicles(vehicles);
    for (Vehicle v : vehicles)
    {
        std::cout << v << std::endl;
    }
    return 0;
}

Output:


car(4,400.000000)
bus(4,400.000000)
auto(3,400.000000)
car(4,300.000000)
bus(4,300.000000)
auto(3,300.000000)
car(4,200.000000)
bus(4,200.000000)
scooter(2,200.000000)
scooter(2,150.000000)
scooter(2,120.000000)
car(4,100.000000)
scooter(2,100.000000)
scooter(2,50.000000)

Question 3 - Rectangles and Squares

Using the Rectangle class from Lab #3, create a Square class.

Store instances of Rectangle and Square in a single Vector.

Sort them according to their area. [Hint: use Vector<Rectangle *>]

Solution:


    #include <bits/stdc++.h>

    // Question 3
    class Rectangle
    {
    private:
        int length, breadth;
        std::string colour;
    
    public:
        Rectangle();
        Rectangle(int, int, std::string);
        ~Rectangle();
        int getArea();
        std::string print();
        int compare(Rectangle);
        int _length();
        int _breadth();
        std::string _colour();
    };
    
    int Rectangle::_length()
    {
        return length;
    }
    
    int Rectangle::_breadth()
    {
        return breadth;
    }
    
    std::string Rectangle::_colour()
    {
        return colour;
    }
    
    Rectangle::Rectangle()
    {
        length = 0;
        breadth = 0;
        colour = "";
    }
    
    Rectangle::Rectangle(int length, int breadth, std::string colour)
    {
        this->length = length;
        this->breadth = breadth;
        this->colour = colour;
    }
    
    Rectangle::~Rectangle()
    {
    }
    
    int Rectangle::getArea()
    {
        return this->length * this->breadth;
    }
    
    std::string Rectangle::print()
    {
        std::stringstream ps;
        ps << "\nLength: " << this->length
           << "\nBreadth: " << this->breadth
           << "\nColour: " << this->colour
           << "\nArea: " << this->getArea() << std::endl;
        return ps.str();
    }
    
    int Rectangle::compare(Rectangle rect)
    {
        if (this->getArea() > rect.getArea())
            return 1;
        else if (this->getArea() < rect.getArea())
            return -1;
        return 0;
    }
    
    class Square : public Rectangle
    {
    
    private:
    public:
        Square();
        Square(int, std::string);
        ~Square();
        std::string print();
    };
    
    Square::Square()
    {
    }
    Square::Square(int side, std::string color) : Rectangle(side, side, color)
    {
    }
    
    Square::~Square()
    {
    }
    
    std::string Square::print()
    {
        std::stringstream ps;
        ps << "\nSide: " << this->_length()
           << "\nColour: " << this->_colour()
           << "\nArea: " << this->getArea() << std::endl;
        return ps.str();
    }
    
    int main(int argc, char const *argv[])
    {
        std::vector<Rectangle> rectangles;
        rectangles.push_back(Square(5, "S red"));
        rectangles.push_back(Square(10, "S blue"));
        rectangles.push_back(Square(15, "S green"));
    
        rectangles.push_back(Rectangle(5, 10, "R red"));
        rectangles.push_back(Rectangle(10, 15, "R blue"));
        rectangles.push_back(Rectangle(15, 20, "R green"));
    
        std::sort(rectangles.begin(), rectangles.end(), [](Rectangle a, Rectangle b)
                  { return a.compare(b) < 0; });
    
        for (Rectangle r : rectangles)
        {
            std::cout << r.print() << std::endl;
        }
    
        return 0;
    }      

Output:


    Length: 5
    Breadth: 5
    Colour: S red
    Area: 25
    
    
    Length: 5
    Breadth: 10
    Colour: R red
    Area: 50
    
    
    Length: 10
    Breadth: 10
    Colour: S blue
    Area: 100
    
    
    Length: 10
    Breadth: 15
    Colour: R blue
    Area: 150
    
    
    Length: 15
    Breadth: 15
    Colour: S green
    Area: 225
    
    
    Length: 15
    Breadth: 20
    Colour: R green
    Area: 300

Share:

Programming with C++ - Day7 || Wong Edition || B.Tech Diaries

Lab #7 - Templates

Question 1 - Function Template

The format for function declaration is:

template <class identifier> function_declaration;

The format for function call is:

function_name <type> (parameters);
  • Write a function template getLarger that takes two parameters of any (same) type and returns the larger of the two.
  • Write a class Vehicle and provide the implementation for the ">" operator. Use the Vehicle in the getLarger function from (a). E.g. Bus > Car > Auto > Scooter

Solution:


#include <iostream>

// question 1
class Vehicle
{
private:
    std::string name;
    int legs;
    double cost;

public:
    Vehicle()
    {
    }
    Vehicle(std::string n, int l, double c)
    {
        legs = l;
        cost = c;
        name = n;
    }
    ~Vehicle()
    {
    }
    bool operator>(Vehicle v)
    {
        return (legs > v.legs) || (legs == v.legs && cost > v.cost);
    }
    bool operator<(Vehicle v)
    {
        return (legs < v.legs) || (legs == v.legs && cost < v.cost);
    }

    bool operator==(Vehicle v)
    {
        return (legs == v.legs) && (cost == v.cost);
    }

    operator std::string() const
    {
        return name + "(" + std::to_string(legs) + "," + std::to_string(cost) + ")";
    }

    std::string to_string()
    {
        return name + "(" + std::to_string(legs) + "," + std::to_string(cost) + ")";
    }

    friend std::ostream &operator<<(std::ostream &out, const Vehicle &v);
};

template <typename T>
T getLarger(T a, T b)
{
    return (a > b) ? a : b;
}

template <typename T>
T getSmaller(T a, T b)
{
    return (a < b) ? a : b;
}

int main(int argc, char const *argv[])
{
    int N = 10;

    Vehicle vehicles[N];

    for (int i = 0; i < N; i++)
    {
        int legs = rand() % 4 + 2;
        double cost = rand() % 700 + 100;
        std::string name = "Vehicle " + std::to_string(i + 1);
        vehicles[i] = Vehicle(name, legs, cost);
    }

    std::cout << std::endl
                << "========Comparison of Vehicles========"
                << std::endl;

    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N - i - 1; j++)
        {
            Vehicle v1 = getLarger<Vehicle>(vehicles[j + 1], vehicles[j]);
            Vehicle v2 = getSmaller<Vehicle>(vehicles[j + 1], vehicles[j]);
            vehicles[j] = v1;
            vehicles[j + 1] = v2;
        }
    }

    for (int i = 0; i < N; i++)
    {
        std::cout << vehicles[i];
        if (i != N - 1)
            std::cout << " > ";
    }
    std::cout << std::endl
                << std::endl;

    return 0;
}


========Comparison of Vehicles========
Vehicle 1(5,286.000000) > Vehicle 8(5,226.000000) > Vehicle 4(4,592.000000) > Vehicle 7(4,559.000000) > Vehicle 6(4,427.000000) > Vehicle 3(3,635.000000) > Vehicle 5(3,621.000000) > Vehicle 2(3,315.000000) > Vehicle 9(2,626.000000) > Vehicle 10(2,536.000000)

Question 2 - Class Template

The format for function declaration is:

template <class identifier> class classname
  1. Write a class template MyArray that can store up to 10 elements of any type, with the following functions:-
    • addElement
    • sort
    • print
  2. Store Vehicle instances from Question 1 in MyArray and sort them.

Solution:


...
// question 2
template <typename T>
class MyArray
{
private:
    T *arr;
    int capacity, size;

public:
    MyArray()
    {
        capacity = 8;
        arr = new T[capacity];
        size = 0;
    }
    bool addElement(T item)
    {
        if (size == capacity)
        {
            T *temp = new T[capacity * 2];
            for (int i = 0; i < size; i++)
            {
                temp[i] = arr[i];
            }
            delete[] arr;
            arr = temp;
            capacity *= 2;
        }
        arr[size++] = item;
        return true;
    }
    void sort()
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = i + 1; j < size; j++)
            {
                if (arr[j] > arr[i])
                {
                    std::swap(arr[i], arr[j]);
                }
            }
        }
    }
    T get(int index)
    {
        return arr[index];
    }
    T operator[](int index)
    {
        return arr[index];
    }
    std::string print()
    {
        std::string str = "[";
        for (int i = 0; i < size; i++)
        {
            str += arr[i].to_string();
            if (i != size - 1)
                str += ", ";
        }
        str += "]";
        return str;
    }
};

int main(int argc, char const *argv[])
{
    int N = 15;

    MyArray<Vehicle> vehicles;

    for (int i = 0; i < N; i++)
    {
        int legs = rand() % 4 + 2;
        double cost = rand() % 1000 * 0.1234 + 100;
        std::string name = "Vehicle " + std::to_string(i + 1);
        vehicles.addElement(Vehicle(name, legs, cost));
    }

    std::cout << "Vehicles before sorting" << std::endl;
    std::cout << vehicles.print()
              << std::endl
              << std::endl;

    std::cout << "Vehicles after sorting" << std::endl;

    vehicles.sort();

    return 0;
}


    Vehicles before sorting
[Vehicle 1(5,209.332400), Vehicle 2(3,212.911000), Vehicle 3(3,141.339000), Vehicle 4(4,160.712800), Vehicle 5(3,151.951400), Vehicle 6(4,103.331800), Vehicle 7(4,107.280600), Vehicle 8(5,214.268400), Vehicle 9(2,152.568400), Vehicle 10(2,190.822400), Vehicle 11(5,145.411200), Vehicle 12(5,152.938600), Vehicle 13(4,165.402000), Vehicle 14(4,115.178200), Vehicle 15(5,116.659000)]

Question 3 - Friend Function

In Question 1 and Question 2, the `printTypeString()` function in the Vehicle class was used to output Vehicle information.

Overload the cout "<<" operator to output Vehicle information. Declare the "<<" function as friend in the Vehicle class, so as to access Vehicle's private attributes:-

friend ostream& operator<<(ostream &out, const Vehicle& v)

Note: friend functions and classes should be used sparingly as they break the good idea of encapsulation.

Solution:


...
// question 3
std::ostream &operator<<(std::ostream &out, const Vehicle &v)
{
    out << v.operator std::string();
    return out;
}

int main(int argc, char const *argv[])
{
    int N = 15;

    MyArray<Vehicle> vehicles;

    for (int i = 0; i < N; i++)
    {
        int legs = rand() % 4 + 2;
        double cost = rand() % 1000 * 0.1234 + 100;
        std::string name = "Vehicle " + std::to_string(i + 1);
        vehicles.addElement(Vehicle(name, legs, cost));
    }

    std::cout << "Vehicles before sorting" << std::endl;
    std::cout << vehicles.print()
                << std::endl
                << std::endl;

    std::cout << "Vehicles after sorting" << std::endl;

    vehicles.sort();

    std::cout << vehicles.print() << std::endl;
    std::cout << std::endl;

    std::cout << vehicles[0] << std::endl;

    return 0;
}    

Output:


Vehicles before sorting
[Vehicle 1(5,209.332400), Vehicle 2(3,212.911000), Vehicle 3(3,141.339000), Vehicle 4(4,160.712800), Vehicle 5(3,151.951400), Vehicle 6(4,103.331800), Vehicle 7(4,107.280600), Vehicle 8(5,214.268400), Vehicle 9(2,152.568400), Vehicle 10(2,190.822400), Vehicle 11(5,145.411200), Vehicle 12(5,152.938600), Vehicle 13(4,165.402000), Vehicle 14(4,115.178200), Vehicle 15(5,116.659000)]

Vehicles after sorting
[Vehicle 8(5,214.268400), Vehicle 1(5,209.332400), Vehicle 12(5,152.938600), Vehicle 11(5,145.411200), Vehicle 15(5,116.659000), Vehicle 13(4,165.402000), Vehicle 4(4,160.712800), Vehicle 14(4,115.178200), Vehicle 7(4,107.280600), Vehicle 6(4,103.331800), Vehicle 2(3,212.911000), Vehicle 5(3,151.951400), Vehicle 3(3,141.339000), Vehicle 10(2,190.822400), Vehicle 9(2,152.568400)]

Vehicle 8(5,214.268400)

Share:

Programming with C++ - Day5 || Wong Edition || B.Tech Diaries

Lab #5 - Inheritance and Over-Riding

Question 1 - Company Hierarchy

In a Company Hierarchy consisting of Clerk, Manager and Director, the invoice approval limits are as follows:-

  • Clerk - $100
  • Manager - $500
  • Director - $1000

The UML Class Diagram for the Clerk is as shown.

Clerk
- name : String
- designation: String
* getName : String
* getDesignation : String
* introduce() : String
* approveInvoice(in invoiceAmount:double) : boolean
  • Depict the Company Hierarchy in a UML Class Diagram.
  • Implement the Company Hierarchy. Over-Ride the approveInvoice function to ensure the approval limits are adhered to. [Hint: create the main() loop in the Director class and create instances of Clerk, Manager and Director]

Solution:


#include <iostream>

/**
    * @brief Class Clerk
*/
class Clerk
{
private:
    std::string name, designation;

public:
    Clerk(std::string);
    Clerk(std::string, std::string);
    ~Clerk();
    std::string getName();
    std::string getDesignation();
    std::string introduce();
    bool approveInvoice(double);
};

Clerk::Clerk(std::string name)
{
    this->name = name;
    this->designation = "Clerk";
}

Clerk::Clerk(std::string name, std::string designation)
{
    this->name = name;
    this->designation = designation;
}

Clerk::~Clerk()
{
}

std::string Clerk::getName()
{
    return this->name;
}

std::string Clerk::getDesignation()
{
    return this->designation;
}

std::string Clerk::introduce()
{
    return "My name is " + this->name + " and I am a " + this->designation;
}

bool Clerk::approveInvoice(double amount)
{
    if (amount <= 100)
        return true;
    else
        return false;
}

/**
    * @brief Class Manager
*/

class Manager : public Clerk
{
private:
public:
    Manager(std::string);
    Manager(std::string, std::string);
    ~Manager();
    bool approveInvoice(double);
};

Manager::Manager(std::string name) : Clerk(name, "Manager")
{
}

Manager::Manager(std::string name, std::string designation) : Clerk(name, designation)
{
}

Manager::~Manager()
{
}

bool Manager::approveInvoice(double amount)
{
    if (amount <= 500)
        return true;
    else
        return false;
}

/**
    * @brief Class Manager
*/

class Director : public Manager
{
private:
public:
    Director(std::string);
    ~Director();
    bool approveInvoice(double);
};

Director::Director(std::string name) : Manager(name, "Director")
{
}

Director::~Director()
{
}

bool Director::approveInvoice(double amount)
{
    if (amount <= 1000)
        return true;
    else
        return false;
}

// program 1
int main(int argc, char const *argv[])
{
    Clerk clerk("John");
    Manager manager("Jane");
    Director director("Jack");

    std::cout << clerk.introduce() << std::endl;
    std::cout << manager.introduce() << std::endl;
    std::cout << director.introduce() << std::endl;

    std::cout << (clerk.approveInvoice(77) ? "True" : "False") << std::endl;
    std::cout << (clerk.approveInvoice(100) ? "True" : "False") << std::endl;
    std::cout << (clerk.approveInvoice(124) ? "True" : "False") << std::endl;

    std::cout << (manager.approveInvoice(427) ? "True" : "False") << std::endl;
    std::cout << (manager.approveInvoice(500) ? "True" : "False") << std::endl;
    std::cout << (manager.approveInvoice(584) ? "True" : "False") << std::endl;

    std::cout << (director.approveInvoice(927) ? "True" : "False") << std::endl;
    std::cout << (director.approveInvoice(1000) ? "True" : "False") << std::endl;
    std::cout << (director.approveInvoice(1084) ? "True" : "False") << std::endl;
    return 0;
}    

Output:


My name is John and I am a Clerk
My name is Jane and I am a Manager
My name is Jack and I am a Director
True
True
False
True
True
False
True
True
False

Question 2 - Company Hierarchy with Outsourcing

To cut costs, the Company decided to take on Contractors.

A Contractor has a Name in the company records, but has no formal designation. A Contractor cannot approveInvoice (but of course!).

Suppose that at a Company function, everyone has to introduce himself / herself:-

    Hello, my name is xxx.  My designation is XXX.
                          or
    Hello, my name is yyy.  I am a Contractor.
  • Design the new Company Hierarchy in a UML Class Diagram, to accommodate the Contractor. [Hint: pull up the common attributes / properties and behaviour into an Abstract Class.]
  • Implement the new Company Hierarchy. Keep the main() loop in the Director class.

Solution:


...
// program 2

class Contractor : protected Clerk
{
private:

public:
    Contractor(std::string);
    ~Contractor();
    std::string introduce();
    std::string getName();
};

Contractor::Contractor(std::string name) : Clerk(name)
{
}

Contractor::~Contractor()
{
}

std::string Contractor::introduce()
{
    return "My name is " + this->getName() + " and I am a Contractor";
}

std::string Contractor::getName()
{
    return Clerk::getName();
}

int main(int argc, char const *argv[])
{
    Contractor contractor("John");
    std::cout << contractor.introduce() << std::endl;
    std::cout << contractor.getName() << std::endl;

    return 0;
}


My name is John and I am a Contractor
John

Question 3 - Fraud!

Suppose a Director in the Company tries to impersonate his Clerk at the Company function by introducing himself as a Clerk. By using casting, show how that this is possible.


Clerk* cPtr = new Manager(...);
cPtr->introduce();   

Suppose a Clerk in the Company tries to impersonate his Manager at the Company function. Explain why this is not possible.


Manager* mPtr = new Clerk(...);
mPtr->introduce();

Solution:


...
// program 3
int main(int argc, char const *argv[])
{
    Clerk *cPtr = new Manager("John");
    std::cout << cPtr->introduce() << std::endl;

    try
    {
        Manager *mPtr = new Clerk("Jane");
        mPtr->introduce();
    }
    catch (const std::exception &e)
    {
        std::cerr << e.what() << 'n';
    }

    return 0;
}


My name is John and I am a Manager

Share:

Programming with C++ - Day4 || Wong Edition || B.Tech Diaries

Lab #4 - Overloading

Question 1 - Employee

Create an Employee class according to the given Class Diagram.


Employee
- name: String
- gender: int
- colour : string
- Employee()
* Employee(in_name:String, in_gender:boolean)
- getName(): String
- getGender(): boolean
- print(): String

The default constructor is declared private to prevent its use. boolean getGender() returns FALSE if male and TRUE if female. The print() function gives the following sample output:

    Hello, my name is Arif. I am male.

From 2014, India officially recognises a third gender. Modify your design (i.e. give a new UML Class Diagram) to provide

    an overloaded constructor to take in gender information as an integer,
    an overloaded getGender() function that returns 0 if male, 1 if female and -1 if transgender, and
    an overloaded print() function that handles the third gender. 

In your main() loop, create

    2 Employee instances, hired before 2014, and
    3 Employee instances, hired after 2014.

Solution:


#include <iostream>
#include <sstream>

class Employee
{
private:
    std::string name;
    int gender;
    Employee();

public:
    Employee(std::string, bool);
    Employee(std::string, int);
    ~Employee();
    std::string getName();
    bool getGender();
    int getGender(int);
    std::string print();
    std::string print(int);
};

Employee::Employee()
{
}

Employee::~Employee()
{
}

Employee::Employee(std::string name, bool gender)
{
    this->name = name;
    this->gender = gender;
}

std::string Employee::getName()
{
    return name;
}

bool Employee::getGender()
{
    return gender;
}

std::string Employee::print()
{
    std::stringstream ps;
    ps << "Hello, my name is " << name << ". I am " << (gender == 0 ? "male" : "female") << "." << std::endl;
    return ps.str();
}

/*
    After 2014 changes
*/

Employee::Employee(std::string name, int gender)
{
    this->name = name;
    this->gender = gender;
}

int Employee::getGender(int i)
{
    if (i)
        return this->getGender();
    return gender;
}

std::string Employee::print(int i)
{
    if (i)
        this->print();

    std::stringstream ps;
    ps << "Hello, my name is " << name << ". I am " << (gender == 0 ? "male" : (gender == 1 ? "female" : "transgender")) << "." << std::endl;
    return ps.str();
}

int main(int argc, char const *argv[])
{
    Employee e1("Alpha", false), e2("Beta", true);
    std::cout << e1.print(0);
    std::cout << e2.print(0);
    Employee em1("Delta", 1), em2("Gamma", 0), em3("Epsilon", -1);
    std::cout << em1.print(0);
    std::cout << em2.print(0);
    std::cout << em3.print(0);
    return 0;
}    

Output:


Hello, my name is Alpha. I am male.
Hello, my name is Beta. I am female.
Hello, my name is Delta. I am female.
Hello, my name is Gamma. I am male.
Hello, my name is Epsilon. I am transgender.

Question 2 - Operator Overloading

Implement a class named RealTime with representation HH:MM:SS. Design and implement appropriate constructors.

Overload the following operators:

    +	 Addition e.g. myRealTime + yourRealTime
    ++	 Post-Increment e.g. myRealTime++
    ++	 Pre-Increment e.g. ++RealTime 

Provide comments in your code and proper indentation, so that it is easy to read.

Solution:


#include <iostream>
#include <iomanip>

class RealTime
{
private:
    int hr, min, sec;

public:
    RealTime();
    RealTime(int, int, int);
    ~RealTime();
    RealTime operator+(RealTime const &);
    RealTime operator++();
    RealTime operator++(int);
    friend std::ostream &operator<<(std::ostream &, RealTime const &);
};

RealTime::RealTime()
{
    hr = min = sec = 0;
}

RealTime::RealTime(int hr, int min, int sec)
{
    this->hr = hr;
    this->min = min;
    this->sec = sec;
}

RealTime::~RealTime()
{
}

RealTime RealTime::operator+(RealTime const &rt)
{
    RealTime temp;
    temp.sec = this->sec + rt.sec;
    temp.min = this->min + rt.min + temp.sec / 60;
    temp.sec %= 60;
    temp.hr = this->hr + rt.hr + temp.min / 60;
    temp.min %= 60;
    return temp;
}

RealTime RealTime::operator++()
{
    ++sec;
    min = min + sec / 60;
    sec %= 60;
    hr = hr + min / 60;
    min %= 60;
    return *this;
}

RealTime RealTime::operator++(int)
{
    RealTime temp(hr, min, sec);
    sec++;
    min = min + sec / 60;
    sec %= 60;
    hr = hr + min / 60;
    min %= 60;
    return temp;
}

std::ostream &operator<<(std::ostream &os, RealTime const &rt)
{
    return os << std::setfill('0') << std::setw(2) << rt.hr << ":"
                << std::setfill('0') << std::setw(2) << rt.min << ":"
                << std::setfill('0') << std::setw(2) << rt.sec;
}

int main(int argc, char const *argv[])
{
    RealTime myRealTime(7, 2, 5), yourRealTime(12, 34, 56);
    RealTime resRealTime = myRealTime + yourRealTime;
    std::cout << "My Real Time = " << myRealTime << std::endl;
    std::cout << "Your Real Time = " << yourRealTime << std::endl;
    std::cout << "Total Real Time = " << resRealTime << std::endl;
    std::cout << "Prefix Add Real Time = " << ++myRealTime << std::endl;
    std::cout << "Postfix Add Real Time = " << yourRealTime++ << std::endl;
    std::cout << yourRealTime << std::endl;
    return 0;
}    

Output:


My Real Time = 07:02:05
Your Real Time = 12:34:56
Total Real Time = 19:37:01
Prefix Add Real Time = 07:02:06
Postfix Add Real Time = 12:34:56
12:34:57

Share:

Programming with C++ - Day3 || Wong Edition || B.Tech Diaries

Lab #3 - Classes

Question 1 - Rectangle

Implement the Rectangle class according to the given Class Diagram.

Rectangle
- length : int
- width: int
- colour : string
+ getArea() : int
+ print() : string
+ compare(Rectangle r1) : int

Write a constructor which takes as input the length and width of a Rectangle instance. In the default constructor, initalise the length and width to 0;

The function compare returns

    0, if the Rectangle instances are of the same size,
    1, if r1 is larger
    -1, if r1 is smaller 

The function print gives the dimensions, colour and area of the Rectangle instance.

In the main function of Rectangle, obtain and validate user input for the Rectangle's dimensions and colour. Create 2 Rectangle instances and compare their area. [Hint: check for type and negative numbers]

Solution:


    #include <iostream>
    #include <sstream>

    class Rectangle
    {
    private:
        int length, breadth;
        std::string colour;

    public:
        Rectangle();
        Rectangle(int, int, std::string);
        ~Rectangle();
        int getArea();
        std::string print();
        int compare(Rectangle);
    };

    Rectangle::Rectangle()
    {
        length = 0;
        breadth = 0;
        colour = "";
    }

    Rectangle::Rectangle(int length, int breadth, std::string colour)
    {
        this->length = length;
        this->breadth = breadth;
        this->colour = colour;
    }

    Rectangle::~Rectangle()
    {
    }

    int Rectangle::getArea()
    {
        return this->length * this->breadth;
    }

    std::string Rectangle::print()
    {
        std::stringstream ps;
        ps << "nLength: " << this->length
        << "nBreadth: " << this->breadth
        << "nColour: " << this->colour
        << "nArea: " << this->getArea() << std::endl;
        return ps.str();
    }

    int Rectangle::compare(Rectangle rect)
    {
        if (this->getArea() > rect.getArea())
            return 1;
        else if (this->getArea() < rect.getArea())
            return -1;
        return 0;
    }

    int main(int argc, char const *argv[])
    {
        int len, br;
        std::string col;

        // std::cout << "Enter dimensions for Rectangle 1:n"
        //           << "Length:";
        while (std::cin >> len)
        {
            if (len > 0)
                break;
            if (len <= 0)
                std::cout << "Length should be greater than 0n";
        }
        // std::cout << "Breadth:";
        while (std::cin >> br)
        {
            if (br > 0)
                break;
            if (br <= 0)
                std::cout << "Breadth should be greater than 0" << std::endl;
        }
        // std::cout << "Color:";
        std::cin.ignore();
        std::cin >> col;
        Rectangle rect1(len, br, col);

        // std::cout << "Enter dimensions for Rectangle 2:n"
        //           << "Length:";
        while (std::cin >> len)
        {
            if (len > 0)
                break;
        }
        // std::cout << "Breadth:";
        while (std::cin >> br)
        {
            if (br > 0)
                break;
        }
        // std::cout << "Color:";
        std::cin.ignore();
        std::cin >> col;
        Rectangle rect2(len, br, col);

        std::cout << "Rectangle 1n"
                << rect1.print() << std::endl;
        std::cout << "Rectangle 2n"
                << rect2.print() << std::endl;

        if (rect1.compare(rect2) == 1)
            std::cout << "Rectangle 1 is bigger than Rectangle 2" << std::endl;
        else if (rect1.compare(rect2) == -1)
            std::cout << "Rectangle 2 is bigger than Rectangle 1" << std::endl;
        else
            std::cout << "Rectangle 1 and Rectangle 2 are equal" << std::endl;

        return 0;
    }  

Output:


    12
    54
    Red
    24
    32
    Green
  
    Rectangle 1
    
    Length: 12
    Breadth: 54
    Colour: Red
    Area: 648
    
    Rectangle 2
    
    Length: 24
    Breadth: 32
    Colour: Green
    Area: 768
    
    Rectangle 2 is bigger than Rectangle 1

Question 2 - Student Records

In a UML Diagram, design a Student class with the following attributes:-

    name (max 30 characters)
    rollNumber (between 1 and 260)
    mobileNumber (10 digits)
    emailAddress (must contain '@' and then '.')
    attendance (between 0 and 1, where 1 is 100% attendance)

Provide the following functions:-

    getName, getRollNumber, ...
    setName, setRollNumber, ...
    print, which outputs the Student details in a comma-delimited string

    e.g. Donald Duck, 123, 1234567890, donald@duck.com, 0.00

The Student records are managed by the StudentManager class, which holds the main() loop.

StudentManager
- studentList:Student[10]
* getStudentInput:Student
* sortByRollNumber:Student[]
* sortByAttendance:Student[]
* printAttendanceReport(filename, sortBy:bool) : bool

The function printAttendanceReport outputs the list of students to a user-specified filename. If sortBy is true, the student list will be sorted by roll number, else the student list will be sorted by attendance (followed by roll number).

Provide the following user menu:

  1. Enter Student Details
  2. Update Student Mobile Number
  3. Update Student Email Address
  4. Print Attendance Report by Roll Number
  5. Print Attendance Report by Attendance
  6. Exit

Solution:


#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>

class Student
{
private:
    std::string name;
    int rollNumber;

public:
    long mobileNumber;
    std::string emailAddress;
    double attendance;

    Student();
    ~Student();
    std::string getName();
    int getRollNumber();
    void setName(std::string);
    void setRollNumber(int);
    std::string print();
};

Student::Student()
{
    this->name = "";
    this->rollNumber = 0;
    this->mobileNumber = 0;
    this->emailAddress = "";
    this->attendance = 0;
}

Student::~Student()
{
}

std::string Student::getName()
{
    return name;
}

int Student::getRollNumber()
{
    return rollNumber;
}

void Student::setName(std::string name)
{
    this->name = name;
}

void Student::setRollNumber(int rollNumber)
{
    this->rollNumber = rollNumber;
}

std::string Student::print()
{
    std::stringstream ps;
    ps << name << "," << rollNumber << "," << mobileNumber << "," << emailAddress << "," << attendance;
    return ps.str();
}

class StudentManager
{
private:
    std::vector<Student> studentList;

public:
    StudentManager();
    ~StudentManager();
    Student getStudentInput();
    void addStudent(Student);
    bool isEmpty();
    Student getStudent(int);
    bool setStudent(int, Student);
    std::vector<Student> sortByRollNumber();
    std::vector<Student> sortByAttendance();
    bool printAttendanceReport(std::string, bool);
};

StudentManager::StudentManager()
{
}

StudentManager::~StudentManager()
{
}

void StudentManager::addStudent(Student student)
{
    studentList.push_back(student);
}

Student StudentManager::getStudent(int rollno)
{
    for (int i = 0; i < studentList.size(); i++)
    {
        if (studentList[i].getRollNumber() == rollno)
        {
            return studentList[i];
        }
    }
    return Student();
}

bool StudentManager::setStudent(int rollno, Student student)
{
    for (int i = 0; i < studentList.size(); i++)
    {
        if (studentList[i].getRollNumber() == rollno)
        {
            studentList[i] = student;
            return true;
        }
    }
    return false;
}

bool StudentManager::isEmpty()
{
    return studentList.empty();
}

Student StudentManager::getStudentInput()
{
    Student student;
    std::string name;
    int rollNumber;
    long mobileNumber;
    std::string emailAddress;
    double attendance;
    std::cout << "Enter name: ";
    std::cin.ignore();
    std::getline(std::cin, name);
    std::cout << "Enter roll number: ";
    std::cin >> rollNumber;
    std::cout << "Enter mobile number: ";
    std::cin >> mobileNumber;
    std::cout << "Enter email address: ";
    std::cin.ignore();
    std::cin >> emailAddress;
    std::cout << "Enter attendance: ";
    std::cin >> attendance;
    student.setName(name);
    student.setRollNumber(rollNumber);
    student.mobileNumber = mobileNumber;
    student.emailAddress = emailAddress;
    student.attendance = attendance;
    return student;
}

std::vector<Student> StudentManager::sortByRollNumber()
{
    int N = this->studentList.size();
    std::vector<Student> studentList(N);
    for (int i = 0; i < N; i++)
    {
        studentList[i] = this->studentList[i];
    }
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N - i - 1; j++)
        {
            if (studentList[j].getRollNumber() > studentList[j + 1].getRollNumber())
            {
                std::swap(studentList[j], studentList[j + 1]);
            }
        }
    }
    return studentList;
}

std::vector<Student> StudentManager::sortByAttendance()
{
    int N = this->studentList.size();
    std::vector<Student> studentList(N);
    for (int i = 0; i < N; i++)
    {
        studentList[i] = this->studentList[i];
    }
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N - i - 1; j++)
        {
            if (studentList[j].attendance > studentList[j + 1].attendance)
            {
                std::swap(studentList[j], studentList[j + 1]);
            }
            else if ((studentList[j].attendance == studentList[j + 1].attendance) && (studentList[j].getRollNumber() > studentList[j + 1].getRollNumber()))
            {
                std::swap(studentList[j], studentList[j + 1]);
            }
        }
    }
    return studentList;
}

bool StudentManager::printAttendanceReport(std::string filename, bool sortBy)
{
    std::ofstream report;
    report.open(filename);

    std::vector<Student> studentList;

    if (sortBy)
    {
        studentList = sortByRollNumber();
    }
    else
    {
        studentList = sortByAttendance();
    }

    for (Student stud : studentList)
    {
        report << stud.print() << std::endl;
    }

    report.close();

    return true;
}

int main(int argc, char const *argv[])
{
    StudentManager mngr;
    int ch = 0;
    int rollNumber;
    Student stud;
    std::string filename;

    while (ch != 5)
    {
        std::cout << "n======Student Manager======" << std::endl;
        std::cout << "0.  Enter Student Detailsn"
                  << "1.  Update Student Mobile Numbern"
                  << "2.  Update Student Email Addressn"
                  << "3.  Print Attendance Report by Roll Numbern"
                  << "4.  Print Attendance Report by Attendancen"
                  << "5.  Exitn"
                  << std::endl;
        std::cout << "Enter your choice: ";
        std::cin >> ch;

        switch (ch)
        {
        case 0:
            mngr.addStudent(mngr.getStudentInput());
            break;
        case 1:
            if (mngr.isEmpty())
            {
                std::cout << "No students entered yet"
                          << std::endl;
                break;
            }
            std::cout << "Enter roll number: ";
            std::cin >> rollNumber;
            stud = mngr.getStudent(rollNumber);
            if (stud.getRollNumber() == 0)
            {
                std::cout << "Student not found"
                          << std::endl;
                break;
            }
            std::cout << "Enter Mobile number: ";
            std::cin >> stud.mobileNumber;
            mngr.setStudent(rollNumber, stud);
            break;
        case 2:
            if (mngr.isEmpty())
            {
                std::cout << "No students entered yet"
                          << std::endl;
                break;
            }
            std::cout << "Enter roll number: ";
            std::cin >> rollNumber;
            stud = mngr.getStudent(rollNumber);
            if (stud.getRollNumber() == 0)
            {
                std::cout << "Student not found"
                          << std::endl;
                break;
            }
            std::cout << "Enter Email address: ";
            std::cin.ignore();
            std::cin >> stud.emailAddress;
            mngr.setStudent(rollNumber, stud);
            break;

        case 3:
            if (mngr.isEmpty())
            {
                std::cout << "No students entered yet"
                          << std::endl;
                break;
            }

            std::cout << "Enter filename: ";
            std::cin.ignore();
            std::getline(std::cin, filename);
            mngr.printAttendanceReport(filename, true);
            break;

        case 4:
            if (mngr.isEmpty())
            {
                std::cout << "No students entered yet"
                          << std::endl;
                break;
            }

            std::cout << "Enter filename: ";
            std::cin.ignore();
            std::getline(std::cin, filename);
            mngr.printAttendanceReport(filename, false);
            break;

        case 5:
            std::cout << "Exiting..." << std::endl;
            break;

        default:
            std::cout << "Invalid choice" << std::endl;
            break;
        }
    }

    return 0;
}

Output:


    ======Student Manager======
    0.  Enter Student Details
    1.  Update Student Mobile Number
    2.  Update Student Email Address
    3.  Print Attendance Report by Roll Number
    4.  Print Attendance Report by Attendance
    5.  Exit
    
    Enter your choice: 0
    Enter name: Bhola
    Enter roll number: 45
    Enter mobile number: 32
    Enter email address: bholaeatschola@gmail.com
    Enter attendance: 78
    
    ======Student Manager======
    0.  Enter Student Details
    1.  Update Student Mobile Number
    2.  Update Student Email Address
    3.  Print Attendance Report by Roll Number
    4.  Print Attendance Report by Attendance
    5.  Exit
    
    Enter your choice: 3
    Enter filename: report
    
    ======Student Manager======
    0.  Enter Student Details
    1.  Update Student Mobile Number
    2.  Update Student Email Address
    3.  Print Attendance Report by Roll Number
    4.  Print Attendance Report by Attendance
    5.  Exit
    
    Enter your choice: 5
    Exiting...

File Contents:

Bhola,45,32,bholaeatschola@gmail.com,78
Share: