رفتن به مطلب
انجمن آی ترفند

پست های پیشنهاد شده

vip-itarfand.PNG

در این قسمت از انجمن زبان برنامه نویسی C به صورت مثال آموزش داده می شود.

line.png

از پرسیدن سوال در این قسمت خودداری کنید.

 

 

 

 

 

 

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای آموزش از نرم افزار Microsoft Visual Studio 2015 استفاده می شود.

تمام کدها تست شده و کامل هستند.

 

چگونگی ساخت یک برنامه

ابتدا از قسمت File و سپس New گزینه Project را انتخاب کنید.

اکنون از قسمت ++C گزینه Win32 Console Application را انتخاب کنید.

در صفحه باز شده بر روی Finish کلیک کنید تا پروژه شما ساخته شود.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 1) نمایش یک پیغام ساده

line.png

برای نمایش داده شدن یک پیغام در صفحه Cmd به کاربر از قطعه کد زیر استفاده می شود:

 

printf("hello itarfand");

 

 

 

 

 

 

 

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 2) انواع متغیرها

line.png

زبان C , C++ دارای متغیرهای مختلفی به صورت زیر می باشد:

int : تعریف یک عدد صحیح

float : تعریف یک عدد اعشاری

char : تعریف یک کاراکتر

double : یک عدد صحیح بزرگتر از int

 

توضیحات بیشتر

اگر اول متغیرها unsigned بیاید : یک عدد صحیح مثبت را می گرید.

مانند : unsigned int

اگر اول متغیرها long بیاید : بازه متغیر افزایش می یابد.

اگر اول متغیرها short بیاید : بازه متغیر کاهش می یابد.

 

مقدار دهی اولیه

می توان به متغیرها مانند زیر مقدار داد:

int a=2;
int b,c=3;
float d=44.3;
double e=500;
cahr f="itarfand";
char g='i';

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 3) اعمال ریاضی

line.png

عمل های اصلی ریاضی به صورت زیر می باشند:

 

int a=20;
int b=5;
float c=10;
float d=4;
int e;
float f;

 

1) جمع

e = a + b;

 

2) تفریق

e = a - b;

 

3) ضرب

e = a * b;

 

4) تقسیم

e = a / b;
f= c / d;
f = c / a;
f = (float) d / b;

 

نکته 1 : عملگر تقسیم به دو صورت عمل می کند:

اگر هر دو متغیر int باشند : حاصل نیز از نوع int است ( عددی صحیح )

اگر یکی یا هر دو از نوع float باشند : حاصل نیز از نوع float است ( دارای قسمت اعشاری )

در کد قسمت (float) برای تاکید بر تقسیم اعشاری دو متغیر است.

 

5)باقیمانده

e = a % b;
f = d % b;

 

6) تساوی

عملگر = همیشه مقدار سمت راست را بر روی مقدار سمت چپ می ریزد.

e = a;
f = b;
e = d;

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 4 ) عملگرهای شرطی

line.png

int a;
int b;

 

1) بزرگر و کوچکتر

a > b;
a < b;

 

2) بزرگتر و مساوی , کوچکتر و مساوی

a >= b;
a <= b;

 

3) نامساوی

a != b;

 

4) مساوی

a = b;

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 5) آرایه

line.png

بعضی مواقع شما برای برنامه نویسی احتیاج به تعریف متغیرهای زیادی دارید .

مانند برنامه ای برای یک دانش آموزان یک مدرسه با 400 دانش آموز.

در این مواقع تعریف 400 متغیر نه کار درستی می باشد و نه به علت تعداد زیاد متغیرها شدنی.

در این گونه مواقع از آرایه استفاده می شود.

 

نمونه آرایه یک بعدی  :

int a[400];
float b[20];
int c[4] = { 1 , 2 , 6 , 50 };

 

نمونه آرایه دو بعدی :

float d[20][30];
int e[3][2] = { { 1 , 2 } , { 4 , 7 } , { 3 , 20 } };

 

نکته : اندیس آرایه ها از 0 شروع می شود و به n-1 ختم می شود.

int f[n];

 

مثال ها

