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

توابع ، جهت انجام اعمال رياضي ، كاراكتري ، رشته اي ، مقايسه ، تبديل انواع
و غيره مورد استفاده قرار مي گيرند. در اعمال رياضي مي توان توليد اعداد تصادفي
محاسبه قدرمطلق اعداد و لگاريتم را نام برد و در اعمال كاراكتري مي توان خواند
و نوشتن كاراكترها و در مورد اعمال رشته اي مي توان انتقال رشته اي به رشته ديگر
مقايسه رشته ها و ... را نام برد . بطور كلي مي توان گفت كه توابع در زبان C از
تنوع بسيار زيادي برخوردارند .
در زبان C هر تابع داراي الگويي است كه اين الگو نوع تابع و نوع پارامترهاي
آن را مشخص مي كند . الگوي هر تابع در يك فايل header قرار دارد . ضمن بررسي
توابع ، الگوي آنهاذكر شده و فايل header كه اين الگو در آنجا قرار دارد معرفي
مي گردد . به دليل اين كه درك مفاهيم بعضي از توابع نياز به داشتن اطلاعاتي در
موضوعات مختلف است .

خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 22:30
کامپیوتر و اینترنت
آموزش زبان C بخش هفتادم
دستگاههاي ورودي خروجي استاندارد

وقتي اجراي يك برنامه به زبان C آغازميشود، 5 فايل بطور اتوماتيك بازميشوند
كه اشاره گرهاي آنها در جدول زير مشاهده مي گردند .


اشاره گر دستگاه (فايل ) نام دسگاه (فايل )


stdin
دستگاه ورودي استاندارد (صحفه كليد) stdout
دستگاه خروجي استاندارد (صفحه نمايش ) stderr
دستگاه استانداردجهت ثبت پيامهاي خطا(صفحه نمايش ) stdprn
دستگاه استاندارد چاپ (چاپگر موازي ) stdaux
پورت سري (serial port)


بعنوان مثال ، مجموعه دستورات زير را در نظر بگيريد :

