آموزش توربو سی بخش ششم

آموزش توربو سی بخش ششم

توسط amin8505 | گروه مقاله های آموزشی | 1394/07/06

نظرات 0

 توابع ورودی و خروجی


زبان C با مجموعه‌اي از توابع كتابخانه‌اي همراه است كه تعدادي از آنها تابع ورودي و خروجي مي‌باشند. برخي از اين توابع متداول كه اغلب در كتابخانه يا فايل "stdio.h" قرار دارند در اين فصل مورد بررسي قرار مي‌گيرند .

     توابع فرمت دارscanf  و printf  اجازه انتقال اطلاعات ميان كامپيوتر و دستگاههاي ورودي و خروجي استاندارد را مي‌دهند. دو تابع getchar  وputchar  موجب انتقال يك كاراكتر به حافظه و بالعكس مي‌گردد. دو تابع gets و puts نيز ورود و خروج رشته‌ها را ساده‌تر مي‌سازند.
    برخي از توابع ورودي و خروجي،‌ نياز به آرگومان ندارند . بعضي از اين توابع مقداري را برنمي‌گردانند. برخي بصورت مستقل بكار برده شوند و برخي ممكن است در داخل عبارات و دستورها بكار برده شوند. 

توابع ورودي و خروجي فرمت‌دار  
    دو تابع scanf  و printf  (كه با آنها آشنا هستيد)، توابع فرمت‌دار هستند كه مي‌توانند روي هر نوع داده‌اي از نوع توكار يا built-in  عمل نمايند . اين داده ها ، داده‌هايي هستند كه ساختار آنها به‌صورت پيش‌فرض براي كامپايلر شناخته شده است، مانند داده‌هاي از نوع اعداد، كاراكتر و رشته . اصطلاح فرمت‌دار يا formantted به اين مفهوم است كه اين توابع مي‌توانند داده‌ها را در فرمتهاي مختلف كه تحت كنترل شماست، بخوانند و بنويسند. تابع printf  براي نوشتن داده‌هايي روي كنسول  كه به‌طور متعارف، صفحه نمايش تصوير يا مونيتور است، بكار برده مي‌شود. تابع scanf كه مكمل تابع printf است، داده‌ها را از صفحه كليد مي‌خواند. 

تابع  printf( ) 
     اين تابع مي‌تواند به تعداد دلخواه آرگومان بپذيرد كه آرگومان اول داراي مفهوم خاص است و رشته فرمت  format string و يا رشته كنترل control string ناميده مي‌شود. رشته كنترل در داخل زوج گيومه يا double quotation قرار مي‌گيرد و مشخص مي‌كند كه بايد چند قلم آرگومان داده چاپ شود و فرمت آنها چگونه است. فرم كلي اين تابع بصورت زير است : 
printf ("control string", arguments list) ;
و يا :
printf ("control string", arg1, arg2,…, argn) ;
رشته كنترل دربردارنده دو نوع اقلام داده است. نوع اول شامل رشته يا كاراكترهايي است كه به همان صورت روي صفحه تصوير، نمايش داده خواهد شد و نوع دوم شامل فرامين فرمت است كه با علامت "%" آغاز مي‌گردد كه به دنبال آن كد فرمت و يا مشخص‌كننده فرمت مي‌آيد. فرمان فرمت، قالب يا فرمت و تعداد متغيرها يا آرگومانهايي را كه بايد چاپ شوند، مشخص مي‌سازد و به آن type conversion نيز مي‌گويند و در آن براي مشخص ‌ساختن فرمت هر آرگومان يك گروه از كاراكترها كه با "%" آغاز مي‌گردند، بكار مي‌روند .
برخي مؤلفين كد فرمت را ، فرامين فرمت نيز مي‌گويند .
ليست كد يا فرامين فرمت كه در فرمان printf  بكار برده مي‌شود، در جدول زير نشان داده شده است .

ليست فرامين فرمت براي خروجي به‌وسيلة تابع printf ( )

معني و مفهوم فرمان فرمت 