char g[] = { 'i' , 't' 'a' , 'r' , 'f' , 'a' , 'n' , 'd' , '\0' };
or
char g[9] = { 'i' , 't' 'a' , 'r' , 'f' , 'a' , 'n' , 'd' , '\0' };

char g[] = "itarfand";

 

نکته : وجود ( 0\)  الزامی می باشد.

 

int h[3];
h[0] = 1;
h[1] = 4;
h[2] = 9;

 

char i[3];
i = "abc";

 

int j[2][2];
j[0][0] = a;
j[0][3] = c;

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 6 ) دریافت ورودی از کاربر

line.png

داده ها را به روش های مختلفی می توان از کاربر گرفت.

یکی از این روش ها صفحه کلید رایانه می باشد.

 

شکل کلی :

scanf("", );

 

مثال :

int a;
floaf b;
char c;
string d;
int e;
scanf("%d", &a);
scanf("%f", &b);
scanf("%c", &c);
scanf("%s", &d);
scanf("%d%f%d", &a,&b,&e);

 

می توان تعداد ارقام ورودی را مانند زیر محدود کرد.

حداکثر 2 رقم صحیح و 3 رقم اعشاری

float a;
scanf("%2.3f", &a);

 

دریافت کاراکتر :

یک کاراکتر را به روش زیر نیز می توان دریافت کرد.

 

نکته : این توابع در کتابخانه conio.h قرار دارند.

char a;
a = getch();
a = getche();

 

این توابع برعکس scanf نیازی به فشردن کلید enter برای دریافت ورودی ندارند

تابع getche کاراکتر وارد شده را در صفحه نمایش می دهد اما getch نه.

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

char a;
a = getchr();

 

نکته : این تابع در stdio.h وجود دارد و بعد از ورود کاراکتر باید کلید enter را نیز وارد کرد.

توسط این تابع کاراکتر ورودی در صفحه نمایش داده می شود.

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 7) کاراکترهای کنترلی

line.png

این کاراکترها در تابع printf می آیند و باعث کارهای مختلف می شوند.

 

n\ : موجب انتقال کنترل به خط جدید می شود.

t\ : انتقال به ۸ فاصله بعدی صفحه نمایش.

f\ : موجب انتقال کنترل به صفحه جدید می شود.

a\ : به صدا درآوردن بوق سیستم.

b\ : حرف قبل خود را حذف می کند.

“\ : چاپ دابل کوتیشن.

‘\ : چاپ کوتیشن.

V\ : انتقال کنترل به ۸ سطر بعدی

N\ : ثابت های مبنای ۸ ( N عدد مبنای ۸ است ).

xN\ : ثابت های مبنای ۱۶ ( N عدد مبنای ۱۶ است ).

 

مثال ها :

printf("my site is \n itarfand");
printf("hellow \t\t programmer");

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 8 )حلقه ها

line.png

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

زبان C دارای حلقه های مختلف می باشد که می توانید آن ها را مشاهده کنید:

 

if(){}

if(){}else{}

if(){}else if(){}

while(){}

for(){}

do{}while()

 

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

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 9 ) حلقه if

line.png

این حلقه برای اعمال شرط برای انجام یک کار می باشد و دارای سه حالت زیر است:

if(***){

}

 

if(***){

}
else{

}

 

if(***){

}
else if(***){

}

else if(***){

}
...

 

if(***){

}
else if(***){

}
else if(***){

}
...
else{

}

 

نکته : در تمام حلقه های شرطی اگر در بدنه فقط یک کار انجام شود می توان علامت ها ی } { را قرار نداد.

if(***)
  int a= b;

 

نکته : در بدنه تمام حلقه ها می توان شرط های دیگری نیز قرار داد.

if(***){
  if(***){
  }
}

 

مثال

int a,b,c;
printf("please enter first number");
printf("please enter second number");
printf("please enter third number");
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&b);

if(a + b < c){
  printf("a + b is more than c \n");
}
else
  printf("a + b is less than c\n");

if(a = b){
  printf("a = b \n");
}
else if(a = c){
  printf("a = c \n");
}
else if (b = c){
  printf(" b = c");
}

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 10) حلقه while

line.png

این حلقه برای گذاشتن شرط ( تا زمانی که ) برای انجام یک کار می باشد.

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

این حلقه به دو صورت زیر استفاده می شود:

 