putc(ch/stout );( 1)
printf(stout/%d/%d"/a/b );( 2)
fscanf(stdin/"%d/%d"/&X/&Y );( 3)

دستور (1) موجب مي شود تا كاراكتر ch در صفحه نمايش نوشته شود : دستور (2)
موجب مي شود تا متغيرهاي Xو Yو از صفحه كليد خوانده شوند .
دستگاه هاي استاندارد ورودي خروجي همانطور كه بطور اتوماتيك باز مي شوند،به
طور اتوماتيك نيز بسته خواهند شد و نياز به بستن آنها توسط برنامه نويس نيست .

خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 22:29
کامپیوتر و اینترنت
آموزش زبان C بخش شصت نهم
حل يك مسئله ازطريق فايل تصادفي

در قسمت قبلي چگونگي بازسازي يك فايل ترتيبي بررسي شد . در اين قسمت مساله
بازسازي فايل تصادفي مطرح مي گردد . در بازسازي فايل هاي ترتيبي ، فايل تراكنش
بايدمرتب باشدو داده هاي جديد درفايل ديگري قرار مي گيرند امادر بازسازي فايل هاي
تصادفي ، نيازي به اين دو مورد نيست . در فايل تصادفي ، هر ركورد با يك شماره
بنام شماره ركورد نسبي مشخص مي گردد . بعنوان مثال ، اگر فايلي داراي n ركورد
باشد، شماره ركورد نسبي از 1تا nا خواهند بود . فرمت فايل تراكنش در بازسازي
فايل تصادفي ، همانند فرمت فايل تراكنش در بازسازي فايل ترتيبي است ولي فرمت
فايل داده اصلي بصورت زير مي باشد :

نمره | درس | نام | شماره دانشجويي | وضعيت |


فيلد "وضعيت " مشخص مي كند كه آيا در اين ناحيه ركورد ، داده اي وجود دارد يا
خير . اگر اين فيلد برابر باblank باشد يعني در اين ناحيه داده اي وجود ندارد.
وگرنه ، (در اينجا اگر برابر با 1 باشد) به معني وجود داده در اين ناحيه است .
تشكيل و يا سازماندهي فايل تصادفي به روش هاي مختلفي انجام مي شود ، يك روش
اين است كه شماره دانشجويي هر دانشجو ، شماره ركورد نسبي آن نيزباشد ، بعنوان
مثال ، اگر شماره دانشجويي برابر با 1234 باشد ، شماره ركورد نسبي آن نيز1234
باشد .اين امر موجب مي شود تاناحيه ركورد زيادي ، بلااستفاده باشند . يك راه براي
رفع اين مشكل ، استفاده از يك تابع در هم سازي است و مي توان انواع مختلفي از
تابع درهم سازي راانتخاب نمود . درمثالي كه مادر نظر گرفته ايم ، شماره دانشجويي
بر بزرگترين عدداول كوچكتراز تعداد دانشجويان تقسيم شده ويك واحد به باقيمانده
تقسيم اضافه شده است (تعداد دانشجويان 100 فرض شده و97 عدد اول مورد نظرميباشد)
تا شماره ركورد نسبي بدست آيد . در اين مورد ممكن است ركوردهاي زيادي ، به يك
ناحيه از ركورد مراجعه نمايند: بعنوان مثال مقادير 1234 و 2398 به ناحيه ركورد 71
مراجعه خواهند كرد : 2398 %97 + 1 = 71
1234 %97 + 1 = 71


اگراين ناحيه ركورد قبلا" توسط 1234 اشغال شده باشد ، براي قرار دادن ركوردي
با شماره دانشجويي 2398 در فايل ، ناحيه هاي بعد از 71 جستجو مي شوند تا يك محل
خالي پيدا شده و اين ركورد در آنجا نوشته شود .
دربازسازي فايل تصادفي ،ركوردهاي تراكنش ازفايل مربوطه خوانده شده وتغييرات
مورد نظر در فايل داده اصلي اعمال مي گردند (بدون اين كه نيازي به فايل جديدي
باشد) .
ليست برنامه بازسازي فايل تصادفي : # include "stdio.h"
# define READONLY "r"
# define UPDATE "r+"
# define FALSE 0
# define TRUE 1

typedef int boolean;

# define NAMESIZE 21
# define SUBJECTSIZE 11
# define TRAILER 9999
# define ABSOLUTE 0
# define PRIME 17

# define INSERT `I'
# define DELETE `D'
# define CHANGE `C'
# define ERROR- 1
# define ABSENT 0
# define OCCUPIED `*'
# define UNOCCUPIED ` '
typedf struct {
int identification ;
char name[NAMESIZE] ;
char subject[SUBJECTSIZE] ;
int grade ;
} RECORD ;
typedef struct {
char type ;
RECORD student ;
} TRANSACTION ;
typedef struct {
char occupied ;
RECORD student ;
} MASTER ;

char *prog ;
boolean get_transaction_record)(;
int rerad_transaction_record)(;
int write_master_record)(;
int get_master_record)(;
int put_master_record)(;

int address )(;
int do_initial_status)(;
void do_final_status)(;
void apply_transaction)(;
void copy_corresponding)(;
void syserr)(/error)(;

main(argc/argv)
int argc;
char *argv[ ];

{
FILE *fpmas/*fptrans ;
int current_key /
relative_record_number ;
boolean allocated;
TRANSACTION transaction;
MASTER master ;
prog=argv[o];
if(argc !=3)
syserr(1/
"usage :%s filel file2 file3\n"/prog);

else if((fptrans=fopen( argv[1]/
READONLY))==NULL)
syserr(2/"cannot open %s\n" /argv[1];

else if((fpmas=fopen( argv[2]/
UPDATE))==NULL)
syserr(2/"cannot open %s\n"/argv[2];
else
{
get_transaction_record(fptrans/
&transaction );
current_key=choose_next_key(
transaction.srudent.identification);
while(current_key != TRAILER)
{
relative_record_number=
do_inital_status(
current_key/&allocated/
fpmas/&master );
while(current_key ==
transacrion.srudent.identification)
{
apply_transaction( &allocated/
&transacrion/&master );
get_transaction_record(fptrans/
&transacrion );
}
do_final_atatus( fpmas;
relative_record_number/
allocated/&master );
current_key=choose_next_key(
transaction.student.identification);
}
fclose(fptrans);
fclose(fpmas);
}
}

boolean get_transaction_record(fp/
transaction)
FILS *fp;
TRANSACTION *transavtion;
{
if( fscanf( fp/"%4d%c%20s%10s%2d"
&transaction->student.identification/
&transaction->type/
transaction->student.name/
transaction->student/subject/
&transaction->student.grade)==5)
return(TRUE);
else

return(FALSE);

}

int read_master_record(fp/
relative_record_number/master)
FILE *fp ;
int relative_record_number ;
MASTER *master ;
{
if(fseek(fp/
( long )relative_record_number
*sizeof(MASTER)/SEEK_SET )!=0)
{
return(ERROR );
}
else if(fread((char * )master/
sizeof(MASTER)/1/fp )!=1)
{
return(ERROR );
}
else
return(relative_record_number );
}
int write_master_record(fp/
relative_record_number/master)
FILE *fp;
int relative_record_number ;
MASTER *master ;
{
if(fseek(fp/
( long )relative_record_number
*sizeof(MASTER)/ABSOLUTE )!=0)
return(ERROR );
else if(fwrite((char * )master/
sizeof(MASTER)/1/fp )!=1)
return(ERROR );
else
return(relative_record_number );
}

int get_master_record(fp/key/master)
FILE *fp ;
int key ;
MASTER *master ;
{
int k /relative_record_number ;
relative_record_number=address(key );
for(k=o ; K
if(read_master_record(fp/
relative_record_number.master)==ERROR)
return(ERROR );
else if(maater->occupied==UNOCCUPIED
return(ABSENT );
else if(key==
master->student.identification)
return(relative_record_number );
else
relative_record_number=
relative_record_number==PRIME ? 1
: relative_record_number+1 ;
return(ABSENT );
}

int put_master_record(fp/key/master)
FILE *fp;
int key;
MASTER *master;
{
int k / relative_record_number ;
MASTER temp_master ;
relative_record_number=address(key);
FILE *fp;
boolean allocated;
int relative_record_number;
MASTER *master ;
{
int record_number=O ;
if(allocated==TRUE)
{
if(relative_record_number !=ABSENT)
{
master- > occupied=OCCUPIED ;
if(write_master_record(fp/
relative_record_number/
master)==ERROR)
syserr(21/"error writing %s\n"/
"master record");
}
else
{
master- > occupied=OCCUPIED ;
put_master_recors(record_number/fp/
master- > student.identification/
master );
}
}
else
{
master- > occupied=UNOCCUPIED ;
if(write_master_record(fp/
relative_record_number/
master)==ERROR)
syserr(22/
"error writing %s"/"master record");
}
}
void copy_correspinding(destination/
source)
RECORD *destination/*source ;
{
destination- >identification=
source- > identification;
strcpy(destination- > name/
source- > name);
strcpy(destination- > subject/
source- > subject);
destination- >grade=soure- > grade;
}
void syserr( errcode/message/argument)
int errcode;
char *message/*argument ;
{
fpritf(stderr/"%s[%2d]: "/prog/
errcode);
fprintf(stderr/message/argument);
exit(errcode);
}
void error( code/message/id)
char code;
char *message;
int id;
{
printf("%c %30s %4d\n"/code/
message/id);

خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 22:28
کامپیوتر و اینترنت
آموزش زبان C بخش شصت هشتم

دسترسي تصادفي به فايل ( ورودي خروجي تصادفي )

دربرنامه هايي كه تاكنون نوشته اند،ازسازمان فايل ترتيبي براي ذخيره وبازيابي
اطلاعات استفاده شده است . در اين قسمت چگونگي تشكيل تصادفي مطرح شده و طريقه
دسترسي به اطلاعات موجود در آنها مورد بررسي قرار مي گيرند.
براي دسترسي تصادفي به فايل هااز تابع ()fseek استفاده مي شود.الگوي اين تابع
در فايل stdio.h قرار داشته و بصورت زير مي باشد :
int fseek( FILE *fp/ long num_byte/ int origin)


اساس كار تابع ()fseek به اين صورت است كه : با شروع از يك محل در فايل كه
توسط پارامتر origin مشخص مي شود ، " موقعيت سنج فايل " را به طول num-btbyte
بايت تغيير مكان مي دهد. يعني تغييرمكان " موقعيت سنج فايل " بطور نسبي بوده و
نسبت به محلي كه توسط origin محل 100 فايل را بعنوان مبدا حركت مشخص كند و طول num-byte
برابر با 200 باشد ، " موقعيت سنج فايل " به محل 300 منتقل خواهدشد.
مقاديري كه origin مي تواند بپذيرد در جدول ذيل آمده اند .

( مبداحركت ) origin نام ماكرويي كه بيانگراين مبدااست

ابتداي فايل SEEK_SET
موقعيت فعلي فايل SEEK_CUR
انتهاي فايل SEEK_END

مقادير معتبر پارامتر origin در تابع fseek O

جدول فوق گوياي اين است كه اگرپارامتر origin برابربا SEEK_SET باشد،"موقعيت
سنج فايل " ازابتداي فايل به طول num_byte بايت به طرف انتهاي فايل حركت ميكند.
اگرپارامتر origin برابر باSEEK_CUR باشد،"موقعيت سنج فايل " نسبت به محل خودش
به اندازه num_byte بايت به طرف انتهاي فايل حركت مي كند . اگر پارامتر origin
برابر با SEEK_END باشد، " موقعيت سنج فايل " به اندازه num_byte بايت ، طول
فايل را افزايش مي دهد و سپس به اين محل اشاره مي نمايد .
محلي كه براي هر ركورد در فايل تصادفي درنظر گرفته مي شود، "ناحيه ركورد" نام
دارد . چون هر ركورد در ناحيه مربوط به خودش نوشته مي شود . ممكن است چندين
ناحيه ركورد بين ركوردهاي فايل خالي باقي بماند. به عنوان مثال ،فرض مي كنيم در
يك فايل مربوط به كارمندان ، طول ركورد 100 بوده تعداد كارمندان 5 نفر بوده و
شماره كارمندي آنها 100 ، 500 ، 600 ، 800 ، 900 باشد . پس از قرار گرفتن
مشخصات اين كارمندان درفايل ،99 ناحيه ركورد (99x100 بايت ) قبل از ركورد اول
و 399 ناحيه ركورد قبل از ركورد دوم و ... به هدر مي روند ، اين موارد را شايد
بتوان به عنوان يكي از معايب فايل تصادفي در نظر گرفت ولي معمولا" مكانيزمهايي ي بهبود اين حالت منظور مي شود .

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

شكل ( ب ) . نمودار سلسله مراتبي بازسازي فايل ترتيبي
ليست برنامه بازسازي فايل ترتيبي . # include
# define READONLY "r"
# define WRITEONLY "w"
# define FALSE 0
# define TRUE 1
typedef int boolean;

# define NAMESIZE 21
# define SUBJECTSIZE 11
# define TRAILER 9999

# define INSERT 'I'
# define DELETE 'D'
# define CHANGE 'C'

char *prog;
FILE *fopen)(
int fclose)(/fscanf)(/fprinter
boolean get_transaction_record)(
boolean get_master_record)(
boolean put_master_record)(

void do_inital_status)(
void do_final_status)(
void apply_transation)(
void copy_corresponding)(
void syserr)(/error)(

main(argc/argv)
int argc
char *argv[]
{
cgar b[21]/c[11]
int a/d
FILE *fpold/*fptrans/*fpnew
int current_key
boolean allocated
char tran_transaction
int old_identification
tran_identification
new_identification
char old_name[NAMESIZE]
tran_name[NAMESIZE]
new_name[NAMESIZE]
char old_subject[SUBJECTSIZE]
tran_subject [SUBJECTSIZE]
new_subject[SUBJECTSIZE]
int old_grede/tran_grade
new_grade

prog=argv[0]
if(argc !=4 )syserr(1/
"usage:&s file1 file2 file3\n"/prog)

else if((fpold=fopen(argv[1]/
READONLY))==NULL)
syserr(2/
"cannot open &s\n"/argv[1])
else if(( fptrans=fopen( argv[2]/
READONL))==NULL
syserr(2/"cannot open &s\n"/argv[2])
else if (( fopew=fopen( argv[3]/
WRITEONLY))==NULL
syserr(2/"cannot open &s\n"/argv[3]);
else
{
get_master_record(fpold/
&old_identification/
old_name/old_subject/&old_grade);
get_transction_record(fptrans/
&tran_identification/
&tran_transaction/
&tran_name/tran_subject/
&tran_grade
current_key=tran_identification <
old_identification ?
tran_identification:
old_identification ;
while(current_key != TRAILER)
{
do_initial_status(current_key/
&allocated/
fpold/&old_identifcation/
old_name/old_subject/&old_grade);
*new_identification'
new_name/new_sudject/&new_grade);
while(current_key==
tran_identification
{
apply_transaction( &allocated'
tran_identification/
tran_transaction/
tran_subject/tran_grade/
&new_identification/new_name/
new_subject/&new_grade);
get_transction_record(fptrans/
&tran_identification/
&tran_transaction/tran_name
tran_subject/&tran_grade/
}
do_final_status( fpnew/allocated/
new_identification/new_name/
new_subject/new_grade);
current_key=tran_identification<
old_identification ?
tran_identification:
old_identification ;
}
copy_corresponding(
&new_identification/new_name/
new_subject/&new_grade/9999/
"zzzzzzzzzzzzzzzzzzzz"/
"zzzzzzzzzz"/9);
put_master_record(fpnew/
new_identification/
new_name/new_subject/new_grade );
fclose(fpold);
fclose(fptrans);
fclose(fpnew);
}
}

boolean get_transaction_record(fp/
identification/
transaction/ name/suhject/grade)
FILE *fp;
int *identification;
char *transaction;
char *name;
char *subject;
int *grade;
{
if( fscanf( fp/ "%4d%c%20s%10%2d"/
identification/
transaction/name/subject/grade)==5)
return(TRUE);
else
return(FALSE);

}

boolean get_master_record(fp/
identification/name/subject/grede)
FILE *fp;
int *identification;
char *name;
char *subject;
int *grade;
{
if( fscanf( fp/"%4d%20s%10s%2d"/
identification/
name/sunject/grade)==4)
return(TRUE);
else
return(FALSE);

}

boolean put_master_record(fp/
identification/name/subject/grade)
FILE *fp;
int *identification;
char *name;
char *subject;
int *grade;
{
if(fprintf(fp/
"%6d %-20s %-10s %2d\n"/
identification/name/
subject/grade)!=EOF)return(TRUE);
else
return(FALSE);
}


void apply_transaction(allocated/
tran_identification/
tran_transaction/tran_name/
tran_subject/tran_grade/
new_identification/new_name/
new_subject/new_grade)
boolean *allocated;
char tran_transaction;
int tran_identification/
*new_identification;
char *tran_name/ *new_name;
char *tran_subject/ *new_subject;
int tran_grade/ *new_grade;

{
switch(tran_transaction)
{
case INSERT:
if(*allocated==TRUE)
error(INDSERT/
"record already exists\n"/
tran_identification);
else
{
copy_corresponding(
new_identification/
new_name/new_subject/
tran_grade);
*allocated=TRUE;
}
break;
case DELETE:
if(*allocated==FALSE)
error(DELETE/
"tecord dose not exist\n"/
tran_identification);
else
*allocated=FALSE;
break;
case CHANGE:
if(*allocated==FALSE)
error(CHANFE/
"record dose not exist\n"/
tran_identification);
else
copy_corresponding(
new_identification/
new_name/new_subject/
new_grade/
tran_identification/
tran-name/tran_subject/
tran_grade);
break;
}
}

void do_initial_status(current_key/
allocated/fp/old_identification/
old_name/old_subject/old_grade/
new_identificatinl/new_name/
new_subject/new_grade)
int current_key;
boolean *allocated;
FILE *fp'
int *old_identification/
*new_identification/
char *old_name/ *new_name;
char *old_subject/ *new_subject;
int *old_grade/ *new_grade;
{
if(*old_identification==current_key)
{
copy_corresponding(
new_identification/new_name/
new_subject/new_grade/
*old_identification/
old_name/old_subject/*old_grade);
*allocated=TRUE;
get_master_record(fp/
old_identification/
old_name/old_subject/old_grade);
}
else
*allocated=FALSE;
}

void do_final_status(fp/allocated/
identification/name/subject/grade)

FILE *fp;
boolean allocated;
int identification;
char *name;
char grade;
int
{
if(allocated==TRUE)
put_master_record(fp/identification/
name/subject/grade);
}

void copy_corresponding(
dest_identification/dest_name/
dest_subject/dest_grade/
sou_identification/
sou_name/sou_subject/sou_grade)
int *dest_identification/
sou_identification;
char *dest_name/ *sou_name;
char *dest_subject/ *sou_subject;
int *dest_grade/ sou_grade;
{
*dest_identification=
sou_identification;
strcpy(dest_name/sou_name);
strcpy(dest_subject/sou_subject);
*dest_grade=sou_grade;
}

void syserr( errcode/message/argument)
int errcode;
char *message/argument ;
{
fprintf(stderr/"%s[%2d]:"/prog/
errcode);
fprintf(stderr/message/argument);
exit(errcode);
}

void error( code/message/id)
char code;
char *message;
int id;
{
printf("%c %30s %4d\n"/
code/message/id);
}
اجراي برنامه بازسازي فايل ترتيبي و محتويات فايل هاي داده :

فايل new 2345 ahmad pascal 20
3456 reza c 19
4567 richie c 20
5678 jafar c 14
9999 zzzzzzzzzzzzzzzzzzzz zzzzzzzzzz 9

فايل old 1234ali pascal 15
2345ahmad pascal 18
3456reza c 19
5678jafar c 14
6789jafar pascal 13
9999zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 9

فايل trans 2345cahmad pascal 20
4567Irichie c 20
6789Kjalal pascal 13
9999zzzzzzzzzzzzzzzzzzz
خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 22:27
کامپیوتر و اینترنت
آموزش زبان C بخش شصت هفتم
قسمت اول
حل يك مساله از طريق فايلهاي ترتيبي

تاكنون با نحوه تشكيل فايل هاي ترتيبي و چگونگي دسترسي به اطلاعات موجود در
آن آشنا شده ايم . اكنون مساله پيچيده تري را در نظر مي گيريم : يك فايل داده به
نام old حاوي اطلاعات مربوط به دانشجويان است كه بايد بازسازي گردد . منظور از
بازسازي فايل ، حذف ركورد ، تغيير ركورد و يا اضافه نمودن ركورد جديدي به فايل
است . فرمت ركوردهاي فايل old بصورت زير مي باشد :
نمره | درس | نام دانشجو | شماره دانشجويي |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 4 20 10 2


نمونه اي از اطلاعات موجود در فايل old بصورت زير است :

نمره نام درس نام دانشجو فيلد كليد ( شماره دانشجويي )
ؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1234 Ali pascal 15
2345 Ahmad pascal 19
3456 Reaz C 18
5678 Jafar C 14
6789 Jalal pascal 13
9999 zzzz zzzz 9


براي بازسازي فايل old ركوردهاي تراكنش در فايلي بنام trans قرار دارند .
فرمت ركوردهاي اين فايل بصورت زير مي باشد :
|
نمره | درس | نام دانشجو | تراكنش | شماره دانشجويي |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 4 1 20 10 2

در فرمت فوق ، تراكنش مشخص مي كند كه ركورد بايد حذف ، اضافه و يا تغيير
نمايد . اگر تراكنش برابر با I ركورد بايد اضافه گردد ، اگر برابر با D باشد
ركورد بايد حذف گردد و اگر برابر با C باشد ركورد بايد تغيير نمايد .

نمونه اي از محتويات فايل trans بصورت زير است .

نمره نام درس نام دانشجو نوع تغييرات فيلد كليد ( شماره دانشجويي )
ؤؤؤؤ ؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 20
pascal Ahmad تغيير محتويات ركورد 2345 20
C Ritchie اضافه 4567 13
pascal Jalal حذف 6789 9999 zzz zzz zzz 9


نتيجه حاصل از تركيب دو فايل oldو transو فايل جديدي بنام new است كه حاوي
جديدترين اطلاعات مي باشد و محتويات آن بصورت زير است :

نمره نام درس نام دانشجو فيلد كليد ( شماره دانشجويي )
ؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ 1234 Ali pascal 15
2345 Ahmad pascal 20
3456 Reaz C 19
4567 Ritchie C 20
5678 Jafar C 14
9999 zzz zzz 18


چگونگي تركيب فايل هاي oldو transو و تشكيل فايل new در شكل ( الف ) مشاهده
مي گردد .
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
گزارش خطا | | فايل old | o
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤ ؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
ؤ >ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ<ؤ|
برنامه بازسازي |
ؤ >ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ<ؤ
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤ ؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
فايل new | n | فايل | tatrans
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
شكل ( الف ) . بازسازي فايل ترتيبي

همانطور كه در شكل ( الف ) مشاهده مي گردد ، اگر در حين بازسازي خطايي رخ
دهد ، مثلا" ركوردي كه در فايل old وجود نداشته باشد ولي سعي در حذف آن داشته
باشيم ، پيام خطاي مناسبي در صفحه نمايش چاپ مي شود . شكل ( ب ) نمودار سلسله
مراتبي برنامه بازسازي فايل ترتيبي را نشان مي دهد .
ؤؤؤؤؤؤؤؤؤؤؤؤ | main )(|

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

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

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ|ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |syserr)(|||get_master_record||||get_transaction_record||do_nintial_status|

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ|ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
ؤؤؤؤؤؤؤؤؤؤ | |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | |
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |apply_transaction||do_final_status||copy_corresponding||put_master_record||
|
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ |
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | | | | |

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ| ؤؤؤؤؤؤؤ ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ||copy_corresponding|| |error| |||copy_corresponding|| |get_master_record|

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

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ || put_master_record ||

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

براي آشنايي با نحوه عملكرد برنامه ، نتيجه دوبار اجراي آن را در زير مشاهده
مي كنيد :
نتيجه حاصل از اجراي اول :
E )enter data
D )display on screan
L )load file
S )save in file
Q )quit
enter your select:e
<< INPUT DATA >>
name stno grade sex(1/2)
-------- ----- ---- ------
reza 123 12.4 1
mohammad 321 16.6 1
mina 543 11.5 2

E )enter data
D )display on screan
L )load file
S )save in file
Q )quit
enter your select:d
<< OUTPUT DATA >>
name stno grade sex(1/2)
-------- ----- ---- ------
reza 123 12.4 1
mohammad 321 16.6 1
mina 543 11.5 2
press a key...

E )enter data
D )display on screan
L )load file
S )save in file
Q )quit
enter your select:s
data saved.press a key.

E )enter data
D )display on screan
L )load file
S )save in file
Q )quit
enter your select:q


نتيجه حاصل از اجراي دوم :
E )enter data
D )display on screan
L )load file
S )save in file
Q )quit
enter your select:l
data loaded.press a key.

E )enter data
D )display on screan
L )load file
S )save in file
Q )quit
enter your select:d
<< OUTPUT DATA >>
name stno grade sex(1/2)
-------- ----- ---- ------
reza 123 12.4 1
mohammad 321 16.6 1
mina 543 11.5 2
press a key...

E )enter data
D )display on screan
L )load file
S )save in file

خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 22:26
کامپیوتر و اینترنت
آموزش زبان C بخش شصت ششم
قسمت اول
همانطوركه تاكنون مشاهده گرديد توابع زيادي براي انجام اعمال ورودي خروجي
فايل وجود دارند . دو تابع ()fprintf و ()fscanf براي نوشتن و خواندن انواع
مختلفي از داده ها و با فرمت هاي متفاوت بر روي فايل بكار مي روند . البته اين
دو تابع از سرعت كمي برخوردارند كه توصيه مي شود از آنها استفاده نگردد . براي
ورودي خروجي ركورد و همچنين ساير ورودي خروجيها ميتوان از دو تابع ()fread
و ()fwrite استفاده نمود كه از سرعت بالايي برخوردارند . الگوي اين توابع در
فايل stdio.h قرار داشته و بصورتهاي زير مي باشند :
int fread( void *buffer/ int num_byte/ int count/ FILE *fp)
int fwrite( void *buffer/ int num_byte/ int count/ FILE *fp)
در الگوهاي فوق ، پارامتر buffer در مورد تابع fread به ساختمان داده يا
متغيري اشاره مي كند كه داده هاي خوانده شده از فايل بايد در آن قرار گيرند و
اين پارامتر تابع ()fwrite به محلي از حافظه اشاره مي كند كه داده هاي موجود در
آن محل بايد در فايل نوشته شوند . پارامتر num_byte در هر دو تابع طول داده اي
كه بايد خوانده يا نوشته شود را مشخص مي كند . پارامتر count تعداد عناصري است
كه طول آن توسط num_byte مشخص مي گرديد و بايد در فايل نوشته و يا از فايل
خوانده شوند . اشاره گر fp به فايلي اشاره مي كند كه توابع freadو fwriteو بايد
بر روي آنها عمل كنند . بعنوان مثال مجموعه دستورات زير را در نظر بگيريد :
char table [20];( 1)
char arr [10];( 2)
fwrite( table/ sizeof( char)/ 20/ fp);( 3)
fread( arr/ sizeof( char)/ 10/ fp);( 4)
دستورات (1) و (2) رشته هايي به طول هاي 20 و 10 را تعريف مي كنند . دستور
(َ3) ، 20 بايت از اطلاعات موجود در آرايه table را در فايلي كه fp به آن اشاره
مي كند مي نويسد . دستور (4) تعداد 10 بايت از اطلاعات را از فايلي كه fp به آن
اشاره مي كند خوانده و در متغير arr قرار مي دهد . توابع ()fread و ()fwrite
بيشتر در ورودي خروجي ركورد مورد استفاده قرار مي گيرند .

مثال 1: برنامه اي كه نام ، تعداد ساعت كار و حق الزحمه ساعتي كارمندان
موسسه اي را دريافت كرده و در يك فايل قرار ميدهد و سپس بااستفاده ازاين اطلاعات
حقوق آنها را محاسبه كرده و به خروجي منتقل مي كند .
#include "stdio.h"
#include "stdlib.h"
main)(
{
FILE *p;
char numstr[10];
int i / salary ;
struct em
{
char name [10] ;
int hp;
int h;
} emp ;
clrscr )(;
p=fopen("employ.dat"/"wb+" );
if( p==NULL)
{
printf("cannot open output file");
printf("\n press a key... " );
getch )(;
exit(1 );
}
gotoxy(14/2 );
puts("<< data entry >>");
gotoxy(3/3 );
printf(" name hour pay");
printf(" hour " );
gotoxy(3/4 );
printf("--------- ----------");
printf("------ ");
i=5 ;
while( 1)
{
gotoxy(3/i );
gets(emp.name);
if(!emp.name[0])
break ;
gotoxy(21/i );
gets(numstr );
emp.hp=atoi(numstr );
gotoxy(34/i );
gets(numstr );
emp.h=atoi(numstr );
i++ ;
fwrite(&emp/sizeof(struct em)/1/p);
}
rewind(p );
clrscr)(;
gotoxy(7/2 );
puts(" << OUTPUT >> " ) ;
gotoxy(3/3 );
puts(" name salary ");
gotoxy(3/4 );
puts("-------- -----------");
i=5 ;
fread(&emp / sizeof(struct em)/1/p);
while(!feof(p))
{
gotoxy(3/i );
puts(emp.namp);
gotoxy(21/i );
printf("%d"/ emp.hp*emp.h );
i++ ;
fread(&emp/sizeof(struct em)/1/p);
}
gotoxy(6/++i );
puts("press a key... ");
getch )(;
}
نمونه اي از خروجي برنامه مثال 1 :
<< data entry >>
name hour pay hour
------ ---------- --------
ali 120 100
reza 500 50
ahmad 200 10

<< OUTPUT >>
name salary
-------- ----------
ali 12000
reza 25000
ahmad 2000

press a key...

مثال 2: برنامه اي كه يك بانك اطلاعاتي از دانشجويان تشكيل مي دهد . اطلاعاتي
در بانك قرار مي گيرند عبارتند از : نام دانشجو ، شماره دانشجويي ، نمره و
جنسيت دانشجو .
قبل از مشاهده ليست برنامه بهتر است نگاهي به نمودار سلسله مراتبي برنامه و
وظايف توابع داشته باشيم :
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | main )(|

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

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ||init_list)(||| menu )(|| enter )(||display )(|| save )(|| load )(|

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

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ||init_list)(||

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

وظيفه تابع ()main : فراخواني توابع مطابق شكل ( الف ) .
وظيفه تابع init-lslist : مقداردهي اوليه به ليست ( باNULL كردن اولين كاراكتر ( . name

وظيفه تابع ()menu : ظاهر نمودن منويي در صفحه نمايش .
وظيفه تابع ()enter : اخذ اطلاعات از صفحه كليد و قرار دادن آن در ليست .
وظيفه تابع ()display : چاپ محتويات ليست در صفحه نمايش .
وظيفه تابع ()save : انتقال محتويات ليست به فايل .
وظيفه تابع ()load : انتقال اطلاعات از فايل به ليست .


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


ليست برنامه مثال 2 :
#include "stdio.h"
#include "stdlib.h"
#define SIZE 100
struct student
{
char name [10] ;
int stno / sex ;
float grade ;
} list[SIZE] ;
int menu(void );
void init_list(void )/ enter(void );
void display(void )/ save(void );
void load(void );
main)(
{
char chois ;
init_list)(;
for(;;)
{
switch(menu))(
{
case 'e':
enter)(;
break;
case 'd':
display)(;
break;
case 's':
save )(;
break;
case 'i':
load )(;
break ;
case 'q':
exit(0 );
}
}
}
void init_list(void)
{
register int t ;
for( t=0 ; t < SIZE ; t++)
*list[t].name='\0' ;
}
void enter(void)
{
register int i ;
int row ;
char numstr[10];
for( i=0 ; i < SIZE ; i++)
if( !list[i].name)
break ;
if(i==SIZE)
{
printf("\n list is full " );
printf("press a key... " );
getch )(;
}
clrscr )(;
gotoxy(10/2 );
puts("<< INPUT DATA >>");
gotoxy(1/3 );
printf(" name stno ");
printf(" gread sex(1/2)" ) ;
gotoxy(1/4 );
puse( "-- ----- ------- ");
printf("------- -----" );
row=5 ;
for(;;)
{
gotoxy(1/row);
gets(list[i].name);
if(!list[i].name[0]);
break ;
gotoxy(12/row);
gets(numstr );
list[i].stno=atoi(numstr );
gotoxy(20/row);
gets(numstr );
list[i].grade=atoi(numstr );
gotoxy(30/row);
gets(numstr );
list[i].sex=atoi(numstr );
row ++ ;
i ++ ;
}
}
void display(void)
{
register int t ;
int row ;
clrscr )(;
gotoxy(10/2 );
puts("<< OUTPUT DATA >> " );
gotoxy(1/3 );
printf(" name stno gread ");
printf(" sex(1/2)" );
gotoxy(1/4 );
puse( " ----- ---- ------- ");
printf("--------" );
row=5 ;
for( t=0 ; t < SIZE ; t++)
{
if(*list[t].name)
{
gotoxy(1/row);
printf("%s"/list[t].name);
gotoxy(12/row);
printf("%d"/list[t].stno);
gotoxy(20/row);
printf("%.2f"/list[t].grade );
gotoxy(30/row);
printf("%d"/list[t].sex );
row ++ ;
}
}
gotoxy(5/row+2);
printf(" press a key... ");
getch )(;
}
void save(void)
{
FILE *fp ;
register int i ;
fp=fopen("st"/wb");
if(fp==NULL)
{
printf("\n cannot open file");
printf("\n press a key... ");
getch )(;
return ;
}
for(i=0 ; i < SIZE ; i++)
if(*list[i].name)
fwrite(&list[i]/
sizeof(struct student)/1/fp );
clrscr )(;
gotoxy(20/10 );
printf("data saved.press a key.");
getch )(;
}
void load(void)
{
FILE *fp ;
register int i ;
fp=fopen("st"/rb");
if(fp==NULL)
{
printf("\n cannot open file");
printf("\n press a key... ");
getch )(;
return ;
}
init_list )(;
for(i=0 ; i < SIZE ; i++)
{
fread(&list[i]/
sizeof(struct student)/1/fp);
if(feof(fp))
{
clrscr )(;
gotoxy(20/10 );
printf("data loaded.press a key.");
getch )(;
return ;
}
}
}
menu(void)
{
char s[80] ;
clrscr )(;
do {
gotoxy(20/4);
printf("E )enter data ");
gotoxy(20/6);
printf("D )display on screan");
gotoxy(20/8);
printf("L )load file");
gotoxy(20/10);
printf("S )save in file");
gotoxy(20/12);
printf("Q )quit");
gotoxy(20/14);
printf("enter your select:");
gets(s );
}while(!strchr("edlsq"/tolower(*s)));
return tolower(*s );
}
در برنامه مثال 2 از تابع ()tolower استفاده شده است .
براي آشنايي با نحوه عملكرد برنامه ، نتيجه دوبار اجراي آن را در زير مشاهده
مي كنيد :
نتيجه حاصل از اجراي اول :
E )enter data
D )display on screan
L )load file
S )save in file
Q )quit
enter your select:e
<< INPUT DATA >>
name stno grade sex(1/2)
-------- ----- ---- ------
reza 123 12.4 1
mohammad 321 16.6 1
mina 543 11.5 2

E )enter data
D )display on screan
L )load file
S )save in file
Q )quit
enter your select:d
<< OUTPUT DATA >>
name stno grade sex(1/2)
-------- ----- ---- ------
reza 123 12.4 1
mohammad 321 16.6 1
mina 543 11.5 2
press a key...

E )enter data
D )display on screan
L )load file
S )save in file
Q )quit
enter your select:s
data saved.press a key.

E )enter data
D )display on screan
L )load file
S )save in file
Q )quit
enter your select:q


نتيجه حاصل از اجراي دوم :
E )enter data
D )display on screan
L )load file
S )save in file
Q )quit
enter your select:l
data loaded.press a key.

E )enter data
D )display on screan
L )load file
S )save in file
Q )quit
enter your select:d
<< OUTPUT DATA >>
name stno grade sex(1/2)
-------- ----- ---- ------
reza 123 12.4 1
mohammad 321 16.6 1
mina 543 11.5 2
press a key...

E )enter data
D )display on screan
L )load file
S )save in file

خداییش اگر خوشت اومد نظر بده
دوشنبه 19/6/1386 - 22:25
کامپیوتر و اینترنت
آموزش زبان C بخش شصت پنجم
قسمت اول
همانطوركه تاكنون مشاهده گرديد توابع زيادي براي انجام اعمال ورودي خروجي
فايل وجود دارند . دو تابع ()fprintf و ()fscanf براي نوشتن و خواندن انواع
مختلفي از داده ها و با فرمت هاي متفاوت بر روي فايل بكار مي روند . البته اين
دو تابع از سرعت كمي برخوردارند كه توصيه مي شود از آنها استفاده نگردد . براي
ورودي خروجي ركورد و همچنين ساير ورودي خروجيها ميتوان از دو تابع ()fread
و ()fwrite استفاده نمود كه از سرعت بالايي برخوردارند . الگوي اين توابع در
فايل stdio.h قرار داشته و بصورتهاي زير مي باشند :
int fread( void *buffer/ int num_byte/ int count/ FILE *fp)
int fwrite( void *buffer/ int num_byte/ int count/ FILE *fp)
در الگوهاي فوق ، پارامتر buffer در مورد تابع fread به ساختمان داده يا
متغيري اشاره مي كند كه داده هاي خوانده شده از فايل بايد در آن قرار گيرند و
اين پارامتر تابع ()fwrite به محلي از حافظه اشاره مي كند كه داده هاي موجود در
آن محل بايد در فايل نوشته شوند . پارامتر num_byte در هر دو تابع طول داده اي
كه بايد خوانده يا نوشته شود را مشخص مي كند . پارامتر count تعداد عناصري است
كه طول آن توسط num_byte مشخص مي گرديد و بايد در فايل نوشته و يا از فايل
خوانده شوند . اشاره گر fp به فايلي اشاره مي كند كه توابع freadو fwriteو بايد
بر روي آنها عمل كنند . بعنوان مثال مجموعه دستورات زير را در نظر بگيريد :
char table [20];( 1)
char arr [10];( 2)
fwrite( table/ sizeof( char)/ 20/ fp);( 3)
fread( arr/ sizeof( char)/ 10/ fp);( 4)
دستورات (1) و (2) رشته هايي به طول هاي 20 و 10 را تعريف مي كنند . دستور
(َ3) ، 20 بايت از اطلاعات موجود در آرايه table را در فايلي كه fp به آن اشاره
مي كند مي نويسد . دستور (4) تعداد 10 بايت از اطلاعات را از فايلي كه fp به آن
اشاره مي كند خوانده و در متغير arr قرار مي دهد . توابع ()fread و ()fwrite
بيشتر در ورودي خروجي ركورد مورد استفاده قرار مي گيرند .

مثال 1: برنامه اي كه نام ، تعداد ساعت كار و حق الزحمه ساعتي كارمندان
موسسه اي را دريافت كرده و در يك فايل قرار ميدهد و سپس بااستفاده ازاين اطلاعات
حقوق آنها را محاسبه كرده و به خروجي منتقل مي كند .
#include "stdio.h"
#include "stdlib.h"
main)(
{
FILE *p;
char numstr[10];
int i / salary ;
struct em
{
char name [10] ;
int hp;
int h;
} emp ;
clrscr )(;
p=fopen("employ.dat"/"wb+" );
if( p==NULL)
{
printf("cannot open output file");
printf("\n press a key... " );
getch )(;
exit(1 );
}
gotoxy(14/2 );
puts("<< data entry >>");
gotoxy(3/3 );
printf(" name hour pay");
printf(" hour " );
gotoxy(3/4 );
printf("--------- ----------");
printf("------ ");
i=5 ;
while( 1)
{
gotoxy(3/i );
gets(emp.name);
if(!emp.name[0])
break ;
gotoxy(21/i );
gets(numstr );
emp.hp=atoi(numstr );
gotoxy(34/i );
gets(numstr );
emp.h=atoi(numstr );
i++ ;
fwrite(&emp/sizeof(struct em)/1/p);
}
rewind(p );
clrscr)(;
gotoxy(7/2 );
puts(" << OUTPUT >> " ) ;
gotoxy(3/3 );
puts(" name salary ");
gotoxy(3/4 );
puts("-------- -----------");
i=5 ;
fread(&emp / sizeof(struct em)/1/p);
while(!feof(p))
{
gotoxy(3/i );
puts(emp.namp);
gotoxy(21/i );
printf("%d"/ emp.hp*emp.h );
i++ ;
fread(&emp/sizeof(struct em)/1/p);
}
gotoxy(6/++i );
puts("press a key... ");
getch )(;
}
نمونه اي از خروجي برنامه مثال 1 :
<< data entry >>
name hour pay hour
------ ---------- --------
ali 120 100
reza 500 50
ahmad 200 10

<< OUTPUT >>
name salary
-------- ----------
ali 12000
reza 25000
ahmad 2000

press a key...

مثال 2: برنامه اي كه يك بانك اطلاعاتي از دانشجويان تشكيل مي دهد . اطلاعاتي
در بانك قرار مي گيرند عبارتند از : نام دانشجو ، شماره دانشجويي ، نمره و
جنسيت دانشجو .
قبل از مشاهده ليست برنامه بهتر است نگاهي به نمودار سلسله مراتبي برنامه و
وظايف توابع داشته باشيم :
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤ | main )(|

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

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ
ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ||init_list)(||| menu )(|| enter )(||display )(|| save )(|| load )(|

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

ؤؤؤؤؤؤؤؤؤؤؤؤؤؤؤ ||init_list)(||

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

وظيفه تابع ()main : فراخواني توابع مطابق شكل ( الف ) .
وظيفه تابع init-lslist : مقداردهي اوليه به ليست ( باNULL كردن اولين كاراكتر ( . name

وظيفه تابع ()menu : ظاهر نمودن منويي در صفحه نمايش .
وظيفه تابع ()enter : اخذ اطلاعات از صفحه كليد و قرار دادن آن در ليست .
وظيفه تابع ()display : چاپ محتويات ليست در صفحه نمايش .
وظيفه تابع ()save : انتقال محتويات ليست به فايل .
وظيفه تابع ()load : انتقال اطلاعات از فايل به ليست .

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