كد

داده،‌ بصورت تك‌كاراكتر نمايش داده مي‌شود.                                           

%c

داده، بصورت عدد صحيح علامت‌دار نمايش داده مي‌شود.                  

%d

داده،‌ بصورت عدد صحيح علامت‌دار نمايش داده مي‌شود.                   

%i

داده، بصورت عدد اعشاري، مميز شناور و بدون نما يا توان نمايش داده مي‌شود.

%f

داده، بصورت floating-point ولي به فرم نمايي يا علمي نمايش داده مي‌شود.

%e

داده، بصورت floating-point به فرم %f يا %e (هركدام كوتاهتر باشد) نمايش داده مي‌شود.

%g

داده،‌ بصورت عدد صحيح بدون علامت نمايش داده مي‌شود.               

%u

داده،‌ بصورت رشته نمايش داده مي‌شود.    

%s

داده، بصورت عدد صحيح در مبناي 8 نمايش داده مي‌شود.                     

%o

داده، بصورت عدد صحيح در مبناي 16 و بدون علامت،‌ نمايش داده مي‌شود.  

%x

پيشوندي كه با %o , %x , %u , %d براي معرفي مقدار صحيح بلند يا طولاني بكار برده مي‌شود. (مثل ld)

L

در مورد داده از نوع اشاره‌گر بكار برده مي‌شود .                                          

%p

يك علامت % چاپ مي‌كند كه در توربو c وجود دارد .                                    

%%

 
مثال - خروجي برنامه زير :
#include<stdio.h>
main ( )
   {
     float  A=2 , B=3.0 ;
     printf("%f %f %f %f ", A , B , A+B , B/A) ;
   }
بصورت زير خواهد بود :
2.000000 3.000000 5.000000 1.500000
توجه داشته باشيد كه آرگومانهاي اول و دوم تك‌متغير مي‌باشند. ولي آرگومانهاي سوم و چهارم عبارات محاسباتي هستند كه اول مقدار آنها محاسبه مي‌گردد و سپس نتيجه، براساس كد فرمت مربوط چاپ مي‌شود.

مثال - در قطعه برنامه زير مقادير متغيرهايي از نوعهاي مختلف چاپ مي‌گردد.
#include<stdio.h>
main ( )
   {
      int  st_no =21385 ;
      char  st_name[16] = {"book"};
      float   grade =14.25 ;
      printf(" %d %s %f " , st_no , st_name , grade) ;
   }

اولي عدد صحيح، دومي آرايه‌هاي از نوع كاراكتر يا به عبارت ديگر رشته (رشته‌ها بعداٌ مورد بررسي قرار خواهد گرفت) و سومي از نوع floating point است كه به ترتيب با فرمان فرمت %f, %s, %d مشخص شده‌اند. خروجي دستور مزبور بصورت زير خواهد بود.
21385  book  14.25
در برنامه مذكور به‌علت وجود يك محل خالي بين فرامين فرمت در رشته كنترل، بين مقادير چاپ شده نيز يك فضاي خالي ايجاد گرديد. 
مثال - در برنامه زير، هر دو دستور printf داراي آرگومانهاي يكسان هستند؛ ولي در اولي با فرمان فرمت %f و در دومي با فرمان فرمت %e معرفي شده‌اند (وجود "\n" به تعداد دو بار در اولي، موجب ايجاد يك سطر خالي، بين خروجي دو دستور مي‌گردد).
#include<stdio.h>
main ( )
  {
    double  A=5000.0 , B=0.0025 ;
    printf(" %f %f %f %f\n\n ", A , B , A*B , A/B) ;
    printf(" %e %e %e %e ", A , B , A*B , A/B) ;
  }
