مبانی برنامه نویسی
774 subscribers
4 photos
1 link
اگه سوالی بود یا مشکلی وجود داشت میتونید با آیدی زیر ارتباط بگیرید بتونم و بدونم حتما جواب میدم .موفق باشید.
@mohammadf111
Download Telegram
#آموزش
شماره : 10
عنوان : Call by Reference و Call by Value
توضیح : در برنامه نویسی، منظور از Call by Reference و Call by Value روش‌هایی هستند که برای انتقال داده ها بین توابع و روال‌ها استفاده می‌شوند.

1. Call by Value: در این روش، مقدار متغیر به تابع منتقل می شود، بنابراین هر تغییری که در متغیر در داخل تابع اعمال شود، بر روی متغیر اصلی در تابع فراخواننده (کالر) تأثیری ندارد. به عبارت دیگر، تغییرات متغیر درون تابع فقط در دامنه محلی تابع هستند و بر عنصر بر جایی در حافظه شبیه متغیر خارج از تابع اثر نمی‌گذارد.

2. Call by Reference: در این روش، یک ارجاع به متغیر به تابع منتقل می شود، بنابراین هر تغییری که در متغیر در داخل تابع اعمال شود، بر روی متغیر اصلی در تابع فراخواننده تأثیر می‌گذارد.

به عبارت ساده تر، Call by Value به معنی کپی کردن مقدار یک متغیر به محل دیگری است و Call by Reference به اشاره به محل اصلی مقدار متغیر در حافظه است.
در زبان #c:
در زبان C، می‌توانید توابع را به دو روش "با ارجاع" (Call by Reference) و "با مقدار" (Call by Value) فراخوانی کنید.

### Call by Reference (با ارجاع):

در این روش، به جای ارسال کپی از مقدار، مقدار اصلی به تابع ارسال می‌شود و تابع می‌تواند مقدار آن را تغییر دهد. برای این کار از اشاره‌گرها استفاده می‌شود.
مثال:
#include <stdio.h>

// تابع با ارجاع
void increment(int *num) {
(*num)++; // افزایش مقدار عددی به عنوان ارجاع
}

int main() {
int x = 10;
printf("Before increment: %d\n", x); // چاپ مقدار x قبل از افزایش
increment(&x); // فراخوانی تابع با ارجاع
printf("After increment: %d\n", x); // چاپ مقدار x پس از افزایش
return 0;
}

خروجی:
Before increment: 10
After increment: 11

### Call by Value (با مقدار):
در این روش، فقط یک کپی از مقدار به تابع ارسال می‌شود و تغییراتی که در داخل تابع اعمال می‌شوند، بر روی متغیر اصلی تأثیری ندارند. مثال:
#include <stdio.h>

// تابع با مقدار
void increment(int num) {
num++; // افزایش مقدار عددی
}

int main() {
int x = 10;
printf("Before increment: %d\n", x); // چاپ مقدار x قبل از افزایش
increment(x); // فراخوانی تابع با مقدار
printf("After increment: %d\n", x); // چاپ مقدار x پس از افزایش
return 0;
}


خروجی:
Before increment: 10
After increment: 10

در هر دو مثال، تابع increment یک عدد را دریافت می‌کند و آن را افزایش می‌دهد. اما در مثال اول (با ارجاع)، تغییرات در متغیر اصلی (در تابع main) نیز تأثیر می‌گذارند، در حالی که در مثال دوم (با مقدار)، تغییرات تنها در داخل تابع اعمال می‌شوند و متغیر اصلی تغییر نمی‌کند.
👍1
در زبان #cpp :
در زبان C++، مفهوم "Call by Reference" و "Call by Value" همچنان وجود دارد. با Reference، متغیرها به توابع منتقل می‌شوند، در حالی که با Value، مقادیر کپی از متغیرها به توابع منتقل می‌شوند.

### Call by Reference (با ارجاع):
در این روش، آرگومان‌ها به تابع ارسال می‌شوند و از طریق آن‌ها، می‌توان به مقادیر اصلی متغیرها دسترسی داشت.

