آشنایی با زبان C
1-4-1- ساختار برنامه نویسی
به منظور برنامهنویسی به زبان C، آشنایی اولیه با دستورات آن الزامی است. برای
این منظور: با معرفی مختصر ساختارها و دستورات مرتبط، مطابق زیر با یک برنامه ساده
شروع میکنیم.
#include <stdio.h>
int main(){
printf("Hello World\n");
return 0;
}
شرح
برنامه:
#include <stdio.h>: فایلی به
اسم stdio.h را ضمیمه میکند که این فایل به ما اجازه استفاده از توابع خاصی را میدهد. stdio کوتاه
شدهی عبارت
Standard Input/Output است. این فایل شامل توابع ورودی: مانند خواندن از صفحه کلید و توابع
خروجی: مانند نمایش دادن بر روی صفحه نمایش است.
int main():
int : عبارتی
است که یک مقدار را بر میگرداند (return) و در ادامه بیشتر به توضیح آن میپردازیم.
main : نام نقطهای است که برنامه از آن نقطه شروع میشود. پرانتزها در جلوی
عبارتmain به این معنی است که این تابع آرگومان ورودی
ندارد.
int
main() {
دستورها
}
} { (آکلادها) برای این است که تمام نوشتهها را در یک گروه خاص قرار دهد. در مثال بالا، آکلاد مشخص میکند که نوشتهها متعلق به تابع main است. شایان ذکر است که آکلادها در زبان C کاربرد زیادی دارند.
printf ("Hello World \n");
تابع
printf : یک متن را در صفحه نمایش میدهد. اطلاعاتی که باید این تابع نمایش دهد
بین دو پرانتز قرار میگیرد. دقت شود که: کلمهها بین دو double contention ( " ) قرار
گیرند، زیرا آنها در واقع یک رشته هستند. هر یک از حروف یک کاراکتر میباشد و
مجموعهی آنها یک گروه با نام رشته (string) را تشکیل میدهند. رشتهها همیشه باید بین دو " قرار میگیرند.
\n : به کامپایلر دستور میدهد به خط جدید برود، وقتی شما در متن خود enter بزنید به
خط جدید نمیرود برای همین ما مجبور هستیم از این دستور استفاده کنیم.
باید بعد از هر دستوری یک semicolon ( ; ) قرار دهید برای این که نشان دهد آن دستور تمام شده است.
جدول (1-1): دستورات برای printf
\a Audible
signal
\b Backspace
\t رفتن به یک tab جلوتر
\n رفتن به یک خط جدید
\v Vertical tab
\f پاک کردن صفحه / رفتن به صفحه جدید
\r Carriage return
return 0: مقدار آرگومان برگشتی توسط دستور return مشخص میشود و return 0 به معنی آن است که تابع ما مقدار صفر را باز میگرداند.
پس از
کامپایل نمودن برنامه، اگر کدهای شما اشتباه باشند، کامپایلر به شما میگوید که
اشتباه در کدام خط رخ داده است. به منظور اجرای صحیح برنامه، اصلاح خطا شامل: خطای
املایی و ساختاری الزامی است. پس از کامپایل صحیح، برنامهی شما تبدیل به فایل
اجرایی میشود. اکنون باید عبارت "Hello World" را در صفحه ملاحظه کنید.
استفاده از توضیحات (comments) : برای تشخیص بهتر هر یک از خطوط برنامه، استفاده از comment در جلوی
خطوط پیشنهاد میشود. توضیحات را باید بعد از // یا بین /*………*/ بنویسید.
توضیحات توسط کامپایلر خوانده نمیشوند. توضیحات استفاده شده در اول برنامه عملکرد
برنامه را نشان میدهند. شما همچنین میتوانید: بین قسمتهای مختلف برنامه از
توضیحات استفاده کنید تا آن قسمت را توضیح دهید در ذیل، مثالی از قرار دادن توضیح
قرار داده شده است:
/*
Author: Hamed Saghaei
Date: 2009/07/15
Description:
Writes the words "Hello World" on the screen */
#include <stdio.h>
int main()
{
printf("Hello World\n");
//prints "Hello World"
return 0;
}
1-4-2 متغیرها :
متغیرها در زبان برنامهنویسی C، مکانی از حافظه هستند که نامی به آنها تخصیص داده میشود و میتوانند
مقداری را در بر داشته باشند. از متغیرها برای ذخیره کردن مقادیر در حافظه استفاده
میشود. دو نوع متغیر اصلی در زبان C وجود دارد که به ترتیب (عدد( Numeric و(حروف (Character میباشند.
متغیرهای عددی : این نوع متغیرها میتوانند عدد صحیح باشند و اعداد کسری یا اعشاری
نمیتوانند در این گروه قرار بگیرند.
متغیرهای کاراکتری : در این نوع متغیرها: حروف و اعداد میتوانند
قرار بگیرند. البته اعداد در اینجا کمی متفاوت هستند.
عبارات عددی و رشتهای ثابت: این نوع عبارات ثابت هستند و مقدار آنها قابل
تغییر نیست. گاهی برای جلوگیری از اشتباه از آنها استفاده میشود.
تعریف متغیرها: برای تعریف متغیر در برنامه ابتدا نوع آن را باید مشخص کنیم در جدول
(1-2) نوع متغیرها و محدودهی آنها مشخص شده است. البته متغیرها را به هر نحوی که
مایل باشید میتوانید نام گذاری کنید. ولی بهتر است کمتر از 32 حرف داشته باشند و
در ابتدای برنامه تعریف شوند.
جدول (1-2): انواع داده
محدوده نوع نام
از 0 و 1 یک بیت bit
از 128- تا 127 هشت بیت char
از 0 تا 255 هشت بیت بدون علامت unsigned char
از 32767- تا 32768 اعداد صحیح 16 بیتی int
از 0 تا 65535 اعداد صحیح بدون علامت 16 بیتی unsigned int
از 217483648- تا 217483647 اعداد صحیح 32 بیتی long int
از 0 تا 429467295 اعداد صحیح بدون علامت 32 بیتی unsigned long int
e3.402 اعداد اعشاری float´e-1.175 تا
مقادیر مثبت و منفی 38´از مقادیر مثبت و منفی 38
e1.8 اعداد اعشاری double´e-2.2 تا
مقادیر مثبت و منفی 308´از مقادیر مثبت و منفی 308
int main()
{
int a;
char b;
return 0;
}
در عبارت بالا، متغیر a از نوع int و متغیر b از نوع char تعریف شده اند. و مطابق زیر برنامه ذیل میتوان در یک مکان، چندین متغیر را تعریف کرد
int
main()
{
int a, b, c;
return 0;
}
با توجه به اینکه تابع main، تابع اصلی برنامه است. بنابراین بازگشت مقادیر توسط این تابع صحیح نمیباشد. در ادامه به جای تعریف آن به روش مثالهای قبل، به صورت زیر تعریف میشود. همچنین برای تعریف متغیرهای Constant (ثابت) تنها لازم است: عبارت const را قبل از نوع متغیر قرار داد.
void
main()
{
const float pi = 3.1415;
}
-
متغیرهای علامتدار و بدون علامت:
متغیرهای علامتدار (signed) میتوانند دارای مقادیر مثبت یا منفی باشند ولی متغیرهای بدون علامت (unsigned)، تنها میتوانند مقادیر مثبت و صفر را اختیار
کنند. این عبارات، قبل از نوع متغیر تعریف میشوند و نبود آن دلیل بر علامتدار
بودن (Signed) متغیر
است.
void
main()
{
unsigned int a;
signed int b;
}
-
استفاده از متغیر در محاسبات:
برای دادن مقداری به متغیر از علامت تساوی (=) استفاده میشود.
void
main()
{
int a=4; // a=4
char b; // b=0
a = 3; // a=3
b = 'H'; // b='H'
}
به منظور
انجام محاسبات از عملگرهای محاسباتی زیر استفاده میشود.
جدول (1-3): عملگرهای محاسباتی
عملیات عمگر
جمع +
تفریق -
ضرب *
تقسیم /
باقیمانده %
برای انجام عملیات به متغیری نیاز داریم که حاصل عملیات در آن ذخیره
شود.
void
main()
{
int a, b;
a = 5;
b = a + 3; // b=8
a = a % 3; // a=2
}
در زبان برنامهنویسی C ، میتوان متغیری از keyboard را با استفاده از دستور scanf گرفت و توسط printf آن را چاپ کرد.
#include <stdio.h>
void main()
{
int a;
scanf("%d", &a);
a = a * 2;
printf("The answer is %d", a);
}
%d برای خواندن
و چاپ کردن متغیرها از نوع int استفاده میشود و سایر متغیرها مطابق جدول زیر هستند.
جدول (1-4): خواندن و چاپ متغیرها
int %d
or %i
char %c
float %f
double %lf
string %s
1-4-3 دستور If :
در بیشتر مواقع لازم است که مقدار متغیری در برنامه کنترل شود. برای
این منظور استفاده از حلقه If به حل مساله کمک میکند.
:If ساختار
کلی دستور
if (شرط)
{
دستورات;
}
else if (شرط)
{
دستورات;
}
else
{
دستورات;
}
#include
<stdio.h>
void main()
{
int mark;
char pass;
scanf("%d", &mark);
if (mark > 40)
pass = 'y';
}
در برنامه بالا ابتدا متغیری از ورودی گرفته میشود و سپس شرط mark > 40 امتحان میشود. اگر پاسخ مثبت بود، حرف Y در متغیر pass قرار داده میشود.
#include
<stdio.h>
void main()
{
int mark;
char pass;
scanf("%d", &mark);
if (mark > 40)
pass = 'y';
else
pass = 'n';
}
در برنامه بالا ابتدا متغیری از ورودی گرفته میشود و سپس شرط mark > 40 امتحان
میشود. اگر پاسخ مثبت بود، حرف Y در متغیر
pass قرار میگیرد، در غیر این صورت حرف n در
pass قرار داده میشود.
در صورتی که در برنامه، اجرای چند دستور پس از امتحان شرط نیاز داشت،
میباید مطابق زیر برنامه ذیل، دستورات را درون { } قرار دهیم.
#include
<stdio.h>
void main()
{
int mark;
char pass;
scanf("%d", &mark);
if (mark > 40)
{
pass = 'y';
printf("You passed");
}
else
{
pass = 'n';
printf("You failed");
}
}
همچنین میتوان در هر دستور
if چند شرط را امتحان نمود:
#include<stdio.h>
void main()
{
int a, b;
scanf("%d", &a);
scanf("%d", &b);
if (a > 0 && b > 0)
printf("Both numbers are
positive\n");
if (a = 0 || b = 0)
{
printf("At least one of
the numbers = 0\n");
a++;
}
if (!(a > 0) && !(b > 0))
printf("Both numbers are
negative\n");
}
- عملگرهای منطقی:
جدول (1-5): عملگرهای منطقی
== مساوی
!= نامساوی
> بزرگتر از
>= بزرگتر یا مساوی
< کوچکتر از
<= کوچکتر یا مساوی
&& و
|| یا
! نقیض
و: هر دو شرط درست باشند حاصل درست.
یا: یکی یا هر دو شرط درست باشند حاصل درست است.
1-4-4- ساختار دستور switch
switch(variable)
{
case var 1:
دستور;
break;
case var 2:
دستور;
break;
.
.
.
default:
دستور;
}
#include <stdio.h>
void main()
{
char fruit;
printf("Which one is your favourite fruit:\n");
printf("a) Apples\n");
printf("b) Bananas\n");
printf("c) Cherries\n");
scanf("%c", &fruit);
switch (fruit) {
case 'a':
printf("You like
apples\n");
break;
case 'b':
printf("You like bananas\n");
break;
case 'c':
printf("You like
cherries\n");
break;
default:
printf("You entered an invalid
choice\n");
}
}
در برنامه بالا، fruit متغیر
برنامه است که آن را با استفاده از case کنترل میکنیم اگر برابر a بود، متن
You like apples در خروجی چاپ میشود سپس از دستور beak استفاده شده است که باعث خروج از حلقه میشود
در نهایت اگر با هیچیک از متغیرها برابر نبود با استفاده از default متن choice You entered an invalid چاپ میشود.
1-4-5- دستورات حلقه
در برخی مواقع لازم است دستوری به صورت متوالی اجرا شود. برای این کار
از دستورات حلقه استفاده میشود که به سه دسته تقسیم میشوند:
for, do while, while:
- ساختار for
for (اضافه شدن متغیر ;شرط ;عدد شروع)
{
دستورات
;
}
for اجازه میدهد از عددی تا عدد دیگر تکرار داشته باشیم. در برنامه زیر
اعدد 1 تا 24 در خروجی چاپ میشوند.
void
main()
{
int i;
for (i = 1; i == 24; i++)
printf("H\n");
return 0;
}
در مثال بالا از i++ استفاده کردیم که برابر است با i=i+1 یعنی در هر بار اجرا، یک واحد به i اضافه میشود یا میتوان از i-- استفاده کرد که هر بار اجرا، یک واحد از i کم میشود.
- ساختار while
while(condition)
{
دستورات
;
}
تفاوت این حلقه با قبلی در این است که ما نمیدانیم قرار است چند بار
حلقه اجرا شود در مثال زیر تعداد اجرا شدن حلقه از ورودی گرفته میشود در times ذخیره و
در هر بار اجرا شدن حلقه یک واحد به i افزوده میشود تا زمانی که به تعداد times برسد از حلقه خارج شده و برنامه تمام میشود.
include
<stdio.h>
void main()
{
int i, times;
scanf("%d", ×);
i = 0;
while (i <= times)
{
i++;
printf("%d\n", i);
}
}
- ساختارdo while
ساختارdo while مانند while است با
این تفاوت که شرط آن در آخر امتحان میشود.
do {
دستورات
;
}
while(Condition)
#include <stdio.h>
void main()
{
int i, times;
scanf("%d", ×);
i = 0;
do
{
i++;
printf("%d\n", i);
}
while (i <= times);
}
:Break and continue
Continue برای
شروع Loop از ابتدا
و برای خاتمه دادن از
Break استفاده میشود. در مثال زیر هرگز Hello چاپ نمیشود.
#include
<stdio.h>
int main()
{
int i;
while (i < 10)
{
i++;
continue;
printf("Hello\n");
}
}
1-4-6- اشارهگرها
اشارهگر متغیرهایی هستند که درون خود آدرسی از حافظه را نگهداری میکنند
و به متغیر درون آن آدرس، اشاره میکنند به این دلیل به آنها اشارهگر میگویند.
شما میتوانید از اشارهگرها برای کارهای خاصی استفاده کنید. مثلاً برای گرفتن
مقدار آدرسی که به آن اشاره میکند. اشارهگرها میتوانند مشخص یا نامشخص باشند.
اشارهگرهای مشخص به یک متغیر مشخص مثلاً int اشاره میکنند، و اشارهگرهای نامشخص میتوانند به انواع اطلاعات
اشاره کنند. برای اینکه شما عبارت یا کاراکتری را به عنوان اشارهگر مشخص کنید
باید یک * قبل از اسم آن بگذارید، در اینجا مثالی از اشارهگر آورده شده است.
void
main()
{
int *p;
void *up;
}
شما میتوانید آدرس یک int را درون یک اشارهگر قرار دهید و اشارهگر با استفاده از علامت & آدرس int را میگیرد.
void main()
{
int i;
int *p;
i = 5;
p = &i;
return 0;
}
شما میتوانید به مقدار int که اشارهگر به آن اشاره کرده دسترسی داشته باشید.
* باعث میشود که اشارهگر دوباره بازگشت داده شود، یعنی در واقع همان
متغیر میشود و تغییر در آن به منزلهی تغییر در متغیر است.
void
main()
{
int i, j;
int *p;
i = 5;
p = &i;
j = *p; //j = i
*p = 7; //i = 7
return 0;
}
استفاده از اشارهگر برای بیان i=j در بالا راهی طولانی است. شما در ادامه با کاربردهای بیشتر اشارهگرها آشنا خواهید شد ولی در این قسمت، هدف آشنایی مقدماتی با این مبحث است.
1-4-7- آرایهها
اگر شما میخواستید 5 متغیر داشته باشید، مانند زیر عمل میکردید:
int i1, i2, i3, i4, i5;
حال اگر 1000 متغیر بود چه میکردید؟ مسلماً فرایند بالا زمان زیادی
میبرد، ولی با استفاده از آرایه میتوانید: با نام یک متغیر، هر تعداد که بخواهید
متغیر بسازید. آرایه مانند متغیر معمولی است و برای تعریف آن کافی است فقط بعد از
نام آن یک جفت براکت بیاورید و درون آن تعداد متغیر مورد نظر را بنویسید. مثال:
int a[5]
برای اینکه به مقدار متغیرهای هر خانه دست یابید شما باید نام آرایه
و سپس شمارهی خانهی مورد نظر را بیاورید. فقط به یاد داشته باشید که شمارهی
خانههای آرایه از صفر شروع میشود. برای مثال یک آرایه به طول 5 دارای خانههایی
از شمارهی 0 تا 4 است.
nt
a[5];
a[0] = 12; a[1] = 23;
a[2] = 34; a[3] = 45;
a[4] = 56;
printf("%d",a[0]);
- استفاده از آرایه با حلقه
استفاده از آرایه در حلقه کاربرد زیادی دارد. زیرا خانههای آرایه یک
دنباله را طی میکنند که این فرایند مشابه حلقهها است. برای مثال: وقتی خانههای
آرایه صفر نشدهاند و شما نیاز دارید که مقدار آن ها را صفر کنید باید مانند زیر
از حلقه استفاده کنید:
int a[10];
for (i = 0;i < 10;i++) a = 0;
- آرایههای چند بعدی
آرایههایی که ما قبلاً استفاده کردیم آرایههای یک بعدی نام دارند زیرا
تنها از یک سطر تشکیل شدهاند. آرایههای 2 بعدی از چند سطر و ستون تشکیل شدهاند،
در برای تسلط بیشتر بر موضوع شکل (1-13) را ملاحظه نمائید.
آرایههای یک بعدی
شماره سطر مقدار
0 4
1 3
2 1-
آرایه دو بعدی
0 1 2
0 1 2 3
1 4 5 6
2 7 8 9
شکل (1-13): آرایههای چند بعدی
شما میتوانید از آرایههای سه بعدی یا بیشتر نیز استفاده کنید ولی
اغلب کاربردی ندارند. در ادامه برنامهای آورده شده که شما را با روش تعریف یک
آرایهی دو بعدی و چگونه کار کردن آن آشنا میکند. توجه داشته باشید که مثال دارای
2 حلقه است زیرا میخواهیم مقدار متغیرهای درون سطر و ستون های مختلف را تغییر
دهیم.
int
a[3][3], i, j;
for (i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
a[j] = 0;
1-4-8- رشته
رشته آرایهای از کاراکترهاست که به یک 0 یا یک کاراکتر خالی (null) ختم شود
تا نشان دهد که رشته کجا تمام شده است. توجه کنید که کاراکتر null جزو رشته به حساب نمیآید. برای استفاده از
رشته دو راه وجود دارد:
1- استفاده از آرایهای از کاراکترها
2- استفاده از اشارهگر رشته
آرایه کاراکتری مانند آرایه زیر تعریف می شود:
char ca[10];
شما باید مقدار هر خانهی آرایه را به کاراکتر مورد نظر خود اختصاص، و
کاراکتر پایانی خود را 0 قرار دهید. به یاد داشته باشید که برای اشاره کردن به یک
رشته باید از s% استفاده
کنید.
char
ca[10];
ca[0] = 'H'; ca[1] = 'e';
ca[2] = 'l'; ca[3] = 'l';
ca[4] = 'o'; ca[5] = 0;
printf("%s", ca);
وقتی که شما یک مقدار خاص را به یک اشارهگر رشته نسبت میدهید کامپایلر یک صفر در انتهای آن قرار میدهد و دیگر نیازی نیست تا مانند آرایه کاراکتری، 0 را در انتهای آن قرار دهید.
char
ca[10], *sp;
scanf("%s", ca);
sp = ca;
scanf("%s", sp);
شما میتوانید یک رشته را در یک آرایه کاراکتری با استفاده از scanf بخوانید
ولی برای خواندن یک اشارهگر رشته، کامپایلر باید آن را به یک آرایه کاراکتری
برگرداند.
فایل سرآمد
string.h دارای توابع پرکاربردی برای کار با رشتههاست. در اینجا به شرح تعدادی
از آنها میپردازیم:
strcpy ( مقصد منبع ،)
شما نمیتوانید در زبان C از چنین دستوری استفاده کنید: string1 = string2. بلکه شما باید از تابع strcpy برای کپی کردن یک رشته درون یک رشتهی دیگر استفاده کنید. تابع strcpy رشتهی منبع را در رشتهی مقصد کپی میکند.
s1
= "abc";
s2 = "xyz";
strcpy(s1, s2); // s1 =
"xyz"
: strcat (مقصد منبع،)
رشتهی منبع و مقصد را با هم ترکیب نموده و در رشتهی مقصد قرار میدهد.
s1
= "abc";
s2 = "xyz";
strcat(s1, s2); // s1
= "abcxyz"
: strcmp(اول دوم،)
این تابع رشتهی اول را با رشتهی دوم مقایسه میکند، اگر رشتهی اول بزرگتر از رشتهی دوم بود، تابع عددی مثبت را برگشت میدهد، اگر هر دو رشته مساوی بودند تابع مقدار عددی صفر را برگشت میدهد و اگر رشته اول کوچکتر از رشتهی دوم بود تابع عددی منفی را برگشت میدهد.
s1
= "abc";
s2 = "abc";
i = strcmp(s1, s2); // i = 0
strlen(رشته)
این تابع تعداد کاراکترهای رشته را بازگشت میدهد.
s
= "abcde";
i = strlen(s); // i = 5
1-4-9- توابع
توابع در واقع، زیر برنامه میباشند. شما قبلا از توابع استفاده
کردید، منظور همان تابع
main است. شما قبل از اینکه یک تابع را فراخوانی کنید باید آن را در
ابتدای برنامه و قبل از
main تعریف کنید. در مورد هر تابع میباید نوع return مشخص شود (یعنی نوع آرگومان برگشتی تابع
مشخص شود مثلا از نوع
int است یا از نوع char یا نظایر آن). در صورتی که نمیخواهید مقدار خاصی را return کنید از void استفاده
کنید. بعد اسم منحصر به فرد تابع را بنویسید و پس از آن یک جفت پرانتز قرار دهید.
در صورتی که تابع شما آرگومان ورودی دارد با مشخص کردن نوع و تعداد آرگومآنها، آنها
را درون پرانتز جلوی اسم تابع قرار دهید و در صورتی که تابع شما آرگومان ورودی
ندارد درون پرانتز عبارت
void را نوشته یا آن را خالی باقی بگذارید. در آخر نیز دو عدد { } بگذارید
و برنامه ی خود درون آن بنویسید. تابع تعریف شده در مثال زیر را بررسی نمائید:
#include
<stdio.h>
void Hello()
{
printf("Hello\n");
}
void main()
{
Hello();
}
پارامتر های تابع، مقادیری هستند که ما به یک تابع میدهیم تا بتواند آنها را محاسبه کند. شما باید در داخل پرانتزهای پارامتر، متغیرها را بیاورید تا مقدار پارامتر را که قابل قبول است در تابع قرار دهد. دراینجا ما Function Add که دو پارامتر را با هم جمع می کند آورده شده است:
#include<stdio.h>
int Add(int a, int b)
{
return a+ b;
}
void main()
{
int answer;
answer = Add(5, 7);
}
شما میتوانید آدرس متغیر را در یک تابع قرار دهید، در اینجا کپی صورت نمیگیرد و شما نیاز به اشارهگر دارید.
#include<stdio.h>
int Add(int *a, int *b)
{
return *a + *b;
}
int main()
{
int answer;
int num1 = 5;
int num2 = 7;
answer = Add(&num1, &num2);
printf("%d\n", answer);
return 0;
}
1-4-10- متغیرهای سراسری و محلی
متغیرهای محلی فقط در داخل یک تابع قابل استفاده هستند و بیرون
از آن نمیشود از این نوع متغیرها استفاده کرد. اگر شما نیاز دارید که بتوانید از
یک متغیر در تمامی قسمتهای برنامه استفاده کنید، باید آن را سراسری تعریف
کنید.
#include<stdio.h>
int a; // Global variables
int b; // Global variables
int Add()
{
return a + b;
}
int main() {
int answer; // Local variable
a = 5;
b = 7;
answer = Add();
printf("%d\n", answer);
return 0;
}
ممنون خیلی مفید بود
باسلام توضیحات شماعالی بود ازشما تشکرفراوان دارم فقط اگه میشه کانال های تلگرامتون رااگه دارید معرفی کنید
سلام
یک برنامه میخواستم زمانی که باتن زده میشه یکی اضافه کنه و باتن دیگه یکی کم کنه ویک دکمه بتونیم عدد خودمونو انتخاب کنیم
mirsus1372@gmail.com