المپدیا

دانش‌نامه‌ی المپیاد کامپیوتر ایران

ابزار کاربر

ابزار سایت


سوالات المپیاد:دوره‌ی تابستان:دوره‌ی ۱۹:برنامه‌نویسی:سوال ۹

سوال ۹

تکه کد زیر را در نظر بگیرید:

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
using namespace std;
 
struct Point{ double x, y; };
struct Line { Point p[2]; };
 
vector<Line> polygon;
vector<int> vint;
map<string, int> mymap;
pair<int, int> pii;
vector<pair<int, int> > myv;
 
int main() {
  char c, s[10];
  int x; 	
  long long m;
  string str;
 
  /* code here! */
 
  return 0;
}

قرار است هر کدام از شبه‌کد های زیر را در قسمت مشخص شده ‎(/ * code here! * /)‎ قرار داده و تا جای ممکن به جواب برسیم. به‌طور دقیق‌تر، برای هر یک از کدهایی زیر

  • در صورتی که کد کامپایل نمی‌شود، محل و علّت خطای کامپایل (Compilation Error) را مشخّص کرده و معلوم کنید که چگونه باید این خطا را رفع کرد.
  • سپس (بعد از رفع خطای کامپایل در صورت موجود) اگر برنامه در هنگام اجرا دچار خطای زمان اجرا (Runtime Error‎) می‌شود، محل و علّت آن خطا را مشخّص کرده و مشخّص کنید که چگونه می‌توان از این خطا اجتناب کرد.
  • در غیر این صورت اگر برنامه به‌درستی کامپایل می‌شود اما به هر دلیلی (اعم از پایان نپذیرفتن به‌خاطر افتادن در حلقه‌ی نامتناهی، فرمت اشتباه خروجی و ‎غیره‎ خواسته‌ی برنامه‌نویس را برآورده نمی‌کند، این مورد را به همراه محل و علّت دقیق و نحوه‌ی رفع مشکل بنویسید.
  • سپس (بعد از رفع اشکال اجرایی) اگر برنامه ناکارآمد است (برای مثال، پیچیدگی زمانی آن به سادگی قابل کاهش است)، با ذکر نحوه‌ی بهبود کد به این مهم اشاره کنید.
  • نهایتاً مقدار متغیرها در هر خط از اجرای برنامه و خروجی برنامه را نیز تا حد امکان با ذکر دلیل بنویسید.

کد شماره یک

 char ns[] = "chituz";
 int lb = lower_bound(ns, ns+strlen(ns), 'a') - ns;
 int me = min_element(ns, ns+string(ns).length()) - ns;
 cout << lb << " " <<  me << endl;

کد شماره دو

  for (int i=0; i<20; i++)
    myv.push_back(make_pair(2*i,2*i+1));
  pii = *lower_bound(myv.begin(), myv.end(), 
		     make_pair(11,12));
  cout << pii.second << endl;

کد شماره سه

  Point p; p.x = p.y = 020/0.2;
  Line line; line.p[0] = p; p.x++; line.p[1] = p;
  polygon.push_back(line); 
  polygon.resize(10);
  cout << polygon.begin()->p[1].x << endl;

کد شماره چهار

  strcpy(s, '010101010');
  int i = 0, j = 0;
  do {
    x = s[i] + 0XFF;
    c = ++x;
    s[i++] = c;
    j += 1 && str[i] ^ str[i+1];
  } while (j < 5)
  cout << s << endl;

کد شماره پنج

  m = 0;
  x = (int)&m; 
  for (int i=0; i<8; i++)
    m = (m << 8) + 120 + i;
  x = (int)*(char *)x;
  cout << (x & 254)  << endl;

کد شماره شش

x = 0;      
strcpy(s,"1234567890");
for (c = s[8]; c != 0; c++)
	x += c;
cout << x << endl;
for (c = s[8]; c != '0'; c++)
	x += c;
cout << x << endl;

ابزار صفحه