بسماللهالرحمنالرحیم
اگر سری آموزشهای میکروبلیز را تا کنون دنبال کرده باشید به مطالبی چون تعریف اصولی متغیر و عملگرها در زبان برنامهنویسی C پرداختیم که برای دیدن این سری از آموزشها میتوانید اینجا کلیک کنید. در این قسمت میخواهیم به توضیح اصولی و دقیق کاراکترها، رشتهها و آرایهها به همراه مثال در هر بخش بپردازیم.کاراکتر در زبان برنامهنویسی C چیست؟
کاراکتر (char) یک نوع متغیر (Variable) در زبان برنامه نویسی C است که برای ذخیره تنها یک کاراکتر به کار میرود. منظور از کاراکتر در واقع، حروف الفبا، اعداد و علامت هایی است که در متن ها به کار میبریم. نکته ای که در استفاده از کاراکترها بسیار حائز اهمیت است، اندازه آن میباشد. که در قسمت ” آموزش میکروبلیز قسمت سوم: آموزش زبان برنامهنویسی C ” به این موضوع پرداختیم. طرز صحیح استفاده از کاراکتر در زبان برنامهنویسی C به صورت زیر است.1 | char Character = 'B'; |
آرایه در زبان برنامهنویسی C چیست؟
آرایه (Array)، تعدادی عنصر از یک نوع خاص هستند که با یکدیگر تعریف میشوند و با استفاده از اندیس های (در ادامه توضیح میدهیم) متناظر آنها، میتوانیم به آنها اشاره نماییم. طرز صحیح تعریف آرایه در زبان برنامهنویسی C1 | نوع آرایه اسم آرایه [ اندازه آرایه]; |
1 | double balance[10]; |
1 | double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0}; |
1 | double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0}; |
1 | balance[4] = 50.0; |
1 | نوع اسم [اندازه آرایه شماره 1][اندازه آرایه شماره2]...[اندازه آرایه شماره n]; |
1 | int threedim[5][10][4]; |
1 | نوع آرایه اسم آرایه[ x ][ y ]; |
1 2 3 4 5 | int a[3][4] = { {0, 1, 2, 3} , /* initializers for row indexed by 0 */ {4, 5, 6, 7} , /* initializers for row indexed by 1 */ {8, 9, 10, 11} /* initializers for row indexed by 2 */ }; |
1 | int val = a[2][3]; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> int main () { /* an array with 5 rows and 2 columns*/ int a[5][2] = { {0,0}, {1,2}, {2,4}, {3,6},{4,8}}; int i, j; /* output each array element's value */ for ( i = 0; i < 5; i++ ) { for ( j = 0; j < 2; j++ ) { printf("a[%d][%d] = %d\n", i,j, a[i][j] ); } } return 0; } |
قبل از اینکه به خروجی کد نگاه کنید توصیه میکنیم ابتدا خودتان خروجی را تحلیل کنید.
1 2 3 4 5 6 7 8 9 10 | a[0][0]: 0 a[0][1]: 0 a[1][0]: 1 a[1][1]: 2 a[2][0]: 2 a[2][1]: 4 a[3][0]: 3 a[3][1]: 6 a[4][0]: 4 a[4][1]: 8 |
نکته مهم این است که آرایهها خود نوعی اشارهگر محسوب میشوند که ما از همین نکته میخواهیم در ادامه استفاده کنیم.
1 2 3 4 | double *p; double balance[10]; p = balance; |
نکته طلایی: باید و حتما نوع اشارهگرها با یک دیگر یکی باشد به طور مثال نوع P و Balance هر دو از نوع Double هستند. ( در مورد تبدیل صریح و ضمنی هم در ادامه مقالات خواهیم گفت).
1 2 | double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0}; double *p; |
1 2 3 4 5 | *(p + 0) : 1000.0 * (p + 1) : 2.0 * (p + 2) : 3.4 * (p + 3) : 17.0 * (p + 4) : 50.0 |
- تابع اشارهگر با آرایهها
- تابع آرایه با اندازه محدود
- تابع آرایه با اندازه نامحدود
1 2 3 4 5 | void myFunction(int *param) { . . . } |
1 2 3 4 5 | void myFunction(int param[10]) { . . . } |
1 2 3 4 5 | void myFunction(int param[]) { . . . } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | double getAverage(int arr[], int size) { int i; double avg; double sum = 0; for (i = 0; i < size; ++i) { sum += arr[i]; } avg = sum / size; return avg; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> /* function declaration */ double getAverage(int arr[], int size); int main () { /* an int array with 5 elements */ int balance[5] = {1000, 2, 3, 17, 50}; double avg; /* pass pointer to the array as an argument */ avg = getAverage( balance, 5 ) ; /* output the returned value */ printf( "Average value is: %f ", avg ); return 0; } |
1 | Average value is: 214.400000 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <stdio.h> /* function to generate and return random numbers */ int * getRandom( ) { static int r[10]; int i; /* set the seed */ srand( (unsigned)time( NULL ) ); for ( i = 0; i < 10; ++i) { r[i] = rand(); printf( "r[%d] = %d\n", i, r[i]); } return r; } /* main function to call above defined function */ int main () { /* a pointer to an int */ int *p; int i; p = getRandom(); for ( i = 0; i < 10; i++ ) { printf( "*(p + %d) : %d\n", i, *(p + i)); } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | r[0] = 313959809 r[1] = 1759055877 r[2] = 1113101911 r[3] = 2133832223 r[4] = 2073354073 r[5] = 167288147 r[6] = 1827471542 r[7] = 834791014 r[8] = 1901409888 r[9] = 1990469526 *( p + 0) : 313959809 *(p + 1) : 1759055877 *(p + 2) : 1113101911 *(p + 3) : 2133832223 *(p + 4) : 2073354073 *( p + 5) : 167288147 *(p + 6) : 1827471542 *( p + 7) : 834791014 *(p + 8) : 1901409888 *(p + 9) : 1990469526 |
رشته در زبان برنامهنویسی C چیست؟
رشته، آرایه ای از کاراکترها است. پس برای تعریف رشته باید مانند تعریف آرایه عمل کرد با این تفاوت که نوع رشته فقط می تواند char انتخاب شود. اگر به تعریفی که کردیم با دقت نگاه کنید، گفتهایم که رشتهها، آرایهای از متغیرها هستند. خب اجازه دهید برای درک بهتر یک مثال از کاراکتر و سپس نحوه اصولی نوشتن رشته در زبان C بپردازیم.1 | char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; |
این کاراکتر نشاندهنده انتهای رشته از کاراکتر خاصی به نام (تهی= NULL) است که با ‘۰\ ‘ مشخص شده است. بنابراین آخرین کاراکتر در هر رشته برابر با ‘۰\ ‘ می باشد. لذا اگر رشته ای به طول n تعریف کنیم، فقط از n-1 کاراکتر آن می توانیم استفاده کنیم. زیرا کاراکتر آخر ‘۰\ ‘ است.
در این روش میتوان مقدار اندازه رشته را مشخص کرد که باید حتما به این نکته هم توجه کنید که خود کاراکتر تهی یا Null هم، خودش یک کاراکتر محسوب میشود. برای درک بهتر به مثال زیر توجه کنید.
1 | char greeting[6] = "Hello"; |
1 | char greeting[] = "Hello"; |
1 | char names[3][7] = { "BLOOM", "Phonix", "Zeus", }; |
در این روش نیازی به تعیین طول رشتهها نیست البته دقت کنید که حتما باید تعداد آنها ذکر شود.
1 | char names[3][] = { "BLOOM", "Phonix", "Zeus", }; |
معرفی توابع کاربردی کتابخانه String.h
1 2 3 4 5 6 7 8 9 10 11 | strcpy(s1, s2); strcat(s1, s2); strlen(s1); strcmp(s1, s2); strchr(s1, ch); strstr(s1, s2); |
1 | strcpy(s1, s2); |
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> #include <string.h> int main () { char str1[]="Sample string"; char str2[40]; char str3[40]; strcpy (str2,str1); strcpy (str3,"copy successful"); printf ("str1: %s\nstr2: %s\nstr3: %s\n",str1,str2,str3); return 0; } |
1 2 3 | str1: Sample string str2: Sample string str3: copy successful |
1 | strcat(s1, s2); |
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> #include <string.h> int main () { char str[80]; strcpy (str,"these "); strcat (str,"strings "); strcat (str,"are "); strcat (str,"concatenated."); puts (str); return 0; } |
1 | these strings are concatenated. |
1 | strlen(s1); |
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> #include <string.h> int main () { char szInput[256]; printf ("Enter a sentence: "); gets (szInput); printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput)); return 0; } |
1 2 | Enter sentence: just testing The sentence entered is 12 characters long. |
1 | strcmp(s1, s2); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> #include <string.h> int main () { char key[] = "apple"; char buffer[80]; do { printf ("Guess my favorite fruit? "); fflush (stdout); scanf ("%79s",buffer); } while (strcmp (key,buffer) != 0); puts ("Correct answer!"); return 0; } |
1 2 3 | Guess my favourite fruit? orange Guess my favourite fruit? apple Correct answer! |
1 | strchr(s1, ch); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> #include <string.h> int main () { char str[] = "This is a sample string"; char * pch; printf ("Looking for the 's' character in \"%s\"...\n",str); pch=strchr(str,'s'); while (pch!=NULL) { printf ("found at %d\n",pch-str+1); pch=strchr(pch+1,'s'); } return 0; } |
1 2 | Looking for the 's' character in "This is a sample string"... found at 4 |
1 | strstr(s1, s2); |
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> #include <string.h> int main () { char str[] ="This is a simple string"; char * pch; pch = strstr (str,"simple"); strncpy (pch,"sample",6); puts (str); return 0; } |
1 | This is a sample string |
سلام
شوخی هایی که در متن آموزش می کنین خوبه
ادامه بدین
ممنون از سیسوگ
سلام
دستان درد نکند از اینکه زحمت می کشید و مطالب آموزشی زبان سی را منتشر می کنید .
من زبان سی را با کامپیوتر 80286 و با کامپایلر توربو سی شروع کردم و از آن زمان تا حالا هم برای میکرو های مختلف از 8051 تا ARM از آن استفاده کرده و می کنم .
با وجود این مقاله های شما را از قسمت اول تا الان خواندم در من شوق دوباره خوانی اصول و روش های برنامه نویسی به زبان سی زنده کرد و مطالبی بود که یا فراموش کرده بودم یا فکر کرده بودم که زیاد لازم نباشد و از آن ها استفاده نمی کردم .
متوجه شدم که باید زودتر این کار را می کردم .
این را به شما مدیونم .
خیلی خیلی سپاسگزارم از اینکه قبول زحمت کردین و این مطالب را تهیه می کنید .
مطمئن باشید که سطر به سطر این مطالب را خواندم و خواهم خواند.
با تشکر مجدد
مجید
سلام مجید عزیز خیلی خوشحال شدم از اینکه باعث شده این اموزش برای شما مفید باشه و یک تلنگری باشه که مجددا این زبان رو برای خودتون یاداوری کنید چون باور کنید هر چی بگم مهمه کمه حالا جلوتر که رفتیم ان شالله بیشتر متوجه داستان خواهید شد. و من هم به نوبه خودم تمام تلاشمو میکنم مقالاتی که در این زمینه مینویسم بیشترین فایده رو برای شما و مخاطبین عزیز داشته باشه.
با ارزوی موفقیت برای شما مجید عزیز.
BLOOM