1) ابتدا شرط چک می شود و بعد کارهای داخل حلقه انجام می شود.

while(***){

}

 

2) ابتدا یک بار کارهای داخل حلقه انجام می شود و سپس شرط چک می شود و در صورت درست بودن دوباره حلقه تکرار می شود.

do{

}while(***);

 

مثال ها:

int a;
int b;

while(a + b != 10){
  printf("Please enter a and b");
  scanf("%d,%d",&a,&b);
}

 

int a;

do{
  printf("what is 10 + 3?");
  scanf("%d",&a);
}while(a != 13);

printf("thank you");

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 11) حلقه for

line.png

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

این حلقه به صورت زیر تعریف می شود:

int i;
int n=50;

for(i=0; i<n; i++){

}

 

در کد بالا:

1) i=0 : مقدار اولیه ای که حلقه از آن شروع می شود.

2) i<50 : شرط انجام داخل حلقه

3) i++ : عملی که بعد از انجام هر بار حلقه تغییر می کند تا جلوی بینهایت اجرا شدن حلقه را بگیرد.

 

نکته : متغیری که در حلقه ( در این مثال i ) استفاده می شود حتما باید در داخل حلقه تغییر کند وگرنه حلقه بینهایت بار اجرا می شود.

به صورت زیر نیز می توان حلقه را تعریف کرد:

for(int i=2; i<9; i--){

}

 

می توان چند شرط یا مقدار اولیه برای حلقه قرار داد.

int i;
int j;

for(i=0 , j=2; i<40 , j<20; i++ , j++){

}

 

مثال:

int i;
int a=0;

for(i=0; i<40; i++){
  a += i;
}

printf("0+1+2+3+...+39 = %d", a);

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 12 ) ساختار Struct

line.png

توسط ساختار Struct می توان داده ای را که شامل داده های مختلف با نوع های متفاوت می باشند بوجود آورد.

به طور مثال شما در یک آرایه فقط می توانید نام دانش آموزان را ذخیره کنید اما توسط این ساختار می توانید هم نام و هم شماره دانش آموزی آن ها را ذخیره کنید.

 

طریقه تعریف:

struct structure_name {
  data_type itarfand1;
  data_type itarfand2;
  . . 
  data_type itarfand;
};

 

مثال:

struct book{
  char name[40];
  int id;
}book1, book2;

 

دسترسی به ساختار در برنامه

برای این کار یا باید مانند مثال بالا ابتدا نوع نمونه از book به نام های book1 & book2 بسازید و یا در داخل کلاس اصلی به صورت زیر عمل کنید.

int main( ){
  struct Book Book1;
  struct Book Book2;
}

 

همچنین می توانید آرایه ای از این ساختار تعریف کنید.

int main( ){
  book list[50];
}

 

تغییر متغیرها در کلاس اصلی

برای این کار به صورت زیر عمل می کنیم:

int main( ){
  book1.id=12463;
}

 

مثال:

struct Books {
  char title[50];
  char author[50]; 
  char subject[100];
  int book_id;
};

int main( ) {
  struct Books Book1;
  struct Books Book2;
  
  strcpy( Book1.title, "itarfnd");
  strcpy( Book1.author, "mohammad");
  strcpy( Book1.subject, "c programing"); 
  
  Book1.book_id = 24865;
  strcpy( Book2.title, "itarfand forum");
  strcpy( Book2.author, "li");
  strcpy( Book2.subject, "struct); 
         
  Book2.book_id = 25165;
         
  return 0;
}

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 13 ) توابع

line.png

فرض کنید شما می خواهید یک دوچرخه طراحی کنید. برای این کار شما قسمت های مختلفی را طراحی می کنید که هر کدام کار مخصوص به خود را انجام می دهند. به طور مثال رکاب برای انتقال قدرت و فرمان برای کنترل دوچرخه می باشد.

برای نوشتن برنامه به زبان های مختلف نیز به این صورت می توان عمل کرد و توابع ای را طراحی کرد که کارهای مخصوص به خود را انجام دهند. به این کار اصولا برنامه نویسی شیئ گرا می گویند و نمونه ای هرچند کمتر به زبان های دیگر مانند جاوا ، در زبان C , C++ وجود دارد که همان توابع می باشند.

 