#include <iostream>

using namespace std;

// تابع با ارجاع
void increment(int &num) {
num++; // افزایش مقدار عددی با ارجاع
}

int main() {
int x = 10;
cout << "Before increment: " << x << endl; // چاپ مقدار x قبل از افزایش
increment(x); // فراخوانی تابع با ارجاع
cout << "After increment: " << x << endl; // چاپ مقدار x پس از افزایش
return 0;
}

خروجی:
Before increment: 10
After increment: 11


در اینجا، تابع increment یک مقدار عددی را به عنوان ارجاع دریافت می‌کند و مقدار آن را یک واحد افزایش می‌دهد.

### Call by Value (با مقدار):
در این روش، کپی از مقادیر متغیرها به توابع منتقل می‌شوند، بنابراین تغییراتی که در تابع انجام می‌شود، تنها در دامنه آن تابع باقی می‌ماند و بر روی متغیر اصلی تاثیری ندارد.

#include <iostream>

using namespace std;

// تابع با مقدار
void increment(int num) {
num++; // افزایش مقدار عددی
}

int main() {
int x = 10;
cout << "Before increment: " << x << endl; // چاپ مقدار x قبل از افزایش
increment(x); // فراخوانی تابع با مقدار
cout << "After increment: " << x << endl; // چاپ مقدار x پس از افزایش
return 0;
}

خروجی:
Before increment: 10
After increment: 10


در اینجا، تغییراتی که در تابع increment اعمال می‌شود، تنها بر روی مقدار کپی شده از متغیر x تاثیر می‌گذارد و متغیر اصلی x تغییر نمی‌کند.
👍2
در زبان #python :
در واقع در زبان پایتون، مفهوم تقسیم بر اساس "Call by Value" و "Call by Reference" وجود ندارد، بلکه تمام انتقال‌های پارامترها بر اساس "Call by Object Reference" انجام می‌شود. با این حال، می‌توان به این تفاوت‌ها در رفتار بین اشیاء mutable و immutable در پایتون اشاره کرد.

### مثال:

#### Call by Object Reference برای شیء mutable:

def increment(num_list):
num_list.append(4)

my_list = [1, 2, 3]
print("Before increment:", my_list)
increment(my_list)
print("After increment:", my_list)


Output:
Before increment: [1, 2, 3]
After increment: [1, 2, 3, 4]


در اینجا، لیست my_list به تابع increment با ارجاع فرستاده می‌شود. تغییری که در داخل تابع اعمال می‌شود (افزودن عدد 4 به لیست) باعث می‌شود که تغییرات در متغیر اصلی my_list نیز دیده شود.

#### Call by Object Reference برای شیء immutable:

def change_num(num):
num += 10

my_num = 5
print("Before change:", my_num)
change_num(my_num)
print("After change:", my_num)


Output:
Before change: 5
After change: 5


در اینجا، عدد my_num به تابع change_num با ارجاع فرستاده می‌شود، اما چون اعداد در پایتون immutable هستند، هیچ تغییری در متغیر اصلی اعمال نمی‌شود.
👍2
#آموزش
شماره : 11
عنوان : پوینتر (Pointer)
توضیح :پوینتر (Pointer) در برنامه‌نویسی یک متغیر است که آدرس حافظه یا مکانیزمی برای دسترسی به حافظه را نشان می‌دهد. از پوینترها برای مدیریت و کنترل حافظه و دسترسی به داده‌ها استفاده می‌شود. در زیر توضیحاتی در مورد پوینترها در برنامه‌نویسی آورده شده است:

1. آدرس حافظه: پوینتر، آدرس حافظه را نشان می‌دهد. این آدرس می‌تواند به یک متغیر، آرایه یا ساختار اشاره کند.

2. عملگرهای پوینتر: عملگرهایی مانند * و & برای عملیات روی پوینترها استفاده می‌شوند. * برای دسترسی به مقداری که پوینتر به آن اشاره می‌کند و & برای دریافت آدرس یک متغیر استفاده می‌شود.