و خروجي برنامه مزبور بصورت زير خواهد بود:
5000.000000 0.002500 12.500000 2000000.000000
5.000000e+03 2.500000e-03 1.250000e+01 2.000000e+06
در سطر اول مقادير A/B , A*B , B , A به فرم استاندارد floating point نشان داده شده، درحالي‌كه در سطر دوم همان مقادير، به‌ علت استفاده از فرمان فرمت "%e"، به فرم نمايش علمي، يعني با نما ظاهر شده است.
ملاحظه كنيد كه هر مقدار تا 6 رقم دقت، پس از نقطه اعشار نمايش داده شده است. به هرحال اين تعداد ارقام را مي‌توان، با قرار دادن ميزان دقت در رشته كنترلي (كه بعد بيان خواهد شد) تغيير داد.
       در فرمان فرمت مي‌توان حداقل پهناي ميدان و تعداد ارقام اعشار، يعني ارقام بعد از مميز را نيز مشخص كرد. همچنين مي‌توان تعيين كرد كه اطلاعات خروجي از سمت چپ ميدان چاپ (يعني فضاي تعيين شده براي چاپ) تراز گردند (در حالت عادي اطلاعات رشته‌اي از طرف چپ و اطلاعات عددي از سمت راست ميدان تراز مي‌شوند). حداقل طول ميدان را مي‌توان با قرار دادن يك عدد صحيح مانند m (به‌عنوان مشخص‌كننده حداقل فضاي لازم) بين علامت % و كد فرمت مشخص كرد. اين كار موجب مي‌گردد كه اگر طول ميدان بيشتر از طول مورد نياز براي اطلاعات خروجي باشد، فضاي اضافي ، خالي يا blank باقي بماند. ولي اگر طول رشته يا عدد بزرگتر از طول پيش‌بيني شده براي آن باشد، طول پيش‌بيني شده ناديده گرفته شود و اطلاعات بطور كامل نمايش داده شود. اگر بخواهيد در مورد اطلاعات عددي فضاي اضافي با صفر پر شود، سمت چپ عدد m رقم "0" را قرار دهيد. براي مثال %05d موجب مي‌گردد كه اگر مقدار چاپ شده از پنج رقم كمتر باشد، سمت چپ آن به تعداد لازم صفر قرار گيرد بطوري كه مقدار چاپ شده پنج‌رقمي باشد.
در مورد مقادير floating point براي مشخص ساختن تعداد ارقام بعد از مميز، بايد پس از عدد مشخص‌كننده طول ميدان، علامت مميز "." پس از آن نيز يك عدد كه معرف تعداد ارقام اعشار خواهد بود، قرار داد. براي مثال كد فرمت %10.4f عدد را كه با حداقل ده كاراكتر پهناي ميدان و با چهار محل براي ارقام اعشار (ارقام بعد از مميز) نمايش خواهد داد.

مثال - به برنامه زير دقت کنيد :
#include<stdio.h>
main ( )
  {
     int  i = 12345 ;
     float  x =345.125 ;
     printf("3d %5d %8d\n\n", i , i , i) ;
     printf("%3f %10f %13f\n\n", x , x , x) ;
     printf("%3e %10e %13e\n\n", x , x , x) ;
  }
و خروجي برنامه فوق بصورت زير خواهد بود :
12345  12345    12345
345.125000  345.125000    345.125000
3.45125e+02  3.45125e+02    3.45125e+02
 
در سطر اول، خروجي با استفاده از مينيمم پهناي فيلد (به طول سه كاراكتر، پنج كاراكتر و هشت كاراكتر) چاپ شده است. در هر فيلد تمامي عدد بطور كامل نمايش داده شده است، اگرچه طول ميدان پيش‌بيني شده كمتر از عدد مورد نظر مي‌باشد (مانند فيلد اول كه مينيمم طول پيش‌بيني شده سه كاراكتر است، ولي عدد مورد نظر 5 رقمي است.)
دومين خروجي در سطر اول با يك محل خالي شروع شده است. اين محل خالي به‌علت وجود يك محل خالي بين فرمان فرمت فيلد اول و دوم در رشته كنترلي است.
سومين خروجي در سطر اول داراي چهار محل خالي يا blank در سمت چپ است كه يك محل آن به سبب وجود يك محل خالي بين فرمان فرمت فيلد دوم و سوم در رشته كنترلي است؛ سه محل خالي ديگر نيز براي پُركردن حداقل فضاي پيش‌بيني شده براي ميدان مورد نظر (كه در اينجا هشت كاراكتر براي يك عدد پنج رقمي است)، مي‌باشد.
شرايط مشابهي براي دو سطر ديگر خروجي وجود دارد. فقط بايد توجه كرد كه كد فرمت براي سطر دوم از نوع f و براي سطر سوم از نوع e مي‌باشد.