اجزا تابع

هر تابع دارای قسمت های مختلف : ورودی ، خروجی ، نام و بدنه می باشد که بنا به نوع تابع می تواند خروجی و یا ورودی نداشته باشد.

 

محل تعریف

توابع را می توان در بالا و یا پایین تابع Main تعریف کرد که اگر در پایین تعریف شود باید در بالا تابع Main آن را معرفی کرد که ذکر خواهد شد.

 

صورت کلی

main(){

}

int test(input){
  //your code
  return output;
}

 

در کد بالا با توجه به نوع متغیری که برگشت داده می شود کلمه int تغییر می کند.

 

اگر کد پایین تعریف شود

int test(char x, char y);
main(){

}

int test(char x, char y){
  int z;
  return z;
}

 

اگر در بالا تعریف شود دیگر نیازی به معرفی تابع نیست و فقط تابع را می نویسیم.

 

اگر تابع خروجی نداشته باشد

void test(int x){
	...
}

 

اگر تابع نه ورودی و نه خروجی داشته باشد

void test(){
  ...
}

 

فراخوانی توابع

برای استفاده از توابع باید آن ها را در main صدا کنید که به صورت زیر می باشد.

int test(int a1, int a2);

int main(){
  int x;
  int y;
  
  printf("enter number one\n");
  scanf("%d",&x);
  printf("enter number two\n");
  scanf("%d",&y);
  
  int result;
  result = test(x,y);
  
  printf("x + y = %d", result);
}

int test(int a1, int a2){
  int z;
  z= a1 + a2;
  return z;
}

 

طبق کد بالا :

ورودی تابع لازم نیست با نام اصلی متغیر یکی باشد ( a1,a2) (x,y)

تابع به صورت (test(x,y صدا می شود.

 

توابع بازگشتی

به توابعی که در داخل خود دوباره همان تابع را صدا می کنند توابع بازگشتی نامیده می شوند.

به طور مثال می توان برای حساب !n از تابع بازگشتی استفاده کرد.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 14 ) کار با فایل

line.png

کار با با فایل به علت محدودیت حافظه رم در زمان نگهداری و حجم و نیاز به ذخیره به ذخیره بلند مدت اطلاعات بوجود آمده است.

نوشتن در فایل در زبان ++C به دو صورت text file & binary file می باشد که چند تفاوت دارند.

Text Files

#include <fstream>
  
int main(){
  ofstream OutputFile("myout.txt", ios::out);
  ifstream InputFile("myin.txt", ios::in);
  
  if (InputFile.is_open()){
    printf("open successfully");
  }
  
  if (!OutputFile){
    printf("error");
    
    exit(1);
  }
  
  OutputFile.close();
  InputFile.close();
}

 

در کد بالا:

ابتدا باید کتابخانه مربوطه را وارد کرد.

ofstream برای نوشتن در فایل می باشد.

ifstream برای خواندن از فایل می باشد.

if اول برای چک کردن باز شدن موفقیت آمیز فایل می باشد.

if دوم برای جک کردن امکان نوشتن در فایل می باشد.

بعد از باز شدن فایل باید آن را در انتها توسط close بست.

myin.txt در محلی که برنامه قرار دارد ایجاد می شود.

نوشتن در فایل

#include "stdafx.h"
#include <fstream>
#include <iostream> 
#pragma warning(disable:4996)
using namespace std;

int main (){
  ofstream myfile ("itarfand.txt", ios::out);
  
  if (myfile.is_open()){
    
    myfile << "test\n"; myfile << "hello\n";
    myfile.close();
  } 
  else{
    cout << "can not open file";
  } 
  return 0;
}

 

خواندن از فایل

#include "stdafx.h" 
#include <fstream> 
#include <iostream> 
#pragma warning(disable:4996) 
using namespace std;

int main (){
  string line;
  ifstream myfile("itarfand.txt", ios::in);
  
  if (myfile.is_open()){ 
    
    while(getline(myfile,line)){
      
      cout << line << '\n';
    } myfile.close(); 
  } 
  else cout << "can not open file";
  
  return 0;
}

 

Binary File

#include <iostream>
  
int main (){
  ifstream inputFile("output.dat", ios::in | ios::binary);
  ofstream outputFile("output.dat", ios::out | ios::binary);
  return 0; 
}

 

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

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 15 ) اشاره گر ها

