• مشکی
  • سفید
  • سبز
  • آبی
  • قرمز
  • نارنجی
  • بنفش
  • طلایی
تعداد مطالب : 351
تعداد نظرات : 75
زمان آخرین مطلب : 6094روز قبل
کامپیوتر و اینترنت

آموزش زبان C بخش پنجاه چهارم
داده ها ممكن است در فايل به دو صورت ذخيره شوند كه عبارتند از : 1) اسكي يا
متن 2 text باينري (binary) . اين دو روش ذخيره شدن داده ها ، در موارد زير با
يكديگر تفاوت دارند : 1
تعيين انتهاي خط . 2
تعيين انتهاي فايل . 3
نحوه ذخيره شدن اعدد بر روي ديسك .
در فايل text اعداد بصورت رشته اي از كاراكترها ذخيره مي شوند ولي در فايل
باينري اعداد به همان صورتي كه در حافظه قرار مي گيرند بر روي ديسك ذخيره
مي گردند . بعنوان مثال ، در فايل text عدد 526 سه بايت را اشغال مي كند. زيرا
هر رقم آن ، بصورت يك كاراكتر در نظر گرفته مي شود . ولي در فايل باينري اين
عدد در 2 بايت ذخيره مي گردد ( چون عدد 526 يك عدد صحيح است و اعداد صحيح در
دو بايت ذخيره مي شوند ) ( شكل 1 ) .
در فايل text ، كاراكتري كه پايان خط را مشخص مي كند ، در حين ذخيره شدن بر
روي ديسك بايد به كاراكترهاي CR/LF، line feed،و carriage returnو تبديل شود و
در حين خوانده شدن عكس اين عمل بايد صورت گيرد . يعني كاراكترهاي CR/LF بايد
به كاراكتر تعيين كننده پايان خط تبديل شوند . بديهي است كه اين تبديلات مستلزم
صرف وقت است ، لذا دسترسي به اطلاعات موجود در فايل هاي text كندتر از فايل هاي
باينري است .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤ | 999 | | '9' | '9' | '9' |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | 132.844 || '1' | '3' | '2' | '.' | '8' | '4' | '4' اعداد در فايل text اعداد در حافظه

شكل (1) . مقايسه ذخيره شدن اطلاعات در فايل text و حافظه

اختلاف ديگر فايل هاي text و باينري در تشخيص انتهاي فايل است . درهر دو روش
ذخيره فايل ها ، طول فايل توسط سيستم نگهداري مي شود و انتهاي فايل با توجه به
اين طول مشخص مي گردد . در حالت text كاراكتر 1A ( در مبناي 16 ) و يا 26 ( در
مبناي 10 ) مشخص كننده انتهاي فايل است . ( اين كاراكتر با فشار دادن كليد CTL
به همراه كليد Z توليد ميشود ). در حين خواندن داده ها از روي فايل text ، وقتي
كنترل به اين كاراكتر رسيد بيانگر اين است كه داده هاي موجود درفايل تمام شده اند.
در فايل باينري ممكن است عدد 1A ( در مبناي 16 ) و يا 26 ( در مبناي 10 ) جزئي
از اطلاعات بوده ، بيانگر انتهاي فايل نباشد . لذا نحوه تشخيص انتهاي فايل در text متفاوت است .

خداییش اگر خوشت اومد نظر بده

دوشنبه 19/6/1386 - 22:19
کامپیوتر و اینترنت

آموزش زبان C بخش پنجاه سوم


نوع داده شمارشي ، اين امكان را فراهم مي كند كه بتوان عناصر يك مجموعه
متناهي را نامگذاري يا شماره گذاري كرده وسپس متغيرهايي را تعريف نمود تا مقادير
آن مجموعه را بپذيرند . اين مجموعه با شناسه هايي معرفي مي شود كه به ثابت هاي
شمارشي معروفند . نوع هاي شمارشي بصورت زير تعريف مي شوند : {
نام نوع شمارشي enum /
عنصر اول /
عنصر دوم /
عنصر سوم .
.
.

عنصر n ام } ;

نام نوع شمارشي همانند يك عنصر معمولي نامگذاري مي شود . عناصر نوع شمارشي
شناسه هايي هستند كه اجزاي آن را مشخص كرده و با كاما از يكديگر جدا مي شوند .
تعريف متغيرهاي از نوع شمارشي همانند تعريف متغيرهاي نوع ساختمان انجام
مي شوند . مجموعه دستورات زير را در نظر بگيريد :
enum color {( 1)
red/
yellow/
brown/
} color1/ color2/

enum color {( 2)
red/
yellow/
brown
} ;
enum color color1 / color2 ;

مجموعه دستورات (1) و (2) معادل يكديگرند. در مجموعه دستورات (1) ضمن تعريف
نوع شمارشي color دو متغير color1و color2و از اين نوع متغير مي شوند و در
مجموعه دستورات (2) پس از تعريف نوع شمارشي color ، با استفاده از دستور enum
دو متغير color1و color2و از اين نوع تعيين مي شوند. متغيرهاي color1و color2و
فقط مي توانند مقادير red، yellow،و brownو را بپذيرند . مجموعه دستورات زير
در مورد نوع هاي شمارشي فوق معتبرند :
color1=red ;
color2=yellow ;
if(color1==color2)
{
.
.
.
}
نكته اي كه در مورد نوع هاي شمارشي بايد توجه داشت اين است كه به هر يك از
عناصر نوع شمارشي يك مقدار عددي صحيح ، نسبت داده مي شود :
به اولين عنصر ، مقدار صفر ، دومين عنصر مقدار 1 و به n امين عنصر ، مقدار n
1
نسبت داده مي شود . مگر اين كه برنامه نويس اين مقادير را تغيير دهد . به
عنوان مثال ، دستور زير را در نظر بگيريد : enum sample {a/b=5/c/d} ;