مثال - در برنامه زير همان مثال قبلي با استفاده از كد فرمت نوع g نوشته شده است.
#include<stdio.h>
main ( )
 {
    int  i = 12345 ;
    float  x =345.125 ;
    printf("%3d %5d %8d \n", i , i , i) ;
    printf("%g %10g %13g \n", x , x , x) ;
    printf("%3g %13g %16g \n", x , x , x) ;
 }
و خروجي برنامه مذكور بصورت زير خواهد بود:
12345 12345   12345
345.125    345.125      345.125
345.125      345.125        345.125
 
در اينجا مقادير floating point با كد فرمت f چاپ شده است زيرا اين فرم، نتيجه را كوتاهتر نشان مي‌دهد. فواصل بين مقادير چاپ شده نيز براساس درنظر گرفتن حداقل پهناي پيش‌بيني شده در رشته كنترلي براي آرگومانهاي مورد نظر است. چگونگي پيش‌بيني حداقل طول ميدان در يك تابع printf در بالا بيان شد. مي‌توان ماكزيمم تعداد ارقام اعشار در مورد مقادير floating point يا ماكزيمم تعداد كاراكتر براي يك رشته را نيز مشخص كرد. مشخصه مورد نظر براي اين عمل، precision يا دقت ناميده مي‌شود. دقت مورد نظر، يك عدد صحيح بدون علامت است كه قبل از آن نيز يك علامت مميز "." قرار مي‌گيرد. اگر علاوه بر precision حداقل طول ميدان نيز مشخص شده باشد (كه معمولاً نيز همينطور است)، طول ميدن قبل از precision قرار مي‌گيرد و علامت مميز "." بين آن دو، درج مي‌شود و كد فرمت پس از اين مجموعه كاراكترها مي‌آيد.
در مورد مقادير floating point اگر دقت پيش‌بيني شده براي ارقام اعشار كوچكتر از تعداد ارقام اعشار باشد، جزء اعشار گرد مي‌شود، بطوري كه تعداد ارقام آن با دقت يا precision پيش‌بيني شده مطابقت نمايد. مثال زير اين موضوع را روشن مي‌سازد.

مثال - به برنامه زير دقت کنيد :
#include<stdio.h>
main ( )  
   {
      float  x =123.456 ;
      printf("%7f %7.3f %7.1f\n", x , x , x) ;
      printf("%12e %12.5e %12.3e", x , x , x) ;
    }
و خروجي برنامه بالا بصورت زير خواهد بود :
123.456000 123.456   123.5
1.234560e+02  1.23456e+02    1.235e+02
 