3. تخصیص حافظه با استفاده از پوینتر: با استفاده از پوینترها می‌توانید حافظه‌ای را به صورت دستی تخصیص دهید، به عنوان مثال با استفاده از عملگر new در C++.

4. انتقال پوینتر: پوینترها به عنوان آرگومان‌های تابع و بازگشتی‌ها استفاده می‌شوند. این به برنامه‌نویس امکان می‌دهد تا به طور مستقیم با حافظه و داده‌ها در برنامه تعامل کند.

5. پوینترها و آرایه‌ها: در برنامه‌نویسی، آرایه‌ها به طور ضمنی به یک پوینتر به اولین عنصر آرایه تبدیل می‌شوند.

6. پوینترها و ساختارها: با استفاده از پوینترها می‌توانید به صورت مستقیم به عناصر ساختارها دسترسی پیدا کنید.

استفاده صحیح از پوینترها در برنامه‌نویسی می‌تواند به شما امکان کنترل دقیق‌تری بر روی حافظه و داده‌ها را بدهد و کارایی برنامه را افزایش دهد. با این حال، نادرست استفاده از پوینترها می‌تواند منجر به خطاهایی مانند خطای حافظه (Memory Error) و دسترسی به حافظه نامعتبر (Invalid Memory Access) شود. بنابراین، باید با دقت و به دقت از پوینترها استفاده کرد و از مشکلات مربوط به آن‌ها جلوگیری کرد
در زبان #c:
در زبان C، پوینترها ابزاری قدرتمند برای کنترل و مدیریت حافظه هستند. پوینترها به شما امکان می‌دهند به طور مستقیم با حافظه و داده‌ها در برنامه تعامل کنید. در زیر توضیحی در مورد پوینترها در زبان C آورده شده است همراه با مثال‌هایی:

1. تعریف پوینتر:
برای تعریف یک پوینتر در C، از علامت * استفاده می‌شود. برای مثال:
   int *ptr;

در این مثال، ptr یک پوینتر به یک متغیر از نوع int است.

2. مقداردهی به پوینتر:
برای مقداردهی به یک پوینتر، می‌توان از عملگر & برای گرفتن آدرس متغیر استفاده کرد. برای مثال:
   int num = 10;
int *ptr = &num;

در این مثال، ptr به آدرس متغیر num اشاره می‌کند.

3. دسترسی به مقدار اشاره شده توسط پوینتر:
برای دسترسی به مقداری که پوینتر به آن اشاره می‌کند، از عملگر * استفاده می‌شود. برای مثال:
   int num = 10;
int *ptr = &num;
printf("Value: %dn", *ptr);

در این مثال، *ptr مقداری که پوینتر ptr به آن اشاره می‌کند (مقدار num) را چاپ می‌کند.

4. پوینترها و آرایه‌ها:
در C، آرایه‌ها به طور ضمنی به یک پوینتر به اولین عنصر آرایه تبدیل می‌شوند. برای مثال:
   int arr[5] = {1, 2, 3, 4, 5};
int *ptr = arr; // یا int *ptr = &arr[0];
printf("First element: %dn", *ptr); // چاپ عنصر اول آرایه

در این مثال، ptr به اولین عنصر آرایه arr اشاره می‌کند.

5. پوینترها و ساختارها:
با استفاده از پوینترها، می‌توانید به صورت مستقیم به عناصر ساختارها دسترسی پیدا کنید. برای مثال:
   struct Person {
char name[20];
int age;
};
struct Person person;
struct Person *ptr = &person;

در این مثال، ptr یک پوینتر به ساختار Person است و می‌توانید با استفاده از ptr به صورت مستقیم به عناصر ساختار دسترسی پیدا کنید.
👍1
در زبان #cpp:
در زبان C++ نیز پوینترها همانند زبان C تعریف و استفاده می‌شوند. اما در زبان C++، به علاوه از قابلیت‌هایی مانند پوینترهای به همراه نوع (type-safe pointers) و پوینترهای هوشمند (smart pointers) نیز استفاده می‌شود. در زیر توضیحاتی درباره پوینترها در زبان C++ آورده شده است همراه با مثال‌هایی:

1. تعریف پوینتر:
برای تعریف یک پوینتر در C++، از علامت * استفاده می‌شود. برای مثال:
   int* ptr;

در این مثال، ptr یک پوینتر به یک متغیر از نوع int است.

2. مقداردهی به پوینتر:
برای مقداردهی به یک پوینتر، می‌توان از عملگر & برای گرفتن آدرس متغیر استفاده کرد. برای مثال:
   int num = 10;
int* ptr = &num;

در این مثال، ptr به آدرس متغیر num اشاره می‌کند.

3. دسترسی به مقدار اشاره شده توسط پوینتر:
برای دسترسی به مقداری که پوینتر به آن اشاره می‌کند، از عملگر * استفاده می‌شود. برای مثال:
   int num = 10;
int* ptr = &num;
cout << "Value: " << *ptr << endl;

در این مثال، *ptr مقداری که پوینتر ptr به آن اشاره می‌کند (مقدار num) را چاپ می‌کند.

4. پوینترها و آرایه‌ها:
در C++، آرایه‌ها به طور ضمنی به یک پوینتر به اولین عنصر آرایه تبدیل می‌شوند. برای مثال:
   int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr; // یا int* ptr = &arr[0];
cout << "First element: " << *ptr << endl; // چاپ عنصر اول آرایه

در این مثال، ptr به اولین عنصر آرایه arr اشاره می‌کند.

5. پوینترها و ساختارها:
در C++، می‌توانید با استفاده از پوینترها به صورت مستقیم به عناصر ساختارها دسترسی پیدا کنید. برای مثال:
   struct Person {
string name;
int age;
};
Person person;
Person* ptr = &person;
ptr->name = "John";
ptr->age = 25;

در این مثال، ptr یک پوینتر به ساختار Person است و می‌توانید با استفاده از ptr به صورت مستقیم به عناصر ساختار دسترسی پیدا کنید..
👍3
در زبان #python:
زبان برنامه‌نویسی پایتون از مفهوم "پوینتر" به طور مستقیم پشتیبانی نمی‌کند.
سلام وقت بخیر
امیدوارم که امتحانات رو به خوبی پشت سر گذاشته باشید
این چند روز بخاطر کار و امتحانات درگیرم و امکان پاسخگویی ندارم
چون یخرده پیام ها زیاده گفتم شرمندتون نشم
ولی اگر قولی دادم یادآوری کنید.

انشالله همگی موفق باشید ❤️
17👍4👎1
Benshin Tamashayat Konam
Arman Garshasbi
#متفرقه
عمری به هر کوی و گذر گشتم که پیدایت کنم
اکنون که پیدا کرده ام بنشین تماشایت کنم
8👍1😴1
سلام وقتتون بخیر.
قراره چند تا کانال دیگه رو شروع کنم و هر موقع وقت کردم آپدیت کنم و با هم پیش بریم.
به هر کدوم از موضوعات علاقه داشتید لینکش زیر هست .
این کانال هم بزودی آپدیت میشه.
سپاس❤️

بلاکچین
https://t.me/learn_blockchaing_channel

جاوااسکریپت
https://t.me/learn_js_chanel

تایپ اسکریپت
https://t.me/learn_typescript_channel

گیت
https://t.me/learn_git_channel
7👍3❤‍🔥1
#کد 18
سطح: متوسط
سوال :برنامه ای بنویسید که ۱۵ عدد از ورودی بگیرد و به صورت نزولی مرتب کند (‌ الگوریتم بابل سورت)

ورودی و خروجی نمونه :
ورودی نمونه ۱:
Enter 15 numbers: 1 2 2 3 4 5 2 12 3 4 21 3 4 12 1

خروجی نمونه ۱ :
Sorted array in descending order: 21 12 12 5 4 4 4 3 3 3 2 2 2 1 1


موارد استفاده شده‌ در حل سوال: آرایه / تابع

توضیح کد :
. تابع bubbleSortDescending تعریف شده است. این تابع عملیات مرتب‌سازی بابل را انجام می‌دهد. ورودی‌های این تابع شامل آرایه‌ای از اعداد صحیح (int arr[]) و تعداد عناصر آرایه (int n) است.
- متغیر swapped از نوع bool برای ذخیره وضعیت انجام عملیات جابجایی عناصر در هر گذر مورد استفاده قرار می‌گیرد.
- حلقه خارجی (for i) در هر گذر، از ابتدای آرایه شروع شده و به سمت انتها حرکت می‌کند.
- حلقه داخلی (for j) از ابتدای آرایه شروع شده و تا آخرین عنصر قبل از i در هر گذر حرکت می‌کند.
- در هر گذر اگر عنصر فعلی کوچکتر از عنصر بعدی باشد، انجام می‌شود:
- عناصر جابجا می‌شوند.
- متغیر swapped به true تغییر می‌کند.
- اگر در هر گذر هیچ جابجایی صورت نگرفته باشد، حلقه متوقف می‌شود.

. در تابع main:
- ثابت SIZE برابر با تعداد عناصر آرایه تعریف شده است.
- یک آرایه به نام arr از نوع int با اندازه SIZE تعریف شده است.
- با استفاده از حلقه for، عناصر آرایه از ورودی کاربر دریافت می‌شوند.
- سپس تابع bubbleSortDescending فراخوانی می‌شود تا آرایه را به صورت نزولی مرتب کند.
- در نهایت، آرایه مرتب‌شده چاپ می‌شود.
👍51🔥1
#include <stdio.h>
#include <stdbool.h>

// تابع مرتب‌سازی بابل برای مرتب‌سازی نزولی آرایه
void bubbleSortDescending(int arr[], int n) {
bool swapped;
// حلقه خارجی برای هر عنصر در آرایه
for (int i = 0; i < n-1; i++) {
swapped = false;
// حلقه داخلی برای مقایسه و جابجایی عناصر
for (int j = 0; j < n-i-1; j++) {
// اگر عنصر فعلی کوچکتر از عنصر بعدی است، جابجا می‌شوند
if (arr[j] < arr[j+1]) {
// جابجایی عناصر
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
swapped = true;
}
}
// اگر در این گذر هیچ جابجایی‌ای صورت نگرفته، حلقه متوقف می‌شود
if (swapped == false)
break;
}
}

int main() {
const int SIZE = 15; // تعداد عناصر آرایه
int arr[SIZE]; // تعریف آرایه‌ای با ۱۵ عنصر

// دریافت ۱۵ عدد از ورودی کاربر
printf("Enter 15 numbers: ");
for (int i = 0; i < SIZE; i++) {
scanf("%d", &arr[i]);
}

// مرتب‌سازی آرایه به صورت نزولی با استفاده از مرتب‌سازی بابل
bubbleSortDescending(arr, SIZE);

// چاپ آرایه مرتب‌شده
printf("Sorted array in descending order: ");
for (int i = 0; i < SIZE; i++) {
printf("%d ", arr[i]);
}

return 0;
}

زبان برنامه نویسی :#c
#include <iostream>

using namespace std;

// تابع مرتب‌سازی بابل برای مرتب‌سازی نزولی آرایه
void bubbleSortDescending(int arr[], int n) {
bool swapped;
// حلقه خارجی برای هر عنصر در آرایه
for (int i = 0; i < n-1; i++) {
swapped = false;
// حلقه داخلی برای مقایسه و جابجایی عناصر
for (int j = 0; j < n-i-1; j++) {
// اگر عنصر فعلی کوچکتر از عنصر بعدی است، جابجا می‌شوند
if (arr[j] < arr[j+1]) {
// جابجایی عناصر
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
swapped = true;
}
}
// اگر در این گذر هیچ جابجایی‌ای صورت نگرفته، حلقه متوقف می‌شود
if (swapped == false)
break;
}
}

int main() {
const int SIZE = 15; // تعداد عناصر آرایه
int arr[SIZE]; // تعریف آرایه‌ای با ۱۵ عنصر

// دریافت ۱۵ عدد از ورودی کاربر
cout << "Enter 15 numbers: ";
for (int i = 0; i < SIZE; i++) {
cin >> arr[i];
}

// مرتب‌سازی آرایه به صورت نزولی با استفاده از مرتب‌سازی بابل
bubbleSortDescending(arr, SIZE);

// چاپ آرایه مرتب‌شده
cout << "Sorted array in descending order: ";
for (int i = 0; i < SIZE; i++) {
cout << arr[i] << " ";
}

return 0;
}

زبان برنامه نویسی :#cpp
1
def bubbleSortDescending(arr):
n = len(arr)
# حلقه خارجی برای هر عنصر در آرایه
for i in range(n-1):
swapped = False
# حلقه داخلی برای مقایسه و جابجایی عناصر
for j in range(n-1-i):
# اگر عنصر فعلی کوچکتر از عنصر بعدی است، جابجا می‌شوند
if arr[j] < arr[j+1]:
# جابجایی عناصر
arr[j], arr[j+1] = arr[j+1], arr[j]
swapped = True
# اگر در این گذر هیچ جابجایی‌ای صورت نگرفته، حلقه متوقف می‌شود
if not swapped:
break

SIZE = 15 # تعداد عناصر آرایه
arr = [] # تعریف آرایه‌ای با ۱۵ عنصر

# دریافت ۱۵ عدد از ورودی کاربر
print("Enter 15 numbers: ")
for _ in range(SIZE):
num = int(input())
arr.append(num)

# مرتب‌سازی آرایه به صورت نزولی با استفاده از مرتب‌سازی بابل
bubbleSortDescending(arr)

زبان برنامه نویسی :#python
4👍2
سلام وقت همگی بخیر
برای اطلاع دوستانی که جدید عضو شدن
با استفاده از #کد و #cpp و #c و #python و #آموزش و #کوییز و #ابزار و #متفرقه میتونید بخش مربوطه رو مطالعه کنید.

اگه سوالی بود یا مشکلی وجود داشت میتونید با آیدی زیر ارتباط بگیرید بتونم و بدونم حتما جواب میدم .موفق باشید❤️.
@mohammadf111
17👍2
سلام وقت همگی بخیر.
من تصمیم داشتم یک کلاس برای برنامه نویسی پایه شروع کنم و اگه خوب پیش رفت برنامه نویسی سطح بالاتر هم تدریس بشه.

میخواستم بدونم چند نفر تمایل به شرکت در این کلاس رو دارند.
لطفا اگه میخواید شرکت کنید این پیام رو لایک کنید تا یک آماری داشته باشیم.


ممنون 🙏
👍80👎6
با سلام خدمت دوستان
کدام زبان مایلید تدریس شود؟
Final Results
19%
c
28%
cpp
60%
python
20%
javascript/typescript
سلام وقت همکی بخیر.
حقیقتش من خیلی دوست داشتم با توجه به استقبالی که شد این کلاسو برگزار کنم اما با توجه به اینکه الان واقعا سرم خیلی شلوغه حقیقتش وقت آزاد ندارم.

از شما عزیزان عذر میخوام و گفتم برای احترام به شما عزیزان خبرشو بهتون بدم.
انشالله در یک وقت مناسب بتونیم برگزارش کنیم.

ممنون🙏
9🤔1
سلام وقتتون بخیر
من تصمیم گرفتم که برای کسانی که واقعا علاقه دارند و در مسیر یادگیری برنامه نویسی هستن گروه بزنم که اونجا بتونن با هم تبادل کنن و منم هر موقع وقت کردم به سوالات پاسخ بدم.

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

ممنون از شما
7