رفتن به محتوا

جلسه هشتم

دوره

پوینتر و متغیر ها؟

پوینتر و آرایه ها؟

مسائل

۱. عملیات اشاره‌گر و آرایه‌های دو بعدی

یک تابع بنویسید که دو آرایه دو بعدی (ماتریس) از نوع int را به عنوان ورودی بگیرد و حاصل‌ضرب دو ماتریس را با استفاده از اشاره‌گرها محاسبه کند. برای ساده‌سازی، فرض کنید که ابعاد ماتریس‌ها ۳x۳ هستند.

ورودی نمونه:

int A[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int B[3][3] = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}};

خروجی نمونه:

int Result[3][3] = {{30, 24, 18}, {84, 69, 54}, {138, 114, 90}};

۲. جابجایی پوینترها و محاسبات حافظه

یک تابع بنویسید که به عنوان ورودی، دو اشاره‌گر به دو آرایه از نوع int دریافت کند. این تابع باید مقادیر موجود در آرایه اول را با استفاده از عملیات اشاره‌گر به آرایه دوم منتقل کند، به طوری که آرایه دوم تمام مقادیر آرایه اول را داشته باشد. همچنین بعد از انجام این عملیات، ابتدا مقادیر آرایه دوم و سپس مقادیر آرایه اول را چاپ کنید.

ورودی نمونه:

int arr1[3] = {1, 2, 3};
int arr2[3] = {0, 0, 0};

خروجی نمونه:

Array 2: {1, 2, 3}
Array 1: {0, 0, 0}

۳. عملیات آرایه‌ای و اشاره‌گرها

یک تابع بنویسید که دو آرایه از نوع int به عنوان ورودی بگیرد و تمام مقادیر موجود در آرایه اول را در آرایه دوم کپی کند. از اشاره‌گر برای این عملیات استفاده کنید. سپس مجموع مقادیر آرایه دوم را محاسبه و چاپ کنید.

ورودی نمونه:

int arr1[3] = {4, 5, 6};
int arr2[3] = {0, 0, 0};

خروجی نمونه:

Array 2: {4, 5, 6}
Sum of Array 2: 15

۴. پیدا کردن بزرگترین و کوچکترین عنصر در آرایه

یک تابع بنویسید که از طریق اشاره‌گر، بزرگترین و کوچکترین عنصر موجود در یک آرایه از نوع int را پیدا کند و آن‌ها را چاپ کند.

ورودی نمونه:

int arr[5] = {12, 3, 45, 6, 7};

خروجی نمونه:

Max: 45
Min: 3

۵. خرگوش کنجکاو

شما یک بلوک حافظه پیوسته از اعداد صحیح دارید که با یک اشاره‌گر به آن دسترسی دارید. در ابتدا، اشاره‌گر شما به اولین عدد اشاره می‌کند و مقدار هر خانه حافظه نشان‌دهنده حداکثر تعداد خانه‌هایی است که می‌توانید اشاره‌گر را به جلو حرکت دهید. هدف این است که مشخص کنید آیا می‌توانید اشاره‌گر را به آخرین خانه حافظه برسانید یا خیر.

برای اطمینان از استفاده صحیح از اشاره‌گرها، باید موارد زیر را در خروجی چاپ کنید:

  1. آدرس اشاره‌گر اولیه
  2. در هر حرکت:
    • آدرس فعلی اشاره‌گر
    • مقدار خانه فعلی
    • آدرس خانه مقصد (بعد از پرش)
  3. آدرس اشاره‌گر نهایی
  4. در نهایت، اگر به آخرین خانه رسیدید true و در غیر این صورت false را چاپ کنید.

ورودی نمونه:

int arr[5] = {2, 3, 1, 1, 4};

خروجی نمونه:

Initial pointer: 0x64248785e2c0
Current: 0x64248785e2c0 (value: 2) -> Jump to: 0x64248785e2c8
Current: 0x64248785e2c8 (value: 3) -> Jump to: 0x64248785e2cc
Current: 0x64248785e2cc (value: 1) -> Jump to: 0x64248785e2d0
Final pointer: 0x64248785e2d0
true

۶. کار با رشته (string)

یک ساختار داده‌ای بنویسید که یک رشته (String) را از یک آرایه ثابت char ذخیره کند و از اشاره‌گرها برای عملیات مختلف روی رشته استفاده کنید. این ساختار باید از طریق توابعی که خود شما پیاده‌سازی می‌کنید، قابلیت‌های زیر را داشته باشد:

  1. تابع str_copy: یک رشته جدید ایجاد کند و محتوای رشته اصلی را به آن کپی کند.
  2. تابع str_concat: دو رشته را به هم متصل کرده و یک رشته جدید برگرداند.
  3. تابع str_find_substring: جستجوی یک زیررشته در رشته اصلی (با استفاده از اشاره‌گرها).
  4. تابع str_delete_char: یکی از کاراکترهای رشته را بر اساس موقعیت حذف کند.
  5. تابع str_reverse: رشته را معکوس کند.

ورودی نمونه:

char str1[] = "hello";
char str2[] = "world";

خروجی نمونه:

Copy: hello
Concat: helloworld
Find 'lo': true
Delete char at 1: hllo
Reverse: olleh

تیم تدریس‌یاران درس - © ۱۴۰۳