سطر اول به ‌وسيلة كد فرمت f ايجاد شده است. ملاحظه مي‌كنيد كه عدد سوم به لحاظ مشخصه دقت مربوط (كه يك رقم اعشار پيش‌بيني گرديده) گرد شده است. همچنين مشاهده مي‌كنيد كه با درنظر گرفتن حداقل طول ميدان (هفت كاراكتر) در سمت چپ عدد سوم، دو محل فضاي خالي به لحاظ حداقل طول ميدان و يك محل فضاي خالي نيز به لحاظ وجود يك محل خالي بين فرمان فرمت فيلدهاي دوم و سوم، ايجاد شده است.
سطر دوم كه با كد فرمت نوع e ايجاد شده، داراي مشخصه‌هاي مشابه سطر اول است. بازهم ملاحظه مي‌شود كه عدد سوم گرد شده است تا با دقت پيش‌بيني شده (3 رقم اعشار) تطابق داشته باشد. همچنين چهار فضاي خالي نيز با درنظر گرفتن حداقل طول ميدان (دوازده كاراكتر) و وجود يك محل خالي بين فرمان فرمت فيلدهاي دو و سوم، در سمت چپ آن ايجاد شده است.
ضرورتي ندارد كه مشخصه دقت با حداقل طول ميدان توأم بكار برده شود. بلكه مي‌توان مشخصه دقت را بدون ذكر حداقل طول ميدان نيز بكار برد. ولي به هرحال نقطه معرف اعشار بايد در جلوي آن بكار برده شود. 
      علاوه بر پهناي ميدان، شاخص دقت و كاراكترهاي تبديل، هر گروه از رشته كنترل مي‌تواند شامل يك flag نيز باشد كه در شكل ظاهري خروجي اثر مي‌گذارد. flag ، بلافاصله بعد از علامت (%) قرار مي‌گيرد. بعضي كامپايلرها اجازه مي‌دهند كه بيش از يك flag بكار برده شود، كه در اين صورت بايد بطور پياپي قرار گيرند. flagهاي متداول در جدول زير درج شده‌اند.

 Flag هاي متداول و نقش آنها

معني و نقش آنهــا

Flag

اقلام داده‌ها در داخل ميدان، از سمت چپ تراز مي‌شوند (فضاي خالي مورد نياز براي پركردن حداقل پهناي ميدان نيز از طرف راست انباشته مي‌شود.)

_

در مورد اقلام عددي، علامت آن (+ يا -) نيز در جلوي آن ظاهر مي‌گردد. بدون استفاده از اين flag فقط در مورد مقادير منفي علامت آنها در خروجي ظاهر مي‌شود.

+

در مورد اقلام عددي موجب مي‌شود كه فضاي خالي سمت چپ به جاي blank با صفر پرشود. البته فقط در مورد اقلامي كه از سمت راست تراز مي‌گردند، مصداق دارد.

0

در مورد هر قلم داده عددي علامت‌دار و مثبت يك blank در جلوي آن ظاهر مي‌شود. فلاگ (+) آن را لغو مي‌كند (اگر هر دو باهم بكار برده شوند).

▪ ▪

 

blankspace

موجب مي‌شود كه در جلوي اقلام داده اكتال يا هگزادسيمال متناظراً 01 و 0x ظاهر شود.

#

(با نوع تبديل 0- و x-)

موجب مي‌شود كه در تمام اعداد floating-point، علامت مميز "." ظاهر شود، اگرچه عدد مورد نظر جزء اعشار نداشته باشد؛ همچنين در مورد نوع تبديل g از برش دادن (ناديده گرفته شدن) صفرهاي بدون معني راست trailing zeros جلوگيري مي‌كند.

#

 

(با نوع تبديل e- g-, f-,)

 
مثال - برنامه زير كاربرد فلاگها را در مورد مقادير صحيح و اعشاري (با مميز شناور) نمايش مي‌دهد:
#include<stdio.h>
main ( ) 
  {
    int  a =123 ;  
    float  b=15.0 , c = -3.5 ;
    printf(": %5d %7.0f %10.1e : \n", a , b , c) ;
    printf(": %-5d %-7.0f %-10.1e : \n", a , b , c) ;
    printf(": %+5d %+7.0f %+10.1e : \n", a , b , c) ;
    printf(": %7.0f %#7.0f %7g %#g :" , b , b , c , c) ;
  }