line.png

به آدرس هر متغیر در حافظه اشاره گر می گویند.

محل استفاده از اشاره گر ها:

  • String
  • تخصیص حافظه پویا
  • ارسال مقدار به تابع به صورت by reference
  • اشاره به تابع
  • ایجاد ساختمان های داده ای خاص

مثال:

int a= 1;
int * b= &a;

printf("The value >a< is %d \n", a);
printf("The value of >a< is also %d\n", *b);

در مثال بالا دو عبارت printf مقدار 1 را چاپ می کنند.

علامت & به معنی آدرس متغیر a می باشد.

علامت * به معنی اشاره گر بودن b به آدرس a می باشد.

مثال :

long int a;
long int *b;
b= &a;

در خط اول یک متغیر تعریف شده است.

در خط دوم یک اشاره گر تعریف شده است.

در خط سوم محل اشاره ، اشاره گر مشخص شده است.

نکته : حتما باید نوع داده ای اشاره گر و اشاره شونده از یک نوع باشد.(a , b)

اشاره گر ها در توابع

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

مثال:

void func(int n){
  
	n++;
}

void main(){
  
	int n = 10;
  
	func(n);
  
	printf(a);
}

در کد بالا مقدار 10 چاپ می شود.

مثال:

void func(int *n){
  
	*n++;
}

void main(){
  
	int n = 10;
  
	func(&n);
  
	printf(a);
}

در کد بالا مقدار 11 چاپ می شود.

دلیل : چون آدرس حافظه متغیر به تابع ارسال می شود و در مرحله دریافت اشاره گر به محل آدرس آن ها اشاره می کند.

اشاره گر به اشاره گر

اشاره گر به اشاره گر متغیری می باشد که محتوای آن شامل اشاره گر به یک متغیر دیگر می باشد که محتوای آن خود یک اشاره گر می باشد.

مثال:

int a=2;
int *p1 = &a;
int **p2 = &p1;
printf(**p2);

در مثال بالا مقدار 2 چاپ می شود.

حافظه های پویا

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

همچنین مقدار حافظه / آرایه های پویا می تواند تغییر کند.

مثال :

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#pragma warning(disable:4996)
using namespace std;

std::system("cls");

int main()
{
	int number;
  
 	 printf("Enter number:\n");
	  scanf("%d",&number);

	int *a = malloc(number * sizeof(int));
	or
    int *a;
	int a = (int*) malloc(number * sizeof(int));
	
  	if(a == NULL)                     
    {
        printf("\n Error! memory not allocated.");
        exit(0);
    }

    printf("\n Enter elements of array: ");
    for(int i = 0; i < number; ++i)
    {
        scanf("%d", a + i);
        sum += *(a + i);
    }

    printf("\n Sum = %d", sum);
  
    free(a);
  
    return 0;
}

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

توضیحات :

malloc : یک مقدار مشخص از حافظه را به برنامه اختصاص می‌دهد.

realloc : حافظه‌ای که قبلاً اختصاص یافته را افزایش یا کاهش می‌دهد. ممکن است احتیاج باشد حافظه دوباره اختصاص یابد.

calloc : مقدار مشخصی از حافظه را اختصاص می‌دهد اما آنها را با صفر مقداردهی می‌کند.

free : حافظه اختصاص یافته را آزاد می‌کند و به سیستم باز می‌گرداند.

مثال :

int num, newsize, *ptr;
a = (int*) calloc(num, sizeof(int));
a = realloc(a, newsize);

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

قسمت 16 ) ساختار union

line.png

این ساختار مانند Struct می باشد اما تفاوت هایی با آن دارد.

مثال : 

union name{
	int age;
	char id;
  	float phone;
}name1,name2;

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

به طور مثال در کد بالا چون متغیر float مقدار 4 بایت را از حافظه می گیرید مقدار کل حافظه برای ساختار 4 بایت یا 32 بیت می باشد.

دسترسی و تعریف

چگونگی دسترسی و تعریف یک عنصر جدید مانند struct می باشد.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری

×
×
  • اضافه کردن...