در دستور فوق مقدار صفر به a ، مقدار 5به b ، مقدار 6به c و مقدار 7به d
نسبت داده مي شود .

مثال : برنامه اي كه با استفاده از نوع هاي شمارشي دستمزد هفته اي كارمندان
موسسه اي را محاسبه مي كند .
#include "stdio.h"
#define SATJUST 1.5
#define SUNJUST 2.0
enum weekday {
SUN /
MON /
TUE /
WED /
THU /
FRI /
SAT } ;
typedef enum weekday WEEKDAY ;
main)(
{
int hours ;
float baserate / rate /wages ;
WEELDAY day ;
WEELDAY tomorro )(;
printf("\n enter the basic");
printf(" hourly rate : " );
scanf("%f"/&baserate );
wages=0.0 ;
printf("\nenter the hours worked\n");
printf("for monday through sunday:");
printf("\n" );
day=SUN ;
do {
day=tomorrow(day );
scanf("%d"/&hours );
switch(day)
{
case MON:
case TUE:
case WED:
case THU:
case FRI:
rate=baserate ;
break ;
case SAT:
rate=SATJUST * baserate;
break ;
case SUN:
rate=SUNJUST * baserate;
break ;
}
wages+=rate * hours ;
} while( day != SUN );
printf("\ntotal wages for the");
printf(" week is: %.2f"/wages );
}
tomorrow(WEEKDAY d)
{
WEEKDAY nextd ;
switch( d)
{
case SUN : nextd=MON ; break ;
case MON : nextd=TUE ; break ;
case TUE : nextd=WED ; break ;
case WED : nextd=THU ; break ;
case THU : nextd=FRI ; break ;
case FRI : nextd=SAT ; break ;
case SAT : nextd=SUN ; break ;
}
return(nextd );
}

نمونه اي از خروجي برنامه مثال بالا : enter the basic hourly rate : 1
enter the hours worked
for monday through sunday:

12 43 56 78 98 64 23

total wages fo

خداییش اگر خوشت اومد نظر بده

دوشنبه 19/6/1386 - 22:18
کامپیوتر و اینترنت

آموزش زبان C بخش پنجاه دوم


دستور typedef براي تعويض نام نوع موجود استفاده مي شود . بدين معني كه با
استفاده از اين دستور مي توان براي نوع هاي ابتدايي مثل intو charو و ... و
همچنين نوع هاي تعريف شده در برنامه ، اسم ديگري انتخاب نمود . اين دستور به
دو دليل اهميت دارد : 1
موجب ميشود تا مساله قابل حمل بودن زبان C قوت بيشتري پيدا كند.يعني اگر
برنامه اي را در يك ماشين نوشته و بخواهيم آن را در ماشين ديگري اجرا كنيم
چنانچه اين دو ماشين با يكديگر مطابقت نداشته باشند كافي است دستور typedef
طوري عوض شود كه اين مشكل را حل نمايد . 2
موجب مي شود تا براي نوع هاي داده طولاني ، اسم ساده تري انتخاب گردد .
دستور typedef بصورت زير بكار مي رود :
<نوع موجود> <اسم جديد>typedef
نوع موجود ، يكي از انواع معتبر در زبان C است . اسم جديد، نامي است كه نوع
موجود ، در برنامه باشد به اين نام خوانده شود . دستور زير را در نظر بگيريد : unsigned int var1/ var2;

اين دستور موجب ميشود تا متغيرهاي var1و var2و از نوع " صحيح مثبت " انتخاب
شوند . با استفاده از دستور typedef براي unsigned int به طريق زير اسم جديدي
انتخاب مي كنيم : typedef unsigned int SUBINT ;

دستور فوق موجب مي شود تا بتوان بجاي عبارت unsigned intازSUBINTز استفاده
كرد . دستور زير را ملاحظه نماييد : SUBINT var1/var2 ;

با دستور فوق ، متغيرهاي var1و var2و از نوع SUBINT انتخاب مي شوند ، كه
همان unsigned int است .
دستور typedef در مورد آرايه ها كاربرد جالبي دارد . مجموعه دستورات زير را
در نظر بگيريد : typedef char STRING[50] ;
STRING s1/s2 ;

مجموعه دستورات فوق موجب مي شوند تا متغيرهاي s1و s2و از نوع كاراكتري و به
طول 50 بايت تعريف گردند. بعبارت ديگر، اين مجموعه دستورات با دستور زير معادل
است : char s1[50] /s2[50];

براي آشنايي بيشتر با چگونگي معرفي آرايه ها توسط دستور typedef به مثال 1
توجه نماييد :

مثال 1:
main)(
{
typedef unsigned int INT ;
typedef int ARR[5] ;
ARR list1 / list2 ;
INT i /sum= 0 ;
for( i=0 ;i < 5;i++)
scanf("%d"/&list1[i] );
for( i=0 ;i < 5;i++)
scanf("%d"/&list2[i] );
for( i=0 ;i < 5;i++)
sum+=list1[i]+list2[i] ;
printf("\n sum of two array is:");
printf("%d"/sum );
}
دستورtypedef در مورد ساختمانها بكار رفته و موجب ميگردد تا تعريف متغيرهاي
ساختمان و همچنين دسترسي به اجزاي آن به سهولت انجام شود . براي آشنايي با
چگونگي عمل دستور typedef در مورد ساختمان ها به مثال 2 مراجعه نماييد .

مثال 2:
#include "stdio.h"
struct date {
int day ;
int month ;
int year ;
} ;
typedef struct date DATE ;
typedef DATE *PTRDATE ;

main)(
{
DATE today ;
PTRDATE ptr ;
ptr=&today ;
;
َday =2= 27ؤ > ptr ;
َmonth = 9ؤ > ptr ;
َyear == 1991ؤ > ptr ;
(dayؤ>"\n date is:%d"/ptr)printf ;
(monthؤ > "%d"/ptr)printf ;
(yearؤ > "%d"/ptr)printf }
خداییش اگر خوشت اومد نظر بده

دوشنبه 19/6/1386 - 22:18
کامپیوتر و اینترنت

آموزش زبان C بخش پنجاه یکم


قبلا" مشاهده شد كه اجزاي يك ساختمان مي توانند ، از نوع ساختمان باشند . به
طور كلي بكارگيري يك ساختمان در ساختمان ديگر ، union در يك ساختمان و برعكس و union
در unionر ديگر امكان پذير است .

مثال :
main)(
{
struct twoint {
int num1:
int num2:
} ;
union intflo {
struct twoint test ;
float flonum ;
} unex ;
printf("\n size of union is: " );
printf("%d"/sizeof(union intflo));
unex.test.num1=564 ;
unex.test.num2=-231 ;
printf("\n unex.test.num1=");
printf("%d"/unex.test.num1 );
printf("\n unex.test.num2=");
printf("%d"/unex.test.num2 );
unex.flonum=45.76 ;
printf("\n unex.flonum=");
printf("%.2f"/unex.flonum );
}
نمونه اي از خروجي برنامه مثال بالا :
size of union is: 4
unex.test.num1=564
unex.test.num2=-231
unex.flonum=45.76

خداییش اگر خوشت اومد نظر بده

دوشنبه 19/6/1386 - 22:17
کامپیوتر و اینترنت

آموزش زبان C بخش پنجاهم


C، union، محلي از حافظه است كه توسط دو يا چند متغير بطور اشتراكي
مورد استفاده قرار مي گيرد . اين متغيرها بطور همزمان نمي توانند از اين محل
استفاده كنند بلكه هر متغير مي تواند در زمان هاي متفاوتي اين محل را مورد
استفاده قرار دهد .
نحوه تعريف union همانند ساختمان است و شكل كلي آن بصورت زير است : {
اسم > union<UNION
اجزاي union ;
اسامي متغيرها }
اسم union از قانون نامگذاري براي متغيرها تبعيت ميكند. اجزاي union همانند
اجزاي ساختمان تعريف مي شوند و چگونگي تعريف متغيرهاي union نيز مثل تعريف
متغيرهاي ساختمان است . طول يك union به اندازه مجموع طول اجزاي آن نيست بلكه
به اندازه طول عنصري است كه بيشترين طول را دارد، زيرا در واقع union ساختماني
است كه آدرس شروع كليه اجزاي آن از يك نقطه است . union زير را در نظر بگيريد:
union u_type {
int i ;
char ch ;
float y ;
} ;

در تعريف u-type، 3، عنصر به اسامي i، ch،و yو تعريف شده اند . در اين union
چون طول y از طول ساير اجزائ بيشتر است ( طول int برابر با 2 بايت ، طول char
برابر با 1 بايت و طول float برابر با 4 بايت است ) طول u-type برابر با طول y
يعني 4 در نظر گرفته مي شود ( مثال ) شكل (1) نحوه استفاده اجزاي i، chو yو را
از يك محل حافظه به طول 4 بايت نشان مي دهد .
ؤؤؤؤ >y < ؤؤؤؤ
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | 0 | 1 | 2 | 3
|
شماره بايت
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ch
< ؤ
ؤؤ >i < ؤؤ
شكل (1) . نحوه استفاده اجزاي union از حافظه

مثال :
main)(
{
union test {
int i ;
char ch ;
float y ;
} un ;
float x ;
printf("\n enter an integer number:");
scanf("%d"/&un.i );
printf(" the value of i is: %d/un.i);
printf("\n enter a character: " );
un.ch=getche )(;
printf("\n value of ch is:%c"/un.ch);
printf("\n enter a float number: ");
scanf("%f"/&x );
un.y=x ;
printf("the value of y is:%.2f"/un.y);
printf("\n\n the size of union is:");
printf("%d"/sizeof(union test ));
}
نمونه اي از خروجي برنامه مثال بالا :
enter an integer number:43
the value of i is:43
enter a character:f
the value of ch is:f
enter a float number:23.65
the value of y is:23.65
the size of u

خداییش اگر خوشت اومد نظر بده

دوشنبه 19/6/1386 - 22:17
کامپیوتر و اینترنت

آموزش زبان C بخش چهل نهم


در زبان C برخلاف ساير زبانهاي برنامه سازي ، به يك بيت خاص از يك بايت حافظه
مي توان دسترسي پيدا كرد . اين امر در زبان C به دلايل زير مفيد است : 1
اگر محدوديتي در ميزان حافظه وجود داشته باشد، ميتوان از يك بايت بعنوان
چند متغير منطقي استفاده نمود . براي اين منظور مي توان هر بيت را بعنوان يك
متغير منطقي در نظر گرفت كه مقدار صفر به معني ارزش " درستي " و مقدار يك به
معني ارزش " نادرستي " و يا برعكس باشند . 2
در حين ارتباط كامپيوتر با دستگاه هاي خارجي ، بعضي از رابط ها مي توانند
اطلاعات موجود در يك بايت را ( كه هر بيت آن ممكن است تفسير خاصي داشته باشد )
انتقال دهند . 3
بسياري از زيربرنامه هاي سيستم ( كه معمولا" از ديد ما پنهان هستند ) نياز
به دسترسي به بيت ها دارند .
اگر چه همه اعمال فوق توسط عملگرهاي بيتي قابل انجامند ، ولي ساختمان هاي
بيتي ، روش مناسب تر و بهتري براي برآوردن اين اهداف هستند . بطور كلي مي توان
گفت كه ساختمان بيتي ، مكانيزم ساختماني جهت دسترسي به بيت هاي يك بايت از
حافظه است .
روش كلي تعريف ساختمان بيتي به صورت زير است : {
نام ساختمان بيتي struct ;
طول فيلد >1نام فيلد >: <1نوع فيلد > <1 <;
طول فيلد >2نام فيلد >: <2نوع فيلد > <2 <.
.
.
;
طول فيلد >nنام فيلد >: <;
اسامي متغيرهاي بيتي }
نام ساختمان بيتي از قانون نامگذاري براي متغيرها تبعيت مي كند . هر يك از
فيلدها در ساختمان بيتي مي توانند از نوع int، unsigned، و يا signed باشد .
فيلدي كه طول آن 1 باشد يايد از نوع unsigned انتخاب گردد . زيرا بيت با طول 1
نميتواند شامل علامت هم باشد. طول فيلدها در ساختمان بيتي به بيت سنجيده ميشود.
يعني طول فيلد مشخص مي كند كه فيلد مورد نظر چند بيتي است .
بعنوان مثال ساختمان بيتي زير را در نظر بگيريد :
struct device {
unsigned active :1 ;
unsigned ready :1 ;
unsigned xmt_error :1 ;
} dev_code ;
ساختمان 3 device فيلد كه طول هر كدام يك پيت است را تعريف مي كند و متغير dev-code
از نوع ساختمان بيتي device تعريف شده است . متغير dev-code بصورت آن
چه كه در شكل (1) مشاهده مي شود در حافظه قرار مي گيرد .
يك بايت
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
|
شماره بايت
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
< بالا استفاده ؤؤؤ<ؤؤؤ| | | | | |
dev-code/xxmt-error
ؤؤؤؤؤ | | dev-code/rready
ؤؤؤؤؤؤؤؤؤ | dev-code aactive
ؤؤؤؤؤؤؤؤؤؤؤؤؤ
شكل (1) . وضعيت متغير dev-code

همانطور كه در شكل (1) مشاهده مي گردد براي دسترسي به اجراي متغير ساختمان
بيتي از عملگر نقطه (.) استفاده مي گردد . اگر اشاره گري به ساختمان بيتي اشاره
ؤؤ به اجزاي اين >نمايد ، همانند ساختمان معمولي مي توان با استفاده از عملگر
ساختمان دسترسي پيدا كرد .
يكي از موارد كاربرد ساختمان هاي بيتي ، درتجزيه و تحليل اطلاعات اخذ شده از
يك دستگاه سخت افزاري است . بعنوان مثال ، پورت وضعيت يك تطبيق دهنده ارتباط
سري ، يك بايت وضعيت ، با ساختار زير را برمي گرداند :
شماره بيت مفهوم بيت ( وقتي كه 1 باشد )
change clear_to_send line 0
change in data_set_ready 1
trailing edge detected 2
change in recive line 3
clear_to_send 4
data_set_ready 5
telephone ringing 6
received signal 7
بايت وضعيت مربوط به تطبيق دهنده ارتباط سري را مي توان با استفاده از
ساختمان بيتي تعريف كرد :
struct stalus_type {
unsigned delta_cts :1 ;
unsigned delta_dsr :1 ;
unsigned tr_edge :1 ;
unsigned delta_rec :1 ;
unsigned cts :1 ;
unsigned dsr :1 ;
unsigned ring :1 ;
unsigned rec_line :1 ;
} status;
براي استفاده از ساختار بيتي status كافي است كه زير برنامه اي نوشته شود تا
اطلاعات فرستاده شده را بخواند و سپس آن را تجزيه و تحليل و بررسي نمايد : status=get_port_status)(;

در دستور فوق ()get_port_status تابعي است كه پورت وضعيت را خوانده و در
متغير ساختمان بيتي status قرار مي دهد .
بعضي از نكاتي كه در مورد متغيرهاي از نوع ساختمان بيتي بايد در نظر داشت
عبارتند از : 1
نمي توان به آدرس آنها مراجعه كرد 2
نمي توانند بصورت آرايه تعريف شوند 3
به حد زيادي ، وابسته به ماشين هستند، بعنوان مثال ممكن است در يك ماشين
بيت ها از چپ به راست قابل دسترسي باشند و در ماشين ديگر از راست به چپ . 4
تركيبي از ساختمان بيتي و ساختمان معمولي ، ممكن است :
struct emp {
struct addr address1 ;
float pay ;
unsigned lay-off :1 ;
unsigned hourly :1 ;
unsigned shifted :1 ;
} ;
در ساختمان emp ، فيلد address1 از نوع ساختمان address تعريف شده است كه
اين ساختمان مي تواند بصورت زير تعريف شود :
struct address {
char zip ;
char street [31] ;
char city [31] ;
} ;
نكته اي كه در مورد ساختمان emp بايد توجه داشت اين است كه از يك بايت براي
نگهداري 3 قلم اطلاعات ( اجزاي lay-off، hourly،و shiftedو ) استفاده شده است .
اگر از ساختمان بيتي استفاده نميشد حداقل به 3 بايت نياز بود ( اگر اين بايت ها
بصورت كاراكتري تعريف مي شدند ) .

مثال : برنامه اي كه چگونگي استفاده از ساختمان هاي بيتي را نشان مي دهد .
struct date
{
unsigned int day: 5 ;
unsigned int month: 4 ;
unsigned int year: 7 ;
} ;
main)(
{
struct date dateofbirth / today ;
int age ;
char p1[40] / p2[40] ;
clrscr )(;
strcpy(p1/
"enter birth date( day month year:)");
strcpy(p2/
"enter today date(day month year: )");
askfordate(p1 / &dateofbirth );
askfordate(p1 / &today );
if( today.month > dateofbirth.month ||
( today.month == dateofbirth.month &&
today.day > dateofbirth.day))
age=today.year - dateofbirth.year ;
else
age=today.year - dateofbirth.year- 1;
printf("\n the age is %d year."/age);
}
askfordate(char *prompt /
struct date *point)
{
unsigned int d/m /y ;
printf("%s"/prompt );
scanf("%d%d%d"/&d/&m/&y );
day ==d
;
ؤ>point month=m
;
ؤ>point year =y
;
ؤ>point }
نمونه اي از خروجي برنامه مثال بالا :
enter birth date(day month year:)12 12 50
enter t

خداییش اگر خوشت اومد نظر بده

دوشنبه 19/6/1386 - 22:16
کامپیوتر و اینترنت
آموزش زبان C بخش چهل هشتم
قسمت سوم

نمونه اي از خروجي برنامه مثال 2 : 1 )
<< enter a name >>
2 )<< delete a name >>
3 )<< list the file >>
4 )<< list for probation >>
5 )<< list for exelent >>
6 )<< Quit >>

Please enter your choice(1-6:)1

enter name:ali enter grade number 1:19
enter stno:123 enter unit of grade 1:2
enter number:2 enter grade number 2:18
enter unit of grade 2:3

1 )<< enter a name >>
2 )<< delete a name >>
3 )<< list the file >>
4 )<< list for probation >>
5 )<< list for exelent >>
6 )<< Quit >>

Please enter your choice(1-6:)2

enter name:reza enter grade number 1:12
enter stno:321 enter unit of grade 1:3
enter number:3 enter grade number 2:11
enter unit of grade 2:2
enter grade number 3:10
enter unit of grade 3:4

1 )<< enter a name >>
2 )<< delete a name >>
3 )<< list the file >>
4 )<< list for probation >>
5 )<< list for exelent >>
6 )<< Quit >>

Please enter your choice(1-6:)3

<< information in list are :>>
***************************************
name mead unit number stno
----- ------ ---- ---- ------
ali 18:00 5 2 123
reza 10:00 9 3 321
***************************************
press any key to continue

1 )<< enter a name >>
2 )<< delete a name >>
3 )<< list the file >>
4 )<< list for probation >>
5 )<< list for exelent >>
6 )<< Quit >>

Please enter your choice(1-6:)5

<< information in list are :>>
***************************************
name mead unit number stno
----- ------ ---- ---- ------
ali 18:00 5 2 123
***************************************
press any key to continue

1 )<< enter a name >>
2 )<< delete a name >>
3 )<< list the file >>
4 )<< list for probation >>
5 )<< list for exelent >>
6 )<< Quit >>

Please enter your choice(1-6:)4

<< information in list are :>>
***************************************
reza 10:00 9 3 321
***************************************
press any key to continue

1 )<< enter a name >>
2 )<< delete a name >>
3 )<< list the file >>
4 )<< list for probation >>
5 )<< list for exelent >>
6 )<< Quit >>

خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 22:16
کامپیوتر و اینترنت
آموزش زبان C بخش چهل هشتم
قسمت دوم

#include "stdio.h"
#include "stdlib.h"
#define MAX 100
struct student {
char name[10] ;
float mead ;
int unit ;
int number ;
int stno;
} st_info[MAX] ;
float x ;
int r=0 ;
void init_list(void)/enter(void );
void delete(void)/list(void)/list1)(/list2)(;
int menu_select(void)/find_free(void );
float sumgrade ;
int sumunit ;
int unit1/t ;
main(void)
{
char choice ;
init_list )(;
for(;;){
choice=menu_select )(;
switch(choice)
{
case 1:
enter )(;
break ;
case 2:
delete )(;
break ;
case 3:
list )(;
break ;
case 4:
list1 )(;
break ;
case 5:
list2 )(;
break ;
case 6:
exit(0 );
}
}
}
void init_list(void)
{
register int n ;
for(t=0 ; t
st_info[t].name[0]='\0' ;
}
menu_select(void)
{
char s[10] ;
int c ;
clrscr )(;
gotoxy(29/3 );
printf("1 )<< enter a name >>");
gotoxy(29/5 );
printf("2 )<< delete a name >>");
gotoxy(29/7 );
printf("3 )<< list the file >>");
gotoxy(29/9 );
printf("4 )<< list for probation >>");
gotoxy(29/11 );
printf("5 )<< list for exelent >>");
gotoxy(29/13 );
printf("6 )<< Quit >>");
do {
gotoxy(27/15 );
printf(" Please enter your " );
printf("choice(1-6 :)" );
gets(s );
c=atoi(s );
} while(c < 0 || c > 6 );
return( c );
}
void enter(void)
{
float grade ;
int slot /j ;
char s[80] ;
sumgrade=0 ;
sumunit=0 ;
slot=find_free )(;
if(slot==-1){
printf("\n list full" );
return ;
}
gotoxy(5/17 );
printf("enter name:" );
gets(st_info[slot].name );

gotoxy(5/18 );
printf("enter stno:" );
scanf("%d"/&st_info[slot].stno );

gotoxy(5/19 );
printf("enter number:" );
scanf("%d"/&st_info[slot].number );
for(j=1;j<=st_info[slot].number;j++)
{
gotoxy(40/17 );
printf(" ");
gotoxy(40/17 );
printf("enter grade number %d:"/j);
scanf("%f"/&grade );
gotoxy(40/19 );
printf(" ");
gotoxy(40/19 );
printf("enter unit of grade %d:"/j);
scanf("%d"/&unit1 );
sumgrade+=grade*unit1 ;
sumunit+=unit1 ;
}
st_info[slot].mead=sumgrade/sumunit ;
st_info[slot].unit=sumunit ;
}
find free(void)
{
register int t ;
for(t=0;st_info[t].name[0] &&
t < MAX ; ++t);
if(t==MAX )return- 1 ;
return t ;
}
void delete(void)
{
int slot ;
gotoxy(28/19 );
printf("enter record #(0 - 99:)" );
scanf("%d"/&slot );
if(slot <= 0 && slot < MAX)
st_info[slot].name[0]='\0' ;
}
void list(void)
{
char ch ;
clrscr )(;
r=0 ;
title ;
for(t=0;t<MAX;++T){
if(st_info[t].name[0])
print )(;
}
gotoxy(13/6+r );
printf("******************************");
printf("*******************************" );
gotoxy(27/7+r );
printf("press any key to continue " );
getch)(;
}
void list1(void)
{
char ch ;
r=0 ;
clrscr )(;
title )(;
for(t=0;t<MAX;++T){
if(st_info[t].name[0] && st_info[t].mead<12)
print)(
}
gotoxy(13/6+r );
printf("******************************");
printf("*******************************" );
gotoxy(27/7+r );
printf("press any key to continue " );
getch)(;
}
void list2(void)
char ch ;
r=0 ;
clrscr )(;
title )(;
for(t=0;t<MAX;++T){
if(st_info[t].name[0] && st_info[t].mead<17)
print)(
}
gotoxy(13/6+r );
printf("******************************");
printf("*******************************" );
gotoxy(27/7+r );
printf("press any key to continue " );
getch)(;
}
title)(
{
gotoxy(25/2 );
printf(" << information in list");
printf("are :>>");
gotoxy(13/3 );
printf("*************************");
printf("****************");
printf("********************");
gotoxy(10/4 );
printf(" name mead ");
printf(" unit " );
printf(" number ");
printf(" stno " );
gotoxy(10/5);
;
(" ؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤ ")printf ;
(" ؤؤؤؤؤ ")printf ;
(" ؤؤؤؤ ؤؤؤؤؤ ")printf }
print)(
{
gotoxy(14/6+r );
printf("%s "/st_info[t].name );
gotoxy(26/6+r );
printf("%.2f "/st_info[t].mead );
gotoxy(40/6+r );
printf("%d "/st_info[t].unit );
gotoxy(54/6+r );
printf("%d "/st_info[t].number );
gotoxy(70/6+r );
printf("%u "/st_info[t].stno );
r++ ;
}

خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 22:15
کامپیوتر و اینترنت
آموزش زبان C بخش چهل هشتم
قسمت اول
در زبان C تعريف اشاره گر از نوع ساختمان ، همانند تعريف ساير انواع اشاره گرها
امكان پذير است . اشاره گر ساختمان به دو منظور استفاده مي شود : 1
امكان فراخواني به روش ارجاع در توابعي كه داراي آرگومان از نوع ساختمان
هستند را فراهم مي كند . 2
براي ايجاد ليست هاي پيوندي و ساير ساختمان داده هايي كه با تخصيص حافظه
پويا سر و كار دارند بكار مي رود .
وقتي كه ساختمان ها از طريق فراخواني به روش ارجاع به توابع منتقل مي شوند
سرعت انجام عمليات بر روي آنها بيشتر مي گردد. لذا در حين فراخواني توابع بهتر
است بجاي ساختمان ، آدرس آن را منتقل نمود. عملگر& براي مشخص كردن آدرس ساختمان
( همانند ساير متغيرها ) مورد استفاده قرار مي گيرد .
تعريف اشاره گرهاي ساختمان همانند تعريف متغيرهاي ساختمان است . بااين تفاوت
كه در جلوي اسم متغير ، علامت * قرار مي گيرد. بعنوان مثال ، ساختمان زير را در
نظر بگيريد : struct bal {
float balance ;
char name[80] ;
} person ;
struct bal *p;

در مجموعه دستورات فوق ، person يك متغير ساختمان وp يك اشاره گر به ساختمان
تعريف شده است . لذا دستور p= &person;

آدرس متغير ساختمان person را در اشاره گر p قرار مي دهد . براي دسترسي به
محتويات اجزاي ساختمان از طريق اشاره گر، بايد اشاره گر را در داخل پرانتز محصور
نمود . بعنوان مثال دستور ( *p.)balance

موجب دسترسي به عنصر balance از ساختمان person ميشود. علت قرار دادن متغير
اشاره گر ساختمان در پرانتز ، اين است كه تقدم عملگر نقطه (.) از عملگر * بالاتر
است .
بطور كلي براي دسترسي به اجزاي ساختماني كه يك اشاره گر به آن اشاره مي كند
به دو روش مي توان عمل كرد : 1
ذكر نام اشاره گر در داخل پرانتز و سپس نام عنصر مورد نظر كه با نقطه از
هم جدا مي شوند ( مثل دسترسي به عنصر balance از ساختمان person توسط اشاره گر ( . p
2
ؤؤ كه روش مناسب تري است . اگر بخواهيم با استفاده از > استفاده از عملگر
ؤؤ به عنصر >عملگر balance از ساختمان person دسترسي داشته باشيم بايد به طريق
زير عمل كنيم : balance
ؤؤ > p

مثال 1: برنامه اي كه با استفاده از اشاره گرهاي ساختمان ، يك timer را شبيه
سازي مي كند .
struct tm
{
int hours ;
int minutes ;
int second ;
} ;
main)(
{
struct tm time ={0} ;
for( ;;)
{
update( &time );
display( &time );
}
}
update( struct tm *t)
{
( *t.)second ++ ;
if(( *t.)second == 60)
{
( *t.)second=0 ;
( *t.)minutes ++ ;
}
if(( *t.)minutes == 60)
{
( *t.)minutes=0 ;
( *t.)hours ++ ;
}
if(( *t.)hours==24)
( *t.)hours=0 ;
delay )( ;
}
display(struct tm *t)
{
gotoxy(70/2 );
printf("\n%2d:"/(*t.)hours );
printf("%2d:"/(*t.)minutes );
printf("%2d"/(*t.)second );
}
delay)(
{
long int t ;
for( t=1 ; t < 128000 ; ++t );
}
همانطور كه در مثال 1 مشاهده مي شود براي دسترسي به اجزاي ساختمان از عملگر *
ؤ ، تابع ()> استفاده شده است كه جهت آشنايي با عملگر update را با اين عملگر
بازنويسي مي كنيم :
update( struct tm *t)
{
second ++
;
ؤ> t
(َsecond == 60ؤ> t) if {
;
َsecond=0ؤ> t minutes ++
;
ؤ> t }

(َminutes == 60ؤ> t) if {
;
َminutes=0ؤ> t ;
hours ++ؤ> t }

(َhours==24ؤ> t) if ;
َhours=0ؤ> t delay )( ;
}

مثال 2: برنامه اي كه مشخصات مربوط به تعدادي از دانشجويان را خوانده و در
آرايه اي از ساختمان ها قرار مي دهد . مشخصات دانشجو عبارتند از: 1 نام دانشجو 2
شماره دانشجويي 3 تعداد درس ترم جاري 4 نمره هر درس . اين برنامه پس از
خواندن اطلاعات دانشجو معدل آنها را نيز محاسبه مي كند و در آرايه قرار مي دهد.
امكان حذف دانشجويي از آرايه ، مشاهده اطلاعات يك يا چند دانشجو ، پيدا كردن
دانشجويان مشروط ( معدل كمتر از 12 ) و دانشجويان ممتاز ( معدل بالاتر از 17 )
از جمله وظايف اين برنامه است .
قبل از مشاهده ليست كامل برنامه ، نمودار سلسله مراتبي آن را رسم كرده ( شكل
الف ) و وظايف هر يك از توابع را تشريح مي كنيم :

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | main )(|

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |init_list)(||delete)(|| list)(||list1)(||list2)(||enter)(||menu_select)(|

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | | |

ؤؤؤؤؤؤؤؤؤؤؤؤؤ| | ؤؤؤؤؤؤؤؤؤؤؤ |
()||find_free |ؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤ
ؤؤؤؤؤؤؤؤؤؤؤؤؤ| ||()| |print()|title |
|ؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤ | |
|
ؤؤؤؤؤؤؤؤؤؤؤ |
ؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤ |title)(| |print)(||
|
ؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤ |

ؤؤؤؤؤؤؤؤؤؤؤ
ؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤ |title)(| |print)(|

ؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤ
شكل الف . نمودار سلسله مراتبي برنامه مثال 2

وظيفه تابع ()main : تعريف بعضي از متغيرها و فراخواني توابع ديگر مطابق
نمودار سلسله مراتبي شكل الف .
وظيفه تابع init-list : در ابتداي تابع main فراخواني شده و با NULL كردن
اولين محل جزئ name ، آرايه را ارزش دهي مي كند .
وظيفه تابع ()enter : ورود اطلاعات به آرايه .
وظيفه تابع ()delete : اين تابع براي حذف ركوردهايي از آرايه مورد استفاده
قرار ميگيرد. براي اين منظور اولين محل جزئ name را برابر با NULL قرار ميدهد.
وظيفه تابع ()list : بررسي آرايه ، جهت انتقال كامل اطلاعات آن به خروجي با
استفاده از دو تابع ()title و ()print .
وظيفه تابع ()list1 : بررسي آرايه ، جهت پيدا كردن دانشجويان مشروط و انتقال
اطلاعات اين دانشجويان به خروجي ، توسط دو تابع ()title و ()print .
وظيفه تابع ()list2 : بررسي آرايه ، ئهت پيدا كردن دانشجويان ممتاز و انتقال
اطلاعات آنها به خروجي ، توسط دو تابع ()title و ()print .
وظيفه تابع ()menu-select : ظاهر نمودن منويي در صفحه نمايش جهت درخواست
انجام كار از برنامه .
وظيفه تابع ()find-free : پيدا كردن اولين محل خالي آرايه جهت قرار دادن
اطلاعات جديد در آن توسط تابع ()enter .
وظيفه تابع ()title : چاپ عنوان براي خروجي .
وظيفه تابع ()print : چاپ اطلاعات موجود در آرايه در صفحه نمايش .


خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 22:14
کامپیوتر و اینترنت
آموزش زبان C بخش چهل هفتم
ساختمانها و يا آرايه اي ازساختمان كه تاكنون در برنامه ها بكار گرفته شده اند
يا بصورت عمومي تعريف شدند و يا درتابعي كه مورداستفاده قرار مي گرفتند، تعريف
شدند . ساختمانها و يا اجزاي آنها مي توانند به عنوان آرگومان ، به تابع منتقل
شده و يا اطلاعاتي را به تابع فراخواننده برگردانند .
براي انتقال اجزاي ساختمان به تابع ، همانند يك متغير معمولي عمل مي شود .
با اين تفاوت كه نام متغير ساختمان را بايد به همراه جزئ مورد نظر، در آرگومان
تابع ذكر كرد و بايد توجه داشت كه پارامتر تابع نيز بايد همنوع با آرگومان
متناظر با آن تعريف گردد . بعنوان مثال ، ساختمان زير را در نظر بگيريد : struct student {
char x;
int ston;
char name[31];
} st1;

هر يك از دستورات زير موجب انتقال مقادير اجزاي متغير ساختمان st1 به تابعي
بنام ()func مي شوند . func( st1.x);
func( st1.ston);
func( st1.name[5]);

براي انتقال آدرس هاي اجزاي متغير ساختمان به توابع بايد از عملگر& استفاده
نمود . براي توضيح بيشتر به مجموعه زير توجه نماييد : func( &st1.x);
func( &st1.ston);
func( &st1.name[5]);
func( st1.name);

همانطور كه در مجموعه دستورات فوق مشاهده مي گردد عملگر & بايد قبل از نام
متغير ساختمان ظاهر گردد ولي در آخرين دستور ، چون name يك آرايه است ، براي
انتقال آن نيازي به عملگر & نيست .

مثال 1:
#include "stdio.h"
main)(
{
struct ss{
char name[20] ;
int x ;
} s ;
scanf("%s"/s.name );
scanf("%d"/&s.x );
test(s.name );
}
test(char *s)
{
while(*s)
{
printf("%c"/*s );
s++ ;
}
}
براي انتقال كامل متغيرهاي ساختمان به توابع بايد توجه داشت كه اين انتقال
از طريق فراخواني با ارزش ، صورت مي گيرد .
به هنگام انتقال كامل متغيرهاي ساختمان ، همنوع بودن آرگومان و پارامتر مهم
است و برنامه نويس بايد اين مطلب را در نظر داشته باشد ( مثال 2 ) .

مثال 2: برنامه اي كه چگونگي تعريف پارامتر و آرگومان هاي ساختمان را نشان
مي دهد .
main)(
{
struct {
int a/b ;
char ch ;
} arg ;
arg.a=1000 ;
func(arg );
}
func(parm)
struct {
int x/y ;
char ch ;
} parm ;
{
printf("%d"/parm.x );
}
خروجي حاصل از اجراي برنامه مثال 2 عدد 1000 است . اگر چه تعريف پارامترها
و آرگومان هاي توابع جهت انتقال ساختمان ها بصورتي است كه در مثال 2 آمده است
صحيح مي باشند . اين روش موجب طولاني شدن دستورات برنامه شده ، وقت بيشتري را
نيز مي طلبد . براي انتقال ساختمان ها به توابع بهتر است كه ساختمان ها بصورت
عمومي تعريف شوند و سپس بااستفاده از اين تعريف ، پارامترها ومتغيرهاي ساختمان
تعريف گردند . با توجه به مطالبي كه گفته شد ، مثال 2 را مي توان بصورتي كه در
مثال 3 آمده است نوشت .

مثال 3: struct struct_type {
int a/b ;
char ch ;
} ;
main)(
{
struct struct_type arg ;
arg.a=1000 ;
func(arg );
}
func(parm)
struct struct_type parm ;
{
printf("\n %d"/parm.a );
}
پارامتر parm را در تابع ()func علاوه بر آنچه كه در مثال 3 آمده است ، به
طريق زير نيز مي توان تعريف كرد : func( struct struct_type parm)


مثال 4: برنامه اي كه چگونگي انتقال كامل يك ساختمان را به تابع و انتقال
اطلاعات از طريق ساختمان به تابع فراخواننده را نشان مي دهد .
struct personel
{
char name[30] ;
int agnumb ;
} ;
main)(
{
struct personel agent1 / agent2 ;
struct personel newname )(;
agent1=newname )(;
agent2=newname )(;
list(agent1 );
list(agent2 );
}
struct personel newname)(
{
char numstr[80] ;
struct personel agent ;
printf("\n\t << New agent >> \n");
printf("Enter name: " );
gets(agent.name );
printf("\n agent number(3 digit)");
gets(numstr );
agent.agnumb=atoi(numstr );
return(agent );
}
list(age)
struct personel age ;
{
printf("\n\t<< agent: >>\n" );
printf("\n Name : %s \n"/age.name);
printf("\n agent number: ");
printf(" %3d\n"/age.agnumb );
}
نمونه اي از خروجي برنامه مثال 4 :
<< New agent >>
Enter name:reza

agent number(3 digit )213

<< New agent >>
Enter name:mohammad

agent number(3 digit )123

<< agent : >>

Name:reza

agent number: 213

<< agent : >>

Name:mohammad

a


خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 22:14
مورد توجه ترین های هفته اخیر
فعالترین ها در ماه گذشته
(0)فعالان 24 ساعت گذشته