خروجي برنامه بالا بصورت زير خواهد بود (كه در آن علامت ":" آغاز اولين فيلد و پايان آخرين فيلد را نمايش مي‌دهد.)
: 123      15    -3.5+00 :
: 123  15     -3.5e+00 :
: +123     +15   -3.5e+00 :
:+123  +15    -3.5e+00 :
:     15     15.    -3.5 -3.500000 :
اولين خط، خروجي را بدون استفاده از فلاگ نمايش مي‌دهد كه هر عدد در فضاي مشخص شده براي آن، از طرف راست تراز شده است. خط دوم همان اعداد را با استفاده از همان كاراكترهاي تبديل با پيش‌بيني يك فلاگ در هر گروه از رشته فرمت، نمايش مي‌دهد، و ملاحظه مي‌كنيد كه اين بار بعلت وجود فلاگ "-" همه اعداد از سمت چپ تراز شده‌اند. خط سوم، نقش استفاده از فلاگ "+" را نمايش مي‌دهد. در اين حالت اعداد مانند خط اول از سمت راست تراز مي‌شوند. اما علامت مربوط نيز (در هر دو حالت مثبت و منفي‌بودن) در جلوي آنها ظاهر شده ‌‌است.
در خط چهارم، نقش تركيب دو فلاگ "-" و "+" را مشاهده مي‌كنيد و ملاحظه مي‌كنيد كه ضمن اينكه اعداد (بعلت وجود فلاگ "-") از سمت چپ تراز شده‌اند، علامت مربوط نيز (به‌علت وجود فلاگ "+") در جلوي آنها ظاهر شده است. بالاخره خط پنجم دو مقدار floating point را يكبار بدون وجود فلاگ و بار ديگر با استفاده از فلاگ "#" نمايش مي‌دهد، و ملاحظه مي‌كنيد كه نقش اين فلاگ آن است كه در مورد عدد 15 علامت مميز را نيز منظور داشته است و در مورد عدد دوم، صفرهاي بدون ارزش بعد از مميز را نيز در كد فرمت "g" نمايش مي‌دهد.

مثال - برنامه زير را درنظر بگيريد كه اعداد را در مبناي 10 ، 8 و 16 نمايش مي‌دهد :
#include<stdio.h>
main ( ) 
 {
    int  i = 1234 , j = 0155 , k = 0xa06b ;
    printf(": %6u %6o %6x : \n", i , j , k) ;
    printf(": %-6u %-6o %-6x : \n", i  ,j , k) ;
    printf(": %#6u %#6o %#6X : \n" ,  i , j , k) ;
    printf(": %06u %06o %06X : \n", i , j , k) ;
 }
خروجي اين برنامه بصورت زير خواهد بود (در اينجا نيز ":" آغاز اولين فيلد و پايان آخرين فيلد را در هر خط نمايش مي‌دهد.)
:   1234     155   a06b:
:1234     155     a06b:
:   1234   0155 0XA06B:
:001234 000155 00A06B:
اولين خط، بدون استفاده از فلاگ، اعداد را بدون علامت و بترتيب در مبناهاي  10، 8 و 16 در خروجي نمايش مي‌دهد. خط دوم همان داده‌ها را با همان كاراكتر تبديل و با استفاده از فلاگ  "-" نشان مي‌دهد، كه درنتيجه اعداد در فضاي پيش‌بيني شده براي آنها از سمت چپ تراز شده‌اند.
در خط سوم نتيجه استفاده از فلاگ "#" در خروجي مشاهده مي‌گردد. اين فلاگ موجب مي‌گردد كه در جلوي اعداد در مبناي 8 و 16 به‌ترتيب "0" و "0x" ظاهر شود. همچنين ملاحظه مي‌كنيد كه به سبب استفاده از حروف بزرگ "X" در كاراكتر تبديل، حروف موجود در اعداد مبناي 16، در خروجي بصورت حروف بزرگ (يعني: 0XA06B) ظاهر شده‌اند. خط آخر نقش استفاده از فلاگ "0" را نمايش مي‌دهد. اين فلاگ موجب مي‌گردد كه سمت چپ اعداد به تعداد لازم (تا پرشدن فضاي پيش‌بيني شده با صفر پر شود. در اينجا نيز بعلت استفاده از حروف بزرگ "X" در كاراكتر تبديل، حروف موجود در اعداد مبناي 16 ، در خروجي، بصورت حروف بزرگ ظاهر شده‌اند.

 

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

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

حرف 500 حداکثر