گروه مهندسی کامپیوتر دانشگاه بجنورد

ثبت پروژه و شگردهاي برنامه نويسي دانشجویان كامپيوتر

  1. rahnamayie baraye gadvalhaye moteghate

#includ

#includ
Data base/

Norm jadval ra dariaft kon//
Araieie m*n ra dar nazar begir//
Avalin harf ra be sorat tasadofi//
Entekhab kon va dar khaneye 1 ofoghi gharar bede

//Ta zamani in kar ra tekrar kon ke kalamat peida shode bar asase sar vajeha ke amodi ghar migirand mani dar bashand(iani dar loghat name mojod bashand)

Agar kalamat jor shodand khaneye baed az har kalame ra siah kon//
Agar bad az khaneye siah kalamei gharar gereft gharar dahid va agar dorost nashod marhaleye ghabl ra tekrar kon//
//Hal az ghesmat amodie (edameye kochektarin kalameye amodi mesle ghabl amal mikonim)  
Vared joziat shavid va har yek az mavared bala ra tosdae dahid //

in algoritm avalieh besiar sade bode va niaz be bast va gostaresh darad

be dalil kambod vaght natonestam ba shekle tozih bedam .

age kasi moshkelat va kambodhayealgoritm ro peyda kard toye veblog berize hamchenin dar sorat gong bodan algoritm bem etelae bedin

gom shode dar bad

+ نوشته شده در  یکشنبه یکم دی 1387ساعت 13:19  توسط گروه مولفان  | 

یک مطلب ج.....دید

5.1 اصول اولیه

محدودیتی که ممکن است شما نیز متوجه آن شده باشید این است که توابع تنها از طریق مقادیر بازگشتی خود در برنامه شما تاثیر گذراند. با این وصف اگر بخواهید تا یک تابع با بیش از یک متغییر سر و کار داشته باشد چه خواهید کرد؟ پاسخ استفاده از اشاره گر‌هاست.
یک اشاره گر نوع خاصی از متغییر‌هاست که برای نگهداری آدرس‌های حافظه کاربرد دارد یعنی یک اشاره گر آدرس متغییر دیگری را به عنوان مقدار خود نگهداری می‌کند. اعلان اشاره گر‌ها به مانند اعلان متغییر‌های عادی است با این تفاوت که شما باید یک کاراکتر ستاره "*" را به ابتدای نام اشاره گر اضافه کنید. دو عملگر جدید برای کار با اشاره گر‌ها وجود دارد که شما باید آنها را بشناسید:عملگر & و عملگر * که هر دو جزء عملگر‌های یگانی پیشوندی محسوب می شوند . زمانی که شما یک علامت آمپرسند "&" را در آغاز نام یک متغییر اضافه می کنید شما آدرس آن متغییر را دریافت خواهید کرد که می تواند در یک اشاره گر نگهداری شود. اما زمانیکه علامت ستاره را در آغاز نام یک اشاره گر به کار می برید شما مقدار نگهداری شده در آدرس حافظه‌ای را که اشاره گر به آن اشاره می کند دریافت خواهید کرد. مثل همیشه بحث را با یک نمونه دنبال می کنیم :

نمونه 5.1 pointers_are_simple.c

#include

int

main()

{

int my_variable = 6, other_variable = 10;

int *my_pointer;

printf("the address of my_variable is : %p\n", &my_variable);

printf("the address of other_variable is : %p\n", &other_variable);

my_pointer = &my_variable;

printf("\nafter \"my_pointer = &my_variable\":\n");

printf("\tthe value of my_pointer is %p\n", my_pointer);

printf("\tthe value at that address is %d\n", *my_pointer);

my_pointer = &other_variable;

printf("\nafter \"my_pointer = &other_variable\":\n");

printf("\tthe value of my_pointer is %p\n", my_pointer);

printf("\tthe value at that address is %d\n", *my_pointer);

return 0;

}

خروجی برنامه آدرس حافظه دو متغییر را به شما نشان می دهد. مقادیر در رایانه من با رایانه شما متفاوت خواهند بود. در تابع ()printf همانطور که شما هم متوجه شده‌اید از %p برای نمایش آدرس‌ها بهره بردیم که شاخص تبدیل برای تمام اشاره گر‌هاست. به هر حال خروجی برنامه در رایانه من به صورت زیر بود :
خروجی برنامه

the address of my_variable is : 0xbffffa18

the address of other_variable is : 0xbffffa14

after "my_pointer = &my_variable":

the value of my_pointer is 0xbffffa18

the value at that address is 6

after "my_pointer = &other_variable":

the value of my_pointer is 0xbffffa14

the value at that address is 10

5.2 آدرس یک متغییر

برنامه‌ها در زمان اجرا ، وقتی به اعلان یک متغییر می رسند از سیستم عامل درخواست تخصیص مقداری حافظه برای آن متغییر را می نمایند. سیتم عامل قطعه‌ای از حافظه را که اندازه آن برای نگهداری مقادیر متغییر مناسب است انتخاب و آدرس آن را به برنامه اعلام می‌کند. هر زمان که برنامه قصد خواندن داده‌هایی را که درون آن متغییر نگهداری می شوند داشته باشد ، به آدرس حافظه آن متغییر مراجعه کرده و به برابر با اندازه آن متغییر بایت‌های حافظه را می خواند. در صورتی که شما یک بار دیگر برنامه‌ای را که در اغاز این فصل ذکر کردیم اجرا کنید ممکن است نتایج مشابه یا متفاوتی را نسبت به بار اول در مورد آدرس‌های حافظه بدست آورید که‌این امر بستگی به شرایط سیستم شما دارد اما حتی اگر در بار دوم نتایج یکسانی را نسبت به یار اول بدست آورید هیچ تضمینی برای اینکه اجرای برنامه در فردا نیز همین نتایج را داشته باشد وجود نخواهد داشت. در واقع این احتمال که فردا نیز برنامه همین نتایج را داشته باشد تقریبا محال است.

5.3 اشاره گر‌ها در جایگاه آرگومان (نشانوند )‌های تابع

یکی از بهترین مزیت‌های اشاره گر‌ها این است که آن‌ها به توابع این امکان را می دهند تا متغییر‌هایی در خارج از حوزه خود را تغییر دهند. با ارسال یک اشاره گر برای یک تابع ، شما به آن تابع امکان خواندن و نوشتن بر روی داده‌های نگهداری شده در متغییر مربوط به آن اشاره گر را می دهید.
مثلا شما قصد نوشتن تابعی را دارید که مقادیر دو متغییر را جا به جا می‌کند. بدون بهره گیری از اشاره گر‌ها نوشتن این برنامه غیر ممکن است. در زیر کدهای برنامه مورد نظر را می بینید:

Example 5-2. swap_ints.c

#include

int swap_ints(int *first_number, int *second_number);

int

main()

{

int a = 4, b = 7;

printf("pre-swap values are: a == %d, b == %d\n", a, b)

swap_ints(&a, &b);

printf("post-swap values are: a == %d, b == %d\n", a, b)

return 0;

}

int

swap_ints(int *first_number, int *second_number)

{

int temp;

/* temp = "what is pointed to by" first_number; etc... */

temp = *first_number;

*first_number = *second_number;

*second_number = temp;

return 0;

}

همانطور که مشاهده می کنید اعلان تابع () swap_ints به کامپایلر gcc می گوید که انتظار دو اشاره گر ( آدرس متغییر )را داشته باشد. همچنین عملگر & به منظور ارسال آدرس دو متغییر به جای مقدار آن‌ها به کار رفته است.

موفق باشید

نوشته شده توسط :قریب وشریعت زاده

+ نوشته شده در  شنبه بیست و سوم آذر 1387ساعت 14:6  توسط گروه مولفان  | 

پوینتر ها

 

برنامه ای که با استفاده از تابع پوینتر ۴تا سلام چاپ کند.

void f1(int n, char *c)//char c[]   char c[22]
{
 while(n)
 {
  printf("\n%s",c);
  n--;
 }
}

void f2(int *n)
{

 (*n)++;


}


int f3(int n)
{

return(n*n);


}


long int f4(int n)
{
 if(n)
 {
  return (n*f4(n-1));
 }
 else
  return(1);
}


void main()
{
int a,b;
int *p;
char str[20];
//scanf("%s",str);
sprintf(str,"%s","salam");
a=5;
f2(&a);
a=f3(a);
a=f4(4);
a=2;
p=&a;
(*p)++;
 p[0]++;
f1(a,str);


getch();

}

 

 

 

 

 

+ نوشته شده در  دوشنبه هجدهم آذر 1387ساعت 13:8  توسط گروه مولفان  | 

برنامه مرتب سازی

برنامه ای بنویسید که چند عدد را از کاربر دریافت کند و از کوچک به بزرگ مرتب کند.

#include
#include
#include
#include
int input(int i_a[])
{
  int f;
 int n,i;
 printf("please enter the number of input integers\n these numbers should be in the range of 1 and 99 the maximum number of these integers is 100");
 scanf("%d",&n);//check the consistency of n  n should be between 1 and 100
for(i=0;i {
  printf("\n     %d      ",i);
  f=0;
  do
  {
  if (f) printf("\n\n the number should be between 1 and 99\n\n");
  scanf("%d",&i_a[i]); //i_a+i
  f++;
  }
  while((i_a[i]<0)|| (i_a[i]>99)); //!((i>0)&&(i<99))
 }
return (n);
}


int lowest(int a[],int last_pos)
{
 int i,j;
 j=0;
 for (i=0;i  if(a[j]>a[i]) j=i;

 return(j);


}


void remove(int a[],int pos, int *last)
 {

  for(;pos<(*last);pos++)
  {
   a[pos]=a[pos+1];
  }
  (last)--;
 }

 


void sort(int s_a[],int last)
{
int b[100];
int i,j,k;
 int n;
 n=last;
 for(i=0;i  {
   j=lowest(s_a,last); // find the lowest number
   b[i]=s_a[j];
   remove(s_a,j,&last);      //remove the j~th of a
//   last--;
  }

 for(i=0;i {
  s_a[i]=b[i];
 }
}

void print(int a[],int n)
{

 

int i;
for(i=0;i// for(i=0;i//{ printf("\n%d",a[i]);
//}
}
void main()
{
int n;
int a[100];
n=input(a);
//printf("\n\n\n\nthe number of input integers is %d",n);

sort(a,n);
print(a,n);
getch();

}

+ نوشته شده در  دوشنبه هجدهم آذر 1387ساعت 12:56  توسط گروه مولفان  | 

برنامه

برنامه ای که 10 تا عدد را بگیرد و آنها را مرتب کند:
#>include

#include
void main()
{
 int a[50];
 int i,j;
 for(i=0;i<10;i++)
  {
   scanf("%d",&a[i]);
  }
 for(i=0,j=0;i<10;j+=a[i],i++);
 printf("the sum of my array is = %d\n",j);
 // now we start to sort these numbers using bouble sort
 for(i=0;i<10;i++)
  for(j=1;j<10;j++)
  {
   if(a[j]
    {
     a[j]+=a[j-1];
     a[j-1]=a[j]-a[j-1];
     a[j]-=a[j-1];

    }
  }

  for(i=0;i<10;i++)
   {

     if(( a[i]!=a[i-1])||(i==0))
     printf("    %d",a[i]);
   }

int n;
printf("\nenter the number u wish to find");
scanf("%d",&n);
j=0;

for(i=0;((i<10)&&(j==0));i++)
 if(a[i]==n)j++; //printf("\nthe desired number has found in the location of %d",i);



if(j) printf("\nthere is %d in this list",n);








//printf("end");
getch();




}




barnamei ke 10 khat az shekl zir ra chap konad:
* * * *
***
**
*


#include
#include
void main()
{
int j,i,x,z;
x=0;

for(i=1;i<=10;i++)

{
         for(z=0;z<=x;z++)
         {
         printf(" ");

         }
          x++;
         for(j=10;j>=i;j--)

         {printf("* ");}

         printf("\n");


}




barnamei ke 10 khat az shekl zir ra chap konad:
   *
   *      
   *          
*            
#include
#include
void main()
{
int i,j;
for(i=1;i<=10;i++)
{
for (j=1;j
{
printf(" ");}
printf("*\n");
}getch();
}
نوشته شده توسط حبیبی,خوشحال,طاهری,افتخاری.                                                                      
برنامه ای که مثلث خیام پاسکال را  تا سطر دلخواه چاپ کند:                                                             

#include
#include
#include
#include
int x,z,c(int n,int k){


if(k==0 || k==n)

return 1;
if(k==1)
return n;
else
return c(n-1,k-1)+c(n-1,k);
}
int main()
{
int t;
scanf("%d",&t);
x=t;
cout<<"\n\n\n";
for(int i=0;i<=t;i++){
 for(z=x;z>=0;z--){ printf("   ");}x--;
 cout< for(int j=0;j<=i;j++)
 printf(" %5d",c(i,j));
 //cout< cout< }
 cout<<"\n\n";
 cout<<"*** Khayam Pascal Triangle ***\n";
 getch();
 }
نوشته شده توسط حبیبی.

برنامه ای که جدول ضرب را چاپ کند:                                                                                          


#include
#include
int i,j;
void main()
{
for(i=1;i<=10;i++)
  {for(j=1;j<=10;j++)
  printf("%4d",i*j);
  printf("\n");
  }
getch();
}
نوشته شده توسط حبیبی,خوشحال,طاهری,افتخاری.                                                                      

برنامه ای که سکه ای 100 ریالی را بگیرد و آن را به سکه های 2و5و10و20و2و50ریالی خرد کند:                     

                 
#include
#include
void main(){
int i2,i5,i10,i20,i50,count=0;
unsigned long int sum;
clrscr();
for(i2=0;i2<=50;i2++)
for(i5=0;i5<=20;i5++)
for(i10=0;i10<=10;i10++)
for (i20=0;i20<=5;i20++)
for(i50=0;i50<=2;i50++)
{
sum=i2*2+i5*5+i10*10+i20*20+i50*50;
if(sum==100){
printf("\n 2rials=%d, 5rials=%d, 10rials=%d",i2,i5,i10);
printf(", 20rials=%d ,50rials=%d",i20,i50);
 count ++;
 }//end of if
 else
 sum=0;
 }
 printf("\n number of correct timee:%d",count);
 getch();
 }
نوشته شده توسط حبیبی,خوشحال,طاهری,افتخاری.

برنامه ای که یک آرایه ی بیست تایی را به صورت زیر مقدار می کند:10407                                             




#include
#include
void main()
{
int a[20];
int i;
 int x=1;
for(int i=0;i<=20;i++)
{
if (i%2!=0)
{a[i]=0;
printf(" %d",a[i]);
}
else{


a[i]=x;
printf(" %d",a[i]);

x+=3;
}
}
printf(" \n");
getch();
} 

نوشته شده توسط حبیبی و خوشحال.
+ نوشته شده در  چهارشنبه بیست و نهم آبان 1387ساعت 0:10  توسط گروه مولفان  | 

اطلاعات عمومی

این هم اطلاعات دیگه ای در مورد تبدیل تاریخ شمسی به میلادی:




براي تبديل تاريخ شمسي به ميلادي و برعکس بايد تعداد روزهاي سپري شده از ابتداي هر کدام از اين تاريخ‌ها را از مبدا خود به دست بياوريم. اگر مي‌خواهيم تاريخ شمسي را به ميلادي تبديل کنيم ابتدا بايد روزهاي سپري شده از مبدا تاريخ شمسي تا کنون را حساب کنيم و آن را به اضافه‌‌ي 226899 بکنيم. عدد به دست آمده تعداد روزهاي گذشته از ابتداي تاريخ ميلادي تا کنون است و با استفاده از آن مي‌توانيم تاريخ ميلادي را حساب کنيم. براي تبديل تاريخ ميلادي به شمسي همين کار را بايد برعکس انجام بدهيم و عدد 226899 را بايد از تعداد روزهاي تاريخ ميلادي کم بکنيم و در اين قسمت عدد به دست آمده تاريخ شمسي است.
همين روش نيز براي تبديل تاريخ قمري به شمسي و برعکس نيز قابل استفاده است. ولي در اين مورد ديگر عددي که بايد اضافه يا کم بشود 226899 نيست.
شايد از خود بپرسيد که عدد 226899 را از کجا به دست آورده‌‌ام. براي به دست آوردن اين عدد بايد تاريخ شمسي و ميلادي يک روز را در اختيار داشته باشيد. به عنوان مثال 13/4/1383 شمسي طبق تقويم برابر 3/7/2004 ميلادي است. کاري که بايد الا بکنيم اين است که اين دو تاريخ را به روز تبديل کنيم و در اين تبديل بايد تعداد سال‌هاي کبيسه‌اي که اين دو تاريخ پشت سر گذاشته‌اند نيز فراموش نکنيم. براي اينکه تعداد سال‌هاي کبيسه را در دو تقويم ميلادي و شمسي بخواهيم محاسبه کنيم بايد 1382 را براي تقويم شمسي و 2003 را براي تقويم ميلادي تقسيم بر 4 کنيم. خارخ قسمت اين دو تقسيم به ترتيب تعداد سال‌هاي کبيسه‌ي تقويم شمسي و ميلادي است که از ابتداي شروع به کار اين تقويم‌ها تا کنون پشت سر گذاشته‌اند. البته اين اعداد مطابق واقعيت نيستند! ولي به محاسبات ما اشکالي وارد نمي‌کنند.
در تقسيم 1382 بر 4 خارج قسمت برابر 345 مي‌شود و اين عدد براي تقويم ميلادي برابر 500 است.
خب پس تا کنون بر اساس تقويم شمسي 345 سال کبيسه بوده و بر اساس تقويم ميلادي 500 سال برابر سال کبيسه بوده‌اند. (البته همان طور که ديد به کبيسه بودن سالي که در آن هستيم هنوز توجهي نکرديم.)
خب برگرديم به مساله‌ي خودمان که مي‌خواستيم دو تاريخ 13/4/1383 و 3/7/2004 به روز تبديل کنيم.
براي اين کار بايد از عدد سال يکي کم کرده و در 365 ضرب کنيم. و از عدد ماه نيز بايد يکي کم کرده و بر اساس نوع تقويم بايد عدد ماه را ضرب در عدد خاصي بکنيم. مثلا وقتي در تاريخ شمسي از عدد ماه يکي کم کنيم حاصل 3 مي‌شود. همان طور که مي‌دانيد در تقويم شمسي 3 ماه اول سال 31 روز دارند، پس 3 را در 31 ضرب مي‌کنيم. ولي در تاريخ شمسي وقتي از 7 يکي کم کينم برابر 6 مي‌شود. خب بايد در اين مورد ببينيم که 6 ماه اول سال ميلادي چند روزه هستند.
ماه اول ميلادي = 31 روز
ماه دوم ميلادي = 28 روز (در سال کبيسه 29 روز)
ماه سوم ميلادي = 31 روز
ماه چهارم ميلادي = 30 روز
ماه پنجم ميلادي = 31 روز
ماه ششم ميلادي = 30 روز
ماه هفتم ميلادي = 31 روز
ماه هشتم ميلادي = 31 روز
ماه نهم ميلادي = 30 روز
ماه دهم ميلادي = 31 روز
ماه يازدهم ميلادي = 30 روز
ماه داوزدهم ميلادي = 31 روز
طبق جدول بالا 6 ماه اول سال 2004 ميلادي برابر 182 روز مي‌باشد. (فراموش نکنيد که سال 2004 سال کبيسه است.) خب تا حالا عدد سال و ماه را به روز تبديل کرديم و اين دو عدد را بايد به اضافه‌ي عدد روز کنيم و در آخر به اضافه‌ي تعداد سال‌هاي کبيسه گذشته بکنيم. داريم
A = (1382*365)+(3*31)+13+345 = 504881
B= (2003*365)+(31+29+31+30+31+30)+3+500=731780
B-A = 226899
با محاسبات فوق خواستم نشان بدهم که عدد 226899 که در اول بحث گفتيم را از کجا آورديم. همان طور که احتمالا تا حالا فهميديد اين عدد (226899) تفاوت مبداهاي دو تقويم ميلادي و شمسي به روز هستند.
حال مثالي مي‌زنم براي تبديل تاريخ شمسي به تاريخ ميلادي. فرض کنيد که مي‌خواهيم که تاريخ 15/4/1383 شمسي را به تاريخ ميلادي نظير آن تبديل کنيم. در ابتدا بايد اين تاريخ را به روز تبديل کنيم. طبق روش گفته شده در بالا مي‌نويسيم:
C =[(1383-1)*365]+[(4-1)*31]+15+345 = 504883
خب اين عدد را بايد به اضافه‌ي 226899 بکنيم:
504883+226899 = 731782
حال بايد 731782 را به تاريخ ميلادي متناظر آن تبديل کنيم.
ابتدا بايد تعدا سال‌هاي کبيسه‌ي تقويم ميلادي را از اين عدد کنيم، در بالا ديديم که تقويم ميلادي تا کنون 500 سال کبيسه را پشت سر گذاشته است.
731782-500=731282
حال 731282 را بر 365 تقسيم مي‌کنيم و خارج قسمت آن را به اضافه‌ي يک مي‌کنيم و عدد به دست آمده عدد سال است :
731282 / 365 = 2003
2003 + 1= 2004
باقيمانده‌ي تقسيم فوق برابر 187 مي‌باشد. حال با استفاده از جدول تعداد روز‌هاي تقويم ميلادي شروع مي‌کنيم از 187 کم مي‌کنيم و باز هم فراموش نمي‌کنيم که سال 2004 ميلادي سال کبيسه است :
187-31=156
156-29=127
127-31=96
96-30=66
66-31=35
35-30=5
خب تفريق‌هاي فوق را تا جايي ادامه مي‌دهيم که عدد به دست آمده کمتر از تعداد روزهاي يک ماه باشند. در بالا 6 مرحله تفريق انجام دهيم به عدد 6 بايد يک بيافزاييم تا تعداد ماه‌ها به دست آيد. و عدد ظاهر شده در تفريق آخر نيز برابر عدد روز مي‌باشد. پس با محاسبات فوق ديديم که تاريخ 15/4/1383 شمسي برابر 5/7/2004 است.
اين روش کلي تبديل دو تاريخ به يکديگر است. و براي تبديل انواع تقويم به هم بايد اين مراحل را انجام داد ولي با توجه به نوع تقويم‌ها عددهايي که بايد اضافه يا کم بشود طبعا فرق مي‌کند.
موفق باشيد

منبع سایت تبیان
+ نوشته شده در  چهارشنبه بیست و دوم آبان 1387ساعت 12:28  توسط گروه مولفان  | 

تبدیل سال میلادی به شمسی

الگوریتم تبدیل تاریخ میلادی به تاریخ شمسی :

تبدیل تاریخ میلادی به شمسی بسیار راحتتر از تبدیل تاریخ شمسی به میلادی است.

برای نوشتن این الگوریتم به اختلاف روزهای میان اولین روز سال میلادی و اولین روز سال شمسی نیاز داریم که این اختلاف روز(در صورتی که سال کبیسه باشد یا نباشد) "79" روز است.

برای تشخیص کبیسه بودن یا نبودن سال از روش زیر استفاده می کنیم:
اگر سال داده شده بر100و400 بخشپذیر باشد" یا بر" 100 بخشپذیر نباشد بر 4 بخشپذیر باشد" آنگاه سال کبیسه است، در غیر این صورت سال کبیسه نیست.
با توجه به کبیسه بودن یا کبیسه نبودن سال مشخص می کنیم که در کدامین روز سال میلادی قرار داریم.

دو حالت پیش می آید:

  • روزی که در آن قرار داریم از 79 بیشتر است
    به این معنی است که در ماههای بعد از فروردین قرار داریم.

حال باید مشخص کنیم که در 6 ماه اول سال شمسی قرار داریم یا در 6 ماه دوم سال قرار داریم،
برای اینکار ابتدا 79 روز از تعداد روزها کم می کنیم تا در اول فروردین قرار بگیریم حال اگر تعداد روزها از "186"(31*6) کمتر باشد یعنی در 6 ماه اول سال شمسی قرار داریم در غیر اینصورت در 6 ماه دوم قرار داریم.

  1. اگر در 6 ماه اول سال قرار گرفته باشیم :تعداد روزها را بر "31" تقسیم می کنیم(6 ماه اول در سال شمسی 31 روزه است.)
    اگر باقیمانده این تقسیم صفر شد خارج قسمت تقسیم برابر با ماه شمسی می شود و روز شمسی برابر با 31 می شود.
    اگر باقیمانده صفر نشود ماه شمسی برابر با خارج قسمت باضافه یک می شود و روز شمسی همان باقیمانده است.

     

  2. اگر در 6 ماه دوم سالقرار گرفته باشیم : "186" روز از تعداد روزها کم می کنیم و آن را بر "30" تقسیم می کنیم .
    اگرباقیمانده این تقسیم صفر شد خارج قسمت تقسیم باضافه"6" برابر با ماه شمسی می شودو روز شمسی برابر با30 می شود.
    اگر باقیمانده صفر نشود ماه شمسی برابر با خارج قسمت باضافه"7" می شودو روز شمسی همان باقیمانده است.

     

سال شمسی از تفاضل سال میلادی با"621" بدست می آید.

  • روزی که در آن قرار داریم کمتر از"79"است
             که این به این معنی است که درروزهایی بین اولین روزسال میلادی تا اولین روز شمسی (ماههای دی ،بهمن و اسفند)قرار داریم.

اختلاف روز بین اولین روز سال میلادی داده شده و اولین روز دی ماه در سال شمسی را در نظر می گیریم که این اختلاف برای سال کبیسه"11" و برای غیر کبیسه "10" است.*دقت کنید که در این الگوریتم برای مشخص کردن این اختلاف باید سال قبل از  سال داده شده را در نظر بگیریم زیرا سال قبل بر روی اولین روز سال میلادی تاثیر می گزارد.*

اختلاف روز با تعداد روز محاسبه شده جمع می کنیم ، آن را بر"30" تقسیم می کنیم(3 ماه آخر سال شمسی 30 روزه است.).
اگر باقیمانده این تقسیم صفر شود خارج قسمت تقسیم باضافه"9" برابر با ماه شمسی می شودو روز شمسی برابر با"30" می شود.
اگر باقیمانده صفر نشود ماه شمسی برابر با خارج قسمت  باضافه"10"می شودو روز شمسی همان باقیمانده است.

در این حالت سال شمسی از تفاضل سال میلادی با"622" بدست می آید.(زیرا در سال قبل قرار داریم.)

 

پیاده سازی الگوریتم به زبان c :

typedef struct _SHAMSIDATE
{
    int iYear;
    int iMonth;
    int iDay;
}SHAMSIDATE;

SHAMSIDATE MiladiToShamsi(int iMiladiMonth,int iMiladiDay,int iMiladiYear)
{

    int  shamsiDay, shamsiMonth, shamsiYear;
    int  dayCount,farvardinDayDiff,deyDayDiff ;
    int  sumDayMiladiMonth[] = {0,31,59,90,120,151,181,212,243,273,304,334};
    int  sumDayMiladiMonthLeap[]= {0,31,60,91,121,152,182,213,244,274,305,335};
    SHAMSIDATE  shamsidate;

 farvardinDayDiff=79;

if (MiladiIsLeap(iMiladiYear))
 {
    dayCount = sumDayMiladiMonthLeap[iMiladiMonth-1] + iMiladiDay;
 }
else
 {
    dayCount = sumDayMiladiMonth[iMiladiMonth-1] + iMiladiDay;
 }
if((MiladiIsLeap(iMiladiYear - 1)))
 {
    deyDayDiff = 11;
 }
else
 {
    deyDayDiff = 10;
 }
if (dayCount > farvardinDayDiff)
{
    dayCount = dayCount - farvardinDayDiff;
    if (dayCount <= 186)
     {
      switch (dayCount%31)
       {
       case 0:
         shamsiMonth = dayCount / 31;
         shamsiDay = 31;
      break;
       default:
         shamsiMonth = (dayCount / 31) + 1;
         shamsiDay = (dayCount%31);
      break;
      }
      shamsiYear = iMiladiYear - 621;
     }
   else
     {
    dayCount = dayCount - 186;
    switch (dayCount%30)
      {
      case 0:
       shamsiMonth = (dayCount / 30) + 6;
       shamsiDay = 30;
       break;
   default:
       shamsiMonth = (dayCount / 30) + 7;
       shamsiDay = (dayCount%30);
     break;
   }
      shamsiYear = iMiladiYear - 621;
    }
  }
else
  {
    dayCount = dayCount + deyDayDiff;

    switch (dayCount%30)
    {
    case 0 :
      shamsiMonth = (dayCount / 30) + 9;
      shamsiDay = 30;
     break;
    default:
      shamsiMonth = (dayCount / 30) + 10;
      shamsiDay = (dayCount%30);
     break;
    }
    shamsiYear = iMiladiYear - 622;

  }
    shamsidate.iYear = shamsiYear;
    shamsidate.iMonth = shamsiMonth;
    shamsidate.iDay = shamsiDay;

  return shamsidate ;
}

// the function check a miladiyear is leap or not.
BOOL MiladiIsLeap(int miladiYear)
{
if(((miladiYear % 100)!= 0 && (miladiYear % 4) == 0) || ((miladiYear % 100)== 0 && (miladiYear % 400) == 0))
  return TRUE;
else
  return FALSE;
}

+ نوشته شده در  چهارشنبه بیست و دوم آبان 1387ساعت 12:27  توسط گروه مولفان  | 

ساختار های کنترلی

ساختارهای کنترلی

در برنامه نویسی ساختیافته، هر برنامه از 3 ساختار کنترلی بنام: ساختار ترتیب، ساختار انتخاب و ساختار تکرار تشکیل می گردد. از آنجا كه اين 3 ساختار، نحوه و ترتيب اجراي برنامه را كنترل مي كنند، به آنها ساختارهاي كنترلي گفته مي شود. تا کنون فقط با برنامه هایی سروکار داشته ایم که از ساختار ترتیب استفاده می کرده اند، چرا که دستورهای زبان C در حالت عادی به همان ترتیبی که نوشته شده اند، یکی پس از دیگری اجرا می شوند.

اما زبان C دارای 3 نوع ساختار انتخاب می باشد که عبا رتند از : ساختار if یا ساختار تک انتخابی، ساختار if / else یا ساختار دو انتخابی و ساختار switch یا ساختار چند انتخابی. علاوه براین، این زبان دارای 3 نوع ساختار تکرار بنامهای while، for و do / while نیز می باشد که هریک را بطور کامل شرح خواهیم داد.

قرارداد: توجه کنید که در هنگام تشریح یک دستور، خود دستور با رنگ آبی و عملگرهای آن مانند () با رنگ قرمز نشان داده می شوند. قسمتهایی که در داخل <> قرار می گیرند، عبارت یا دستوری هستند که باید در هنگام استفاده جایگزین گردند.

ساختار انتخاب if

این دستور به شکل زیر استفاده می شود:

if () ;

نحوه کار بدینصورت است که ابتدا عبارت موجود در قسمت ارزیابی می شود. در صورتیکه درست ارزیابی گردد، دستور قسمت اجرا  خواهد  شد  و  در  صورتیکه  نادرست  باشد،  بدون  اینکه  دستور  قسمت   را اجرا کند به دستور بعدی خواهد رفت. این دستور می تواند بصورت زیر نیز استفاده گردد: 

if () ;
else ;

در اینصورت ابتدا عبارت موجود در قسمت ارزیابی می شود. در صورتیکه درست ارزیابی گردد، دستور قسمت اجرا خواهد شد، و در صورتیکه نادرست باشد، دستور قسمت اجرا خواهد شد. در هر حال فقط یکی از این دو قسمت اجرا خواهد گردید.

دقت کنید که پرانتز استفاده شده پس از دستور if برخلاف برخی زبانهای دیگر، اجباری است. علاوه براین، در این دستور نیازی به استفاده از then نمی باشد.

بعنوان مثال چنانچه متغیر grade حاوی نمره دانشجو باشد و بخواهیم بر مبنای نمره وی، پیغام مناسبی چاپ کنیم، می توانیم از دستور زیر استفاده کنیم:

if (grade> = 10) printf(“Passed !”);
else printf(“Failed!”);

در حالت عادی دستور if منتظر یک دستور در بدنه خود می باشد، اما چنانچه می خواهید چندین دستور را در بدنه یک دستور if دهید، باید آنها را در داخل آکولاد باز وبسته { } قرار دهید. این مجموع دستورات را یک دستور مرکب می گویند. بطور کلی در زبان C هرجا که می توان یک دستور قرار داد، می توان از یک دستور مرکب نیز استفاده کرد. به یک دستور مرکب، بلوک نیز گفته می شود. بنابراین صورت کلی دستور if به شکل زیر است:

if () {
;
;
….
;
}
else {
;
;
…….
;
}

توجه کنید که وجود قسمت else اختیاری است و در ضمن ممکن است یکی از دو قسمت دارای دستور ساده و دیگری دارای دستور مرکب باشد. بعنوان یک مثال کاملتر به برنامه زیر توجه کنید:

برنامه 1) برنامه ای بنویسید که ضرایب یک معادله درجه 2 را دریافت و ریشه های آن را محاسبه و چاپ نماید.

#include
#include
#include
#include
void main() {
int a, b, c;
float x1, x2, delta;
clrscr();
printf(“Please enter a, b and c : “);
scanf(“%d %d %d”, &a, &b, &c);
if (a==0) {
printf(“wrong equation!”);
exit(1) ;
}
delta = b*b – 4*a*c;
if (delta <0)
printf(“No answer !”);
else if (delta == 0) {
x1 = -b / (2*a);
printf(“There is one answer, x = %f”,x1);
}
else {
delta = sqrt(delta);
x1 = (-b+delta) / (2*a);
x2 = (-b-delta) / (2*a);
printf(“There are two answers, x1= %4.2f and x2= %4.2f”, x1, x2);
}
}
Please enter a, b and c : 3 -7 2
There is two answers, x1 = 2.00 and x2 = 0.33

چندين نكته درمورد برنامه بالا قابل ذكر است.

1- در اين برنامه از 2 تابع جديد استفاده شده است.اولي تابع sqrt كه يك عدد را به عنوان ورودي دريافت و جذر آن را باز مي گرداند. اين تابع در فايل math.h تعريف شده است. و ديگري تابع exit كه باعث مي شود اجراي برنامه خاتمه يابد. اين تابع نيز در فايل stdlib.h تعريف شده است.

2- به نحوه دندانه گذاري در برنامه دقت كنيد، هرجا كه بلوك جديدي ايجاد شده است، دستورات آن حدود 3 كاراكتر جلوتر نوشته شده اند. اينكار باعث مي شود كه خوانايي برنامه افزايش يابد.

3- توجه كنيد كه همانطور كه قبلا نيز گفته شد، خروجي يك عبارت مقايسه اي، يك عدد است كه 0 نشانه نادرست و هر عدد ديگر نشانه درست است. بنابراين در قسمت شرط يك دستور if مي توان بجاي يك عبارت مقايسه اي، هر عبارت ديگري كه يك مقدار عددي بازگرداند نيز قرار داد! بعنوان مثال مي توان بجاي دستور

if (a==0) …

از دستور زير استفاده كرد:

if (!a) …

دراينصورت چنانچه a برابر صفر باشد، نادرست تلقي خواهد شد و در نتيجه نقيض آن يعني ! ، درست محسوب مي گردد.
يك روش متداول استفاده از دستور if، استفاده از if هاي تودرتو مي باشد كه در مثال بالا نيز ديده مي شود. دراينحالت مجموعه اي از عبارات if-else-if بصورت متداخل قرار داده مي شوند. بعنوان نمونه به مثال زير توجه كنيد:

if (grade> = 18) printf("good!");
else if (grade> = 15) printf("medium!");
else if (grade> = 12) printf("rather weak!");
else if (grade> = 10) printf("weak");
else printf("failed!");

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

مشكلي كه در مورد if هاي تودرتو پيش مي آيد، مسئله تعيين if مربوط به هر else است. بعنوان مثال در مورد دستور زير، else به كدام if تعلق دارد؟

if (a if (c ;
else ;

همانطور كه از دندانه گذاري نيز مشخص است، else مربوط به دومين if مي باشد. يعني درصورتي اجرا خواهد شد كه a

if (a < b) if (a if (c ; if (c ;
else ; }
else ; else ;

بعنوان يك مثال ديگر، به نمونه زير دقت كنيد:

if () {
if ()
if () ;
else ; // this refer to if ()
}
else ;//this refer to if

برنامه 2) برنامه اي بنويسيد كه 3 عدد را دريافت و حداكثر آنها را چاپ كند.

#include
void main() {
int a, b, c, max;
printf("Please enter 3 numbers :");
scanf("%d %d %d",&a, &b, &c);
if (a> b)
if (a> c) max = a;
else max= c;
else if (b> c) max = b;
else max = c;
printf("Maximum is %d",max);
}

ساختار تكرار while

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

while () ;

اين  دستور  باعث  مي  شود  تا  زمانيكه  شرط  موجود  در  قسمت  درست است،  دستور   قسمت  تكرار شود، و به محض اينكه شرط نادرست گردد، كنترل اجرا به دستور بعد از حلقه مي رود.

بازهم دستور موجود در قسمت مي تواند يك دستور مركب باشد، دراينصورت دستور بصورت زير درخواهد آمد:

while () {
;
;
…….
;
}

برنامه 3) برنامه اي بنويسيد كه يك عدد را دريافت و فاكتوريال آن را محاسبه و چاپ نمايد.

#include
void main() {
int i,number;
long int factorial;
printf("Please enter number :");
scanf("%d",&number);
factorial = 1;
i = 1;
while (i <= number) {
factorial *= i;
i ++;
}
printf("Factorial of %d is %ld"number,factorial);
}

برنامه 4) برنامه اي بنويسيد كه يك متن را از كاربر دريافت و آن را با حروف بزرگ چاپ كند.

#include
void main() {
char ch;
ch = getch() ;
while (ch != 13) {
if (ch>= 'a' && ch <= 'z')
ch -= 32;
putch(ch);
ch = getch();
}
}

ساختار تكرار for

همانگونه كه در مثال مربوط به حل مسئله فاكتوريال ديده مي شود، گاهي نياز به حلقه تكراري داريم كه به تعداد دفعات مشخصي تكرار گردد. در چنين مواقعي با استفاده از يك متغير شمارنده، تعداد تكرارها را تا رسيدن به مقدار مورد نظر می شماریم و سپس به حلقه پایان می دهیم. به چنین حلقه هایی، تکرار تحت کنترل شمارنده یا تکرار معین می گوییم، چرا که تعداد تکرار ها از قبل مشخص است. چنین حلقه ای دارای 3 جزء اصلی می باشد:

1- مقداردهی اولیه به متغیر شمارنده حلقه
2- شرط پایان حلقه (پایان شمارش)
3- نحوه افزایش متغیر شمارنده

از آنجا که در تمام حلقه هایی که تکرار معین دارند، همین ساختار استفاده می شود؛ در اکثر زبانهای برنامه سازی یک ساختار تکرار ویژه، بنام حلقه for، برای اینکار در نظر گرفته شده است. اما در این بین، حلقه تکرار for در زبان C دارای ویژگیهای خاصی است که آنرا از سایر زبانها متمایز کرده و به آن قدرت بسیار بالایی داده است. شکل کلی این دستور بصورت زیر است:

for ( ; ; ) ;

وظایف عبارات فوق بشرح زیر است :

1- ، مقداردهی اولیه به متغیر حلقه

2- ، شرط اجرای حلقه

3- ،نحوه افزایش متغیر حلقه

البته همانندموارد قبل بازهم قسمت می تواند یک دستور مرکب باشد. نحوه کار حلقه بدینصورت است که در ابتدای شروع حلقه فقط برای یکبار اجرا می شود. سپس عبارت بررسی می گردد و در صورتیکه درست ارزیابی شود (≠ 0)، آنگاه دستور اجرا شده و سپس به ابتدای حلقه باز می گردد. از اجرای دوم به بعد، ابتدا عبارت اجرا می گردد (یعنی متغیر حلقه افزایش می یابد) و سپس عبارت بررسی می گردد و مجددا درصورت درست بودن، حلقه تکرار می شود. اینکار تا زمانیکه مقدار عبارت نادرست ( = 0) ارزیابی شود، تکرار می گردد. به محض اینکه این اتفاق بیفتد، کنترل اجرا به دستور پس از حلقه انتقال می یابد.
درحقیقت هر حلقه for معادل با حلقه while زیر است:

;
while () {
;
;
}

بعنوان یک مثال ساده، تکه برنامه زیر اعداد بین 0 تا 100 را چاپ می نماید:

int count;
for (count = 0; count <= 100; count ++)
printf(“%d “,count);

اگر بخواهيم تنها مضارب 5 چاپ شوند، حلقه را به شكل زير تغيير مي دهيم:

for (count = 0; count <= 100; count += 5)

حتي مي توان مضارب 5 را از آخر به اول چاپ كرد:

for (count = 100; count> = 0; count -= 5)

قسمت شرط مي تواند يك شرط مركب نيز باشد، بعنوان مثال:

for (count = 0; count <100 && sw==1; count ++)

كه در اينصورت در هربار اجراي حلقه، علاوه بر مقدار شمارنده، مقدار متغير sw نيز بررسي مي گردد.

نكته آخر اينكه قسمت مقدار دهي اوليه و افزايش متغير نيز مي توانند شامل چند عبارت باشند كه در اينصورت با كاما از يكديگر جدا مي شوند. بعنوان مثال:

for (a = 0, b = 100; b – a> 50; a++, b--)

در ادامه یک مثال کاملتر برای تشریح این حلقه آمده است:

برنامه 5) برنامه ای بنویسید که تعدادی عدد را از کاربر دریافت و 2 عدد بزرگتر و مجموع آنها را محاسبه و چاپ نماید.

#include
void main() {
int i, n, number;
int sum, max1, max2;
printf(“please enter n : “);
scanf(“%d”,&n);
sum = 0;
max1 = max2 = -1;
for (i=1 ; iprintf(“enter number : “);
scanf(“%d”,&number);
sum += number;
if (number> max1) {
max2 = max1;
max1 = number;
}
else if (number> max2)
max2 = number;
} //end for
printf(“Sum = %d, Maximum 1=%d, Maximum 2= d”, sum, max1, max2);
}

نكته جالب در مورد حلقه for آنستكه مي توان هريك از 3 عبارت فوق را حذف كرد. به مثالهاي زير توجه كنيد:

for (;i<100; i++)

مقداردهي اوليه حذف شده است. اين در صورتي است كه بنحوي قبل از شروع حلقه، مقدار متغير i تعيين شده باشد.

for (i= 0;i<100;)

نحوه افزايش متغير حلقه حذف شده است. اين مورد زماني بكار مي رود كه نحوه افزايش متغير حلقه پيچيده بوده و توسط برنامه نويس در داخل حلقه انجام شود.

for (;i<100;)

هر دو مورد فوق حذف شده است.

for (i=0; ;i++)

شرط ادامه حلقه حذف شده است. اين مورد زياد متداول نيست و ممكن است باعث شود حلقه براي هميشه اجرا شود. در چنين مواردي حتما بايد در داخل حلقه با استفاده از دستور break (كه در قسمتهاي بعدي توضيح داده خواهد شد)، راهي براي خروج از حلقه قرار داده شود.

حلقه do / while

 در بعضي مواقع لازم است كه شرط ، در انتهاي حلقه بررسي گردد. دستور do / while از نوع حلقه هايي است كه ابتدا دستورات را اجرا كرده و سپس شرط ادامه حلقه را بررسي مي نمايد. شكل كلي اين دستور بصورت زير است:

do
;
while () ;

نحوه كار اين حلقه به اين صورت است كه ابتدا دستور اجرا مي گردد، سپس شرط حلقه بررسي شده و درصورتيكه درست بود، به ابتداي حلقه باز گشته و آن را مجددا اجرا مي كند. البته دستور مي تواند يك دستور مركب باشد.

بعنوان يك مثال كوچك، ممكن است شما از كاربر خواسته ايد كه اعلام كند آيا مايل به ادامه هست يا خير؟ وي بايد پاسخ y يا n بدهد، اما ممكن است يك حرف اشتباه (مانند m) وارد كند. قصد داريم تكه برنامه اي بنويسيم كه عمل دريافت پاسخ را تا زمانيكه يك حرف درست وارد شود، تكرار كند. مسلم است كه بايد ابتدا يك پاسخ وارد شود و سپس درستي آن بررسي گردد.

char answer;
do {
printf("Do you want to continue (y/n) ?");
answer = getch();
} while (answer != 'y' && answer != 'n') ;

بعنوان يك نمونه كاملتر به مثال زير توجه كنيد.

برنامه 6) فرض كنيد نمرات يك گروه از دانشجويان بصورت درجه بندي (A, B, C and D) آماده شده است. برنامه اي بنويسيد كه نمرات دانشجويان را دريافت و در پايان درصد هريك از نمرات را محاسبه و چاپ نمايد. در ضمن از آنجا كه تعداد دانشجويان از قبل مشخص نيست، كاربر در انتهاي نمرات، حرف Q (مخفف Quit) را وارد مي نمايد.

#include
void main() {
int aCount, bCount, cCount, dCount, n;
char grade;
aCount = bCount = cCount = dCount = n = 0;
do {
printf("Enter grade (Q for Quit) : ");
grade = getch() ;
n ++;
if (grade == 'A') aCount ++;
else if (grade == 'B') bCount ++;
else if (grade == 'C') cCount ++;
else if (grade == 'D') dCount ++;
else if (grade == 'Q') n --;
else {
printf("Wrong grade, try again.\n");
n --;
}
} while (grade != 'Q' ) ;
printf("Statistics :\n");
printf("Grade A : %f percent\n", float(aCount)/float(n));
printf("Grade B : %f percent\n", float(bCount)/float(n));
printf("Grade C : %f percent\n", float(cCount)/float(n));
printf("Grade D : %f percent\n", float(dCount)/float(n));
} // end main
ساختار switch / case

اگر مجددا به برنامه 6 دقت كنيد، خواهيد ديد كه در بعضي موارد قصد داريم برحسب مقادير مختلف يك عبارت (در اينجا مقدار متغير grade)، عمليات متفاوتي را انجام دهيم. گرچه اينكار با استفاده از دستورات if / else متداخل قابل انجام است، اما ساختار مناسبتري نيز براي اينكار وجود دارد، كه به آن ساختار چندانتخابي مي گوييم. شكل كلي ان ساختار بصورت زير است:

switch () {
case : ;
;

;
case : ;
;

;

default : ;
;

;
}

برنامه 7) برنامه 6 را با استفاده از دستور switch / case بازنويسي نماييد. برنامه را بگونه اي بنويسيد كه حروف بزرگ و كوچك هردو مورد قبول واقع شود.

#include
void main() {
int aCount, bCount, cCount, dCount, n;
char grade;
aCount = bCount = cCount = dCount = n = 0;
do {
printf("Enter grade (Q for Quit) : ");
grade = getch() ;
n ++;
switch (grade) {
case 'A' :
case 'a' : aCount ++; break ;
case 'B' :
case 'b' : bCount ++; break ;
case 'C' :
case 'c' : cCount ++; break ;
case 'D' :
case 'd' : dCount ++; break ;
case 'Q' :
case 'q' : n--; break ;
default : printf("Wrong grade, try again.\n");
n --;
} //end switch
} while (grade != 'Q' ) ;
printf("Statistics :\n");
printf("Grade A : %f percent\n", float(aCount)/float(n));
printf("Grade B : %f percent\n", float(bCount)/float(n));
printf("Grade C : %f percent\n", float(cCount)/float(n));
printf("Grade D : %f percent\n", float(dCount)/float(n));
} // end main

برنامه 8) برنامه اي بنويسيد كه يك عدد، يك عملگر و يك عدد ديگر را از كاربر دريافت و پس از اعمال عملگر برروي دو عدد، حاصل را چاپ نمايد.

#include
void main() {
int number2, number2, result;
char op ;
printf("Please enter number1 operator number2 : ");
scanf("%d %c %d",&number1, &number2, &op, &number3);
result = 0;
switch (op) {
case '+' : result = number1 + number2 ; break;
case '-' : result = number1 - number2 ; break;
case '*' : result = number1 * number2 ; break;
case '/' : if (number2 != 0) result = number1 / number2 ;
else printf("There is no answer!\n");
break;
case '%' : if (number2 != 0) result = number1 % number2 ;
else printf("There is no answer!\n");
break;
default : printf("invalid operator!\n");
}
printf("Result = %d",&result);
}

دستورات break و continue

اين دستورات قادرند مسير اجراي برنامه را در يك حلقه تكرار تغيير دهند. البته اين تغيير مسير بصورت كنترل شده بوده و همانند دستور goto نمي توان به هرجاي دلخواه پرش كرد.

چنانچه دستور break در يك ساختار while، for، do/while ويا switch بكار رود، باعث مي شود كه بلافاصله كنترل اجراي برنامه از ساختار خارج شده و به اولين دستور پس از ساختار برود. قبلا كاربرد اين دستور را در switch ديده ايد. در اينجا به مثال زير دقت كنيد:

برنامه 9) برنامه 5 را بگونه اي تغيير دهيد كه فقط اعداد مثبت را بپذيرد، و درصورتيكه عدد منفي وارد شد، بلافاصله به عمليات خاتمه داده و نتايج تا همين نقطه را چاپ نمايد.

#include
void main() {
int i, n, number;
int sum, max1, max2;
printf(“please enter n : “);
scanf(“%d”,&n);
sum = 0;
max1 = max2 = -1;
for (i=1 ; iprintf(“enter number : “);
scanf(“%d”,&number);
if (number <0) break; // this is the difference
sum += number;
if (number> max1) {
max2 = max1;
max1 = number;
}
else if (number> max2)
max2 = number;
} //end for
printf(“Sum = %d, Maximum 1=%d, Maximum 2= d”, sum, max1, max2);
}

اما دستور continue فقط در حلقه هاي while، for و do/while بكار مي رود. نحوه عمل آن بدين صورت است كه به محض آنكه كنترل اجرا به اين دستور برسد، بلافاصله از باقيمانده حلقه صرفنظر كرده و مجددا به ابتداي حلقه باز مي گردد و اجراي آن را از سر مي گيرد. در مورد حلقه for، پس از بازگشت به ابتداي حلقه، عمل افزايش مقدار متغير حلقه نيز صورت مي پذيرد.

بعنوان مثال، چنانچه بخواهيم برنامه 9 را بگونه اي تغيير دهيم كه از اعداد منفي صرفنظر كند و آنها را در محاسبات لحاظ نكند، كافيست دستور

if (number <0) break;

را به دستور زير تبديل كنيم:

if (number <0) continue;

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


ادامه مطلب
+ نوشته شده در  سه شنبه بیست و یکم آبان 1387ساعت 21:28  توسط گروه مولفان  | 

آموزش زبان cبراي مبتديان

درس اول
مقدمات زبان C


زبان C در سال 1970 توسط دنيس ريچي طراحي گرديد. اين زبان تكامل يافته زبان BCPL ميباشد كه طراح آن مارتين ريچاردز است ،و زبان BCPL از زبان B كه طراح آن كن تامپسون مي باشد ، نتيجه شده است . زبان C معمولا" يك زبان مياني ناميده مي شود . اين بدان معني نيست كه آموزش اين زبان مشكل است ، يا قدرت آن از زبان هاي برنامه سازي مثل پاسكال و بيسيك كمتر است و يا اين كه مشكلاتي مشابه زبان اسمبلي براي برنامه نويس ايجاد مي كند. علت مياني بودن زبان C اين است كه عناصر زبان هاي سطح بالا را با خصيصه تابعي زبان اسمبلي درهم آميخته است.
زبان C همانند ساير زبانهاي مياني با مفاهيم بيت ، بايت و آدرس كه از عناصر ابتدايي ماشين هستند سر و كار دارد . يعني در اين زبان مي توان محتويات بيت ها و بايت ها را تيز تغيير داد . برنامه هاي نوشته شده به زبان C براحتي از ماشيني به ماشين ديگر قابل انتقال مي باشند . مثلا" برنامه نوشته شده براي كامپيوتر APPL در كامپيوترهاي IBM قابل اجرا است . اين خصيصه را قابل حمل بودن (Portability) زبان مي گويند . كليه زبان هاي برنامه سازي سطح بالا و مياني داراي نوعهاي داده (data types) هستند . هر نوع داده ، مجموعه اي از مقادير را مشخص مي كند كه اعمال خاصي روي آنها قابل انجام است .
نوع داده اي كه در اكثر زبانها وجود دارد عبارتند از :
• اعداد صحيح
• كاراكتري
• اعداد اعشاري

هر برنامه در زبان C داراي خصيصه هايي است كه بعضي از آنها عبارتند از :
• در زبان C هر دستور برنامه به يك ; ختم مي شود .
• هر دستور ميتواند درچند خط ادامه داشته و يك خط ممكن است شامل چند دستور باشد .
• حداكثر طول يك خط برنامه 254 كاراكتر است .
• براي داشتن توضيحات در برنامه كافي است آنها را دربين /*و */ قرار داد.

C زبان برنامه نويسي سيستم است . منظور از برنامه هاي سيستم عبارتند از :
• سيستم عامل (Operating system)
• مفسر (Interpreter)
• ويراستار (Editor)
• اسمبلر (Assrmbler)
• كامپايلر (Compiler)
• مديريت بانكهاي اطلاعاتي (Database management)

امروزه C در اكثر امور برنامه نويسي مورد استفاده قرار مي گيرد . زيرا اين زبان هم داراي خصيصه " قابل حمل بودن " است و هم داراي كارآيي خوبي مي باشد و سرعت زياد C بر محبوبيت آن افزوده است . مساله قابل حمل بودن ، يك مساله بسيار مهم است زيرا هم موجب صرفه جويي در وقت شده و هم باعث صرفه جويي در هزينه ها مي گردد .
زبان C فقط داراي 32 كلمه كليدي است كه 27 كلمه كليدي آن توسط ريچي ( طراح زبان ) معرفي شده و 5 كلمه كليدي ديگر توسط موسسه استاندارد سازي زبان به آن اضافه شده است . اين تعداد در مقايسه با 159 كلمه كليدي كه در زبان بيسيك وجود دارد قابل توجه است . كليه كلمات كليدي در زبان C به حروف كوچك نوشته مي شوند . چون در اين زبان بين حروف كوچك و بزرگ تفاوت است ، به عنوان مثال كلمه else يك كلمه كليدي است در حالی که ELSE کاملا با آن متفاوت بوده و کلمه کلیدی نمی باشد.


C Programming Language Keywords:

auto------double-------int----------struct----------break--------else----------long------------switch
case------enum*-------register----typedef--------char---------extern-------return----------union
const*----float---------short--------unsigned------continue----for-----------signed*--------void*
default----goto---------sizeof-------volatile*-------do----------if--------------static----------while
__________________
 
 
 
درس دوم
انواع داده C


همان طور كه قبلا" گفته شد در هر زبان برنامه سازي تعدادي از نوع هاي داده وجود دارند كه بازه اي را شامل بوده و اعمال خاصي روي آنها انجام پذير است و در C پنج نوع داده اصلي وجود دارد كه عبارتند از : char - int - float - double - void .در اين زبان اندازه و محدوده اي كه هر نوع داده اختيار مي كند بستگي به نوع پردازشگر (Processor) و نحوه پياده سازي كامپايلر دارد. شناسه هايي ( متغير برچسب ، اسامي توابع و ... ) كه از نوع char باشند براي ذخيره كردن مقاديري كه توسط كاراكترهاي اسكي تعريف شده اند به كار مي روند. شناسه هايي از نوع int براي ذخيره كردن مقادير صحيح ، و از نوع floatو doubleو براي ذخيره كردن اطلاعات عددي اعشاري به كار ميروند كه محدوده آنها توسط تعداد ارقام و دقت آنها مشخص ميشود. نوع void در مورد توابع به كار مي رود . نوعهاي داده اصلي ( به جز void ) مي توانند با عباراتي مثل signed، long، unsigned و shortو تركيب شده و نوع هاي ديگري را به وجود آورند .
جدول زیر انواع داده های موجود در زبان C را با مشخصاتی همچون مقدار حافظه مورد نیاز و ... را مشخص می نماید.

 
درس سوم
متغیر ها در زبان C


متغير، نامي براي يك محل حافظه است كه محتويات آن در طول اجراي برنامه ممكن است تغيير كند . اسم هر متغير شامل حروف کوچک a تا z و حروف بزرگ A تا Z و ارقام 0 تا 9 و خط ربط است . به طوري كه با يكي از حروف و يا خط ربط شروع شده باشند . طول نام هر متغير بستگي به نوع كامپايلر دارد كه معمولا"از 1 تا 31 كاراكتر قابل استفاده است.

تعريف نوع متغير
براي استفاده از متغيرها در C بايد ابتدا آنها را تعريف كنيم . تعريف متغيرها شامل نامگذاري و تعيين نوع آنها است كه به صورت زير انجام مي شود : <نوع> <اسامي متغيرها>
<نوع> يكي از انواع است كه قبلا ذكر كرديم و <اسامي متغيرها> شامل متغيرهايي است كه مي خواهيم داراي آن نوع باشند . براي تعريف چند متغير در يك دستور بايد اسامي با كاما از يكديگر جدا گردد:

int var1, var2;
دستور فوق دو متغير به اسامي var2 و var1 و را از نوع int تعريف مي كند.
float flovar1, flovar2;
دستور فوق دو متغير به نام هاي flovar2 و flovar1 و را از نوع float تعريف مي كند.
double d1; char ch;
اولين دستور ، d1 را از نوع double و دستور دوم متغير ch را از نوع char تعريف مي كند .

مقدار دادن به متغيرها
براي مقدار دادن به متغيرها مي توان به دو طريق عمل كرد:
1 به هنگام تعريف متغير.
2 پس از تعريف متغير .
به عنوان مثال :
int a=0;
int b, c, d, e = 0;
char ch= 'a';
b = 0;
c = d = 0;
• دستور اول ضمن تعريف a از نوع int مقدار آن را برابر با 0 قرار مي دهد .
• دستور دوم چهار متغير b و c و d و e را از نوع int تعريف كرده و فقط مقدار متغير e را برابر با 0 قرار می دهد.
• دستور سوم ch را از نوع كاراكتري تعريف كرده و مقدار آن را برابر با حرف a قرار مي دهد.
• دستور چهارم مقدار متغير b را برابر با 0 قرار مي دهد.
• دستور پنجم مقدار دو متغير c و d و را برابر صفر قرار مي دهد و اين دستور ، انتساب چندتايي را مشخص مي كند.

همان طور كه قبلا"گفته شد مقدار متغيرها ممكن است در طول اجراي برنامه تغيير كند . با استفاده از كلمه كليدي const مي توانيم متغيرهايي را تعريف كنيم كه مقدار آنها در طول اجراي برنامه ثابت باشد . براي تعريف اين نوع متغيرها بصورت زير عمل مي شود : <نوع> <اسامي متغيرها> const
const int a = 10;
دستور فوق متغير a را از نوع int تعريف كرده و مقدار آن را برابر 10 قرار مي دهد . اين مقدار در طول اجراي برنامه قابل تغيير نمی باشد.
 
درس چهارم
عملگرها در زبان C
عملگرها نمادهايي هستند كه براي انجام اعمال خاصي مورد استفاده قرار ميگيرند. عملگرها در زبان C از تنوع زيادي برخوردارند. در C چهار دسته عملگر به نامهاي (محاسباتي ، رابطه اي ، منطقي و دستكاري بيت ها ) وجود دارند كه آنها را بررسي مي كنيم .

عملگرهاي محاسباتي
عملگرهاي محاسباتي كه در C مورد استفاده قرار مي گيرند در جدول زیر فهرست شده اند .
رديف عملگر نام مثال
1) - تفريق x-y
2) + جمع x+y
3) * ضرب x*y
4) / تقسيم x/y
5) % باقيمانده تقسيم x%y
6) -- يك واحد كاهش x-- , --x
7) ++ یک واحد افزایش x++ , ++x

عملگرهاي رابطه اي
عملگرهاي رابطه اي براي تشخيص ارتباط بين عملوندها يا مقايسه آنها مورد استفاده قرار مي گيرند.
رديف عملگر نام مثال
1) > بزرگتر x>y
2) >= بزرگتر مساوي x>=y
3) < كوچكتر x
4) <= كوچكتر مساوي x<=y
5) == مساوي بودن x==y
6) != نامساوي x=y
نكته قابل ذكر درمورد عملگرهاي رابطه اي اين است كه عملگر == براي تشخيص مساوي بودن دو عبارت مورد استفاده قرار مي گيرد. اين عملگر با عملگر = كه براي انتساب يك عبارت به يك متغير استفاده مي شود متفاوت است .

عملگرهاي منطقي
عملگرهاي منطقي بر روي عملوندهاي منطقي عمل ميكنند. عملوندهاي منطقي داراي دو ارزش درستي و نادرستي هستند .
رديف عملگر نام مثال
1) && و - AND x&&y
2) || یا - OR x||y
3) ! نقض - NOT !x
ارزش نادرستي درزبان C با مقدار صفر و ارزش درستي با مقادير غيراز صفر مشخص ميشود.
عملگرهاي محاسباتي و رابطه اي با يكديگر تركيب شده و عملگرهاي ديگري را بنام عملگرهاي محاسباتي رابطه اي ايجاد مي كنند.
رديف عملگر نام مثال معادل
1) += انتساب جمع x+=y x=x+y
2) -= انتساب تفريق x-=y x=x-y
3) *= انتساب ضرب x*=y x=x*y
4) /= انتساب تقسيم x/=y x=x/y
5) %= انتساب باقيمانده تقسي x%=y x=x%y

نکته مهم:
با توجه به اهمیت و گستردگی بحث عملگرهای دستکاری بیتها، این بحث به صورت یک درس جداگانه مورد بررسی قرار خواهد گرفت.
__________________
درس پنجم
عملگرهای دستکاری بیتها در زبان C


ازآنجايي كه زبان C طوري طراحي شده است كه بتواند دربسياري ازموارد جايگزين زبان اسمبلي گردد. بايد قادر باشد كليه اعمال ( يا حداقل بسياري از اعمال ) كه در زبان اسمبلي قابل انجام هستند را انجام دهد . يكي از اعمالي كه در زبان اسمبلي براحتي انجام پذير است . انجام اعمالي بر روي بيت هاي يك بايت يا يك كلمه از حافظه است كه در زبان C براي انجام اين منظور از عملگرهايي استفاده مي شود كه به عملگرهاي بيتي معروفند. اين عملگرها انجام اعمال تست ، مقدار دادن و يا انتقال (shift) بيت ها را در يك بايت يا كلمه حافظه امكان پذير مي نمايند. عملگرهاي بيتي فقط بر روي متغيرهايي از نوع charيا int عمل مي كنند و بر روي متغيرهايي از نوع float، double،، long double،، void، و يا ساير متغيرها قابل اجرا نيستند . عملگرهاي بيتي & و | و ~ و (AND، OR، NOT) مشابه عملگرهاي منطقي AND، ORو NOT عمل مي كنند با اين تفاوت كه عمل آنها بر روي يك بيت است . با فرض اين كه p و q دو بيت مختلف باشند ، نحوه عمل عملگر ^ را در ذيل مشاهده مي نماييد .
مقدار P------مقدار Q-------مقدار P^Q
۰----------------۰----------------۰
۱----------------۰----------------۱
۰----------------۱----------------۱
۱----------------۱----------------۰
نکته مهم: هر بیت در حافظه فقط می تواند مقدار ۰ یا ۱ را داشته باشد.
همان طور كه مشاهده شد ، نتيجه عملگر بيتي ^ وقتي يك (1) است كه يكي از عملوندهاي آن صفر و ديگري يك باشد . به عبارت ديگر ، نتيجه عملگر بيتي ^ وقتي صفر است كه هر دو عملوند آن صفر و يا هر دو يك باشند .مشخصات عملگرهای بیتی در جدول زیر مشخص شده است.
عملگر-----------عنوان---نوع عملیات
&--------------AND-----------------و
|---------------OR-----------------یا
^---------------XOR---------------یا انحصاری
~---------------NOT---------------نقیض
<<-------------SHIFTRIGHT------ انتقال به سمت راست
>>-------------SHIFT LEFT-------اتنقال به سمت چپ

عملگرهاي & و | و ^ و << و >> بر روي دو عملوند عمل مي كنند اما عملگرهاي ~ و >> و << بر روي يك عملوند عمل مي كنند .
عملگرهاي >> و << به صورت ذيل به كار مي روند:
متغير >> تعداد انتقال
متغير << تعداد انتقال
در روش كلي فوق ، متغير ، يك بايت يا كلمه اي از حافظه است كه عملگرهاي بايد بر روي آن عمل كنند . تعداد انتقال عددي است كه مشخص مي كند بيت هاي متغير بايد چند محل به سمت راست و يا چپ انتقال يابند . هر انتقال به چپ ، معادل با تقسيم كردن مقدار متغير به 2 و هر انتقال به راست ، معادل ضرب كردن در 2 است . جدول زیر روش استفاده از این دو عملگر و نتایج استفاده از آنها را مشخص می نماید.


عملگر ~ در يك بايت يا كلمه حافظه ( يك متغير ) كليه بيت ها را نقيض ميكند. يعني بيت صفر را به بيت يك و بيت يك را به بيت صفر تبديل مي نمايد . لذا اگر اين عملگر دو بار بر روي يك متغير عمل كند وضعيت بيت هاي متغير به حالت اول برمي گردند .

نکته مهم: اين عملگرها معمولا" در مبدل هاي دستگاهها (device drivers) مورد استفاده قرار مي گيرند . مثل برنامه هايي كه براي كار با modem و با چاپگر نوشته مي شوند . زيرا در اين گونه موارد معمولا" تست كردن بيت هاي يك متغير مد نظر خواهد بود .
__________________
درس ششم
تقدم عملیات عملگرها در زبان C

دلیل الزام وجود تقدم عملکرد در عملگرها در زبان C:

عبارت ساده ریاضی زیر را در نظر بگیرید 2 + 3 * 4، در هنگام محاسبه مقدار این عبارت به دو صورت زیر می توان عمل نمود. در حالت اول می توان ابتدا دو عدد 2و 3 را با هم جمع نمود و سپس حاصل (9) را در عدد 4 ضرب نمود که در این حالت مقدار نهایی عبارت برابر با 36 محاسبه خواهد شد. در حالت دوم میتوان ابتدا اعداد 3 و 4 را در هم ضرب کرد و سپس حاصل (12) را با عدد 2 جمع کرد که در این حالت نتیجه نهایی عبارت خواهد بود با 14. با توجه به آنچه گفته شد می توان اینطور نتیجه گرفت که این عبارت می تواند(با توجه به نحوه محاسبه) دارای دو نتیجه مختلف باشد، در حالی که در حالت کلی چنین چیزی غیر ممکن به نظر می رسد، چرا که برای انجام عملیاتهای مختلف باید هر عبارت دقیقا دارای یک نتیجه باشد تا با استناد به آن بتوانیم از صحت انجام عملیات اطمینان داشته باشیم. این مطلب به روشنی الزام وجود تقدم عملکرد در بین عملگرهای یک زبان برنامه نویسی و از جمله زبان برنامه نویسی C را مشخص می نماید.
تقدم عملکرد عملگرها در زبان C :
جدول زیر تقدم عملکرد عملگرهای مختلف در زبان C را مورد بررسی قرار می دهد.
سطح تقدم-------------------------------------عملگر
1---------------------------------------) [] -> .
2----------------------------------------- ++ --
3-----------------------------------------* / %
4--------------------------------------------+ -
5----------------------------------------<< >>
6-----------------------------------< <= >= >
7-----------------------------------------== !=
8-----------------------------------------------&
9-----------------------------------------------^
10-----------------------------------------------|
11---------------------------------------------&&
12----------------------------------------------||
13----------------------------------------------?:
14-----= += -= *= /= %= &= |= <<= >>=
15------------------------------------------------,
بعضی از عملگرهای موجود در جدول هنوز معرفی نشده اند. این عملگرها در درسهای آینده مورد بررسی قرار خواهند گرفت.
__________________
درس هفتم
توابع در زبان C


تابع (function) بخش مستقلی در یک برنامه است که نام مشخصی دارد و کار خاصی را انجام می دهد، از توابع در حالت کلی برای انجام کارهای تکراری و همچنین بهتر کردن ساختار برنامه استفاده می شود. یک تابع می تواند مقداری را به برنامه فراخواننده خود برگرداند و یا برنگرداند. با توجه به نعریفی در در ارتباط با تابع داده شد، می توان مشخصات زیر را در ارتباط با توابع بیان نمود.
· تابع بخش مستقلی است،· به این معنی که تابع می تواند کارهای خود را بدون دخالت سایر بخشهای برنامه (و یا با استفاده از آنها) انجام دهد.
· هر تابع نام مشخصی دارد،· نام تابع منحصر به فرد می باشد (هر تابع نام مربوط به خود را دارا می باشد). سایر بخشهای برنامه می توانند با استفاده از این نام تابع را فراخوانی نموده و از امکانات تعریف شده توسط آن استفاده نمایند.
· تابع کار خاصی انجام می دهد. یک برنامه برای انجام هدف نهایی باید مارهای متعددی انجام دهد که برای مشخص شدن این کارها می توان هر کار را به صورت یک تابع تعریف نمود و در مواقع مورد نیاز آن را فراخوانی نمود.
· تابع می تواند مقداری را به فراخواننده خود بازگرداند. برای مثال می توان تابعی نوشت که تعدادی عدد را به عنوان ورودی دریافت نموده و مقدار ماکزیمم آنها را بازگرداند.
برای تعریف تابع به صورت زیر می توان عمل نمود.


type name(variables) {
function body
}
· type: مشخص کننده نوع مقدار بازگشتی تابع می باشد.
· name: مشخص کننده نام تعیین شده برای تابع می باشد.
· variables: مشخص کننده متغیرهایی است که به عنوان ورودی های اولیه در هنگام فراخوانی تابع استفاده می شود.
· function body: مشخص کننده مجموعه عملیاتی است که تابع انجام می دهد. این دستورات بین دو آک.لاد قرار می گیرند.
مثالهایی از تعریف تابع
· double squared(double number)
· int get_name()


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


در مورد برنامه هاي طولاني و پيچيده كه شامل چندين قسمت منطقي تقريبا" مستقلي هستند بهتر است براي هر قسمت منطقي ، برنامه اي نوشته و سپس آنها را به يكديگر متصل (Link) كرد . هر يك از اين قسمتها يك زير برنامه نام دارند . استفاده از زير برنامه جهت طراحي برنامه ها ، داراي مزاياي زيادي است كه بر اهل كامپيوتر پوشيده نيست . در زبانهاي برنامه سازي مختلف معمولا"دو نوع زيربرنامه وجود دارند و عبارتند از :
• زير برنامه هاي تابع
• زير برنامه هاي زير روال
در زبان C فقط زيربرنامه تابع مورد استفاده قرار ميگيرد. كاري را كه زيربرنامه هاي زير روال در ساير زبان هاي برنامه سازي انجام مي دهند ، در زبان C توسط زير برنامه هاي تابع صورت مي گيرد . در اينجا منظور از زير برنامه ، توابع هستند. توابع در زبان C داراي ساختمان خاصي هستند که به صورت زیر می باشد.
اسامي پارامترها) نام تابع نوع تابع) {
تعريف پارامترها
بدنه تابع
}
منظور از نوع تابع ، يكي از انواع معتبر در زبان C است كه نوع مقدار برگردانده شده توسط تابع را مشخص مي كند . تعيين نوع توابع ، اختياري است . اگر تابعي تعيين نوع نگردد كامپايلر زبان C فرض مي كند مقداري كه توسط تابع برگردانده مي شود از نوع " صحيح " است . نام تابع از قانون نامگذاري براي متغيرهاي تبعيت مي كند . اسامي پارامترها شامل متغيرهايي است كه بايد به تابع منتقل كردند . اگر تعداد پارامترها بيش از يكي باشد يا كاما از يكديگر جدا مي شوند . تعريف پارامترها مجموعه دستوراتي است كه نوع پارامترها را تعيين مي نمايد . تعيين نوع پارامترها در حين تعريف تابع نيز امكان پذير است . بدنه تابع شامل دستورالعمل هايي است كه عمل تابع را مشخص مي كند . نكاتي را كه بايد در مورد توابع در نظر داشت عبارتند از:
• كليه توابع فرعي بعد از تابع اصلي ()main تعريف مي شوند .
• اگر نوع تابعي غيراز نوع " صحيح " باشد، نوع آن بايد در تابع فراخواننده به كامپايلر اعلان شود .
• براي اجراي تابع بايد آنها را فراخواني نمود ( فراخواني توابع توسط نام آنها انجام مي شود ) .
• همانطور كه متغيرهاي قابل استفاده در تابع اصلي بايد در ابتداي اين تابع تعريف شوند ، متغيرهاي مورد نياز هر تابع فرعي نيز بايد در ابتداي آنها تعريف كردند .
• تعريف يك تابع در داخل تابع ديگر امكان پذير نيست . ولي فراخواني سطوح مختلف توابع ، ممكن است .
• توابع از نظر تعداد مقاديري كه به تابع فراخواننده برمي گردانند ، به سه دسته تقسيم مي شوند .
الف ) توابعي كه هيچ مقداري را برنمي گردانند .
ب ) توابعي كه فقط يك مقدار را برمي گردانند .
ج ) توابعي كه چند مقدار را به عنوان نتيجه عمل برمي گردانند .
درموقع فراخواني توابع بايد دقت داشت كه تعداد و نوع آرگومانها با تعداد ونوع پارامترها يكسان باشند
 
درس نهم

تابع ()printf در زبان C


اين تابع براي انتقال اطلاعات از كامپيوتر به صفحه نمايش مورد استفاده قرار مي گيرد و بصورت زير استفاده مي شود :
printf (عبارات دیگر, عبارت کنترلی)
عبارت کنترلی شامل تعدادي كاراكترهاي كنترلي ، كاراكترهاي قالب جهت تعيين شكل خروجي و رشته هاي ديگري است كه بايد به خروجي منتقل شوند . عبارات دیگر شامل اطلاعاتي هستند كه با فرمت مشخص شده در عبارت کنترلی ، بايد به خروجي منتقل شوند. كاراكترهايي كه براي تعيين فرمت خروجي مورد استفاده قرار مي گيرند با كاراكتر % شروع مي شون. لیست این عبارات را در جدول زیر مشاهده خواهید نمود.

جدول زیر نیز لیست کاراکترهای کنترلی را در هنگام استفاده از تابع ()printf مشخص می نماید.

 
 
 
 
+ نوشته شده در  سه شنبه بیست و یکم آبان 1387ساعت 19:29  توسط گروه مولفان  | 

مفاهیم زبان c

زبان C در سال 1970 توسط دنيس ريچي طراحي گرديد. اين زبان تكامل يافته زبان BCPL
ميباشد كه طراح آن مارتين ريچاردز است ،و زبان BCPL از زبان B كه طراح آن
كن تامپسون مي باشد ، نتيجه شده است .
زبان C معمولا" يك زبان مياني ناميده مي شود . اين بدان معني نيست كه آموزش
اين زبان مشكل است ، يا قدرت آن از زبان هاي برنامه سازي مثل پاسكال و بيسيك
كمتر است و يا اين كه مشكلاتي مشابه زبان اسمبلي براي برنامه نويس ايجاد مي كند.
علت مياني بودن زبان C اين است كه عناصر زبان هاي سطح بالا را با خصيصه تابعي
زبان اسمبلي درهم آميخته است.

سطوح زبان هاي برنامه سازي

زبان C همانند ساير زبانهاي مياني با مفاهيم بيت ، بايت و آدرس كه از عناصر
ابتدايي ماشين هستند سر و كار دارد . يعني در اين زبان مي توان محتويات بيت ها
و بايت ها را تيز تغيير داد .
برنامه هاي نوشته شده به زبان C براحتي از ماشيني به ماشين ديگر قابل انتقال
مي باشند . مثلا" برنامه نوشته شده براي كامپيوتر APPL در كامپيوترهاي IBM قابل
اجرا است . اين خصيصه را قابل حمل بودن (Portability) زبان مي گويند .
كليه زبان هاي برنامه سازي سطح بالا و مياني داراي نوعهاي داده (data types)
هستند . هر نوع داده ، مجموعه اي از مقادير را مشخص مي كند كه اعمال خاصي روي
آنها قابل انجام است . نوع داده اي كه در اكثر زبانها وجود دارد عبارتند از :
اعداد صحيح ، كاراكتري و اعداد اعشاري . C داراي 5 نوع داده اصلي است كه در آن
تقريبا" تبديل هر نوع داده به نوع ديگر امكان پذير است . مثلا" در يك عبارت
مي توان نوع كاراكتري را با نوع عددي صحيح و يا اعشاري تركيب كرد .
زبان C خطاي زمان اجرا مثل boundray checking را چك نمي كند . منظور از boundray checking
اين است كه در آرايه ها تجاوز از حدود مشخص شده ، به راحتي
امكان پذير بوده و از نظر كامپايلر با خطايي مواجه نميشود. اين مساله برميگردد
به اين كه در زبان C آرايه يك اشاره گر (pointer) است . در اين راستا ، نوع
پارامترها و آرگومان هاي توابع نيز در گونه هاي قديمي C با يكديگر مطابقت نشده و
از نظر كامپايلر با خطا مواجه نمي شد ولي در گونه هاي جديد C با معرفي الگوي
تابع (Function prototype) اين مشكل رفع شده است . C
همانند زبان هاي ALGOL، PASCAL، و... يك زبان ساخت يافته است . يك زبان
برنامه سازي ساخت يافته امكانات زيادي ، از جمله استفاده از چند ساختار حلقه سازي
مثل while، do-while،و forو را فراهم مي كند . در اين گونه زبان ها از goto به
ندرت استفاده مي شود و نوشتن دستورات برنامه در هر ستوني از خط و در هر جاي
فايل امكان پذير بوده ، مثل زبان فرترن مقيد به ستون هاي خاصي نيستند. استفاده
از زيربرنامه ها و بلاك ها نيز از خصيصه هاي اين نوع زبان ها هستند . ذكر اسامي
چند زبان ساخت يافته و غير ساخت يافته ، در انتخاب زبان برنامه سازي جهت برنامه
نويسي مفيد است.

بعضي از زبانهاي ساخت يافته و غيرساخت يافته

هر برنامه در زبان C داراي خصيصه هايي است كه بعضي از آنها عبارتند از : 1
در زبان C هر دستور برنامه به يك ; ختم مي شود . 2
هر دستور ميتواند درچند خط ادامه داشته و يك خط ممكن است شامل چند دستور
باشد . 3
حداكثر طول يك خط برنامه 254 كاراكتر است . 4
در زبان C برنامه نويس مي تواند در هر نقطه از برنامه ، بااستفاده از علائم {
و }و يك بلاك را مشخص كرده و هر متغيري را كه مي خواهد در آنجا تعريف نمايد .
اين متغيرها فقط در آن بلاك معني خواهند داشت . توجه داريم كه هر بلاك مجموعه اي
از دستورات وابسته به يكديگر خواهد بود :
ؤؤ { |

بلاك | ; مجموعه دستورات } |

ؤؤ 5
براي داشتن توضيحات در برنامه كافي است آنها را دربين /*و *و/ قرار داد: *

توضيحات /* C
يك زبان ساخت يافته بلاكي نيست . اين بدان معني است كه تعريف يك زيربرنامه
( در اينجا تابع ) در زيربرنامه ديگر ( همانند پاسكال ) امكان پذير نيست و اين
امر از مساله coupling مي كاهد . C
زبان برنامه نويسي سيستم است . منظور از برنامه هاي سيستم عبارتند از : 1
سيستم عامل (Operating system) 2
مفسر (Interpreter) 3
ويراستار (Editor) 4
اسمبلر (Assrmbler) 5
كامپايلر (Compiler) 6
مديريت بانكهاي اطلاعاتي (Database management)
امروزه C در اكثر امور برنامه نويسي مورد استفاده قرار مي گيرد . زيرا اين
زبان هم داراي خصيصه " قابل حمل بودن " است و هم داراي كارآيي خوبي مي باشد و
سرعت زياد C بر محبوبيت آن افزوده است . مساله قابل حمل بودن ، يك مساله بسيار
مهم است زيرا هم موجب صرفه جويي در وقت شده و هم باعث صرفه جويي در هزينه ها
مي گردد .
زبان C فقط داراي 32 كلمه كليدي است  كه 27 كلمه كليدي آن توسط
ريچي ( طراح زبان ) معرفي شده و 5 كلمه كليدي ديگر توسط موسسه استاندارد سازي
زبان به آن اضافه شده است . اين تعداد در مقايسه با 159 كلمه كليدي كه در زبان
بيسيك وجود دارد قابل توجه است.

| auto | double | int | struct |
| break | else | long | switch |
| case | enum* | register | typedef |
| char | extern | return | union |
| const* | float | short | unsigned |
| continue | for | signed* | void* |
| default | goto | sizeof | volatile* |
| do | if | static | while |

اضافه شدن توسط موسسه استاندارد سازي زبان

كلمات كليدي زبان C

بعضي از كامپايلرها علاوه بر 32 كلمه كليدي  كلمات كليدي ديگري به
زبان اضافه نموده اند.

| asm | ess |- ds |- es |
|- ss | cdecl | far | huge |
| intrrupt | near | pascal | |

كلمات كليدي زبان C كه بعضي از كامپايلرها اضافه كرده اند

كليه كلمات كليدي در زبان C به حروف كوچك نوشته مي شوند . چون در اين زبان
بين حروف كوچك و بزرگ تفاوت است ، به عنوان مثال كلمه else يك كلمه كليدي است.

+ نوشته شده در  سه شنبه بیست و یکم آبان 1387ساعت 19:23  توسط گروه مولفان  | 

مفاهیم زبان c

در این یادداشت به مقدمات اولیه برنامه نویسی به زبان  C می پردازیم و اصول اولیه آن را بررسی می نماییم.

شناسه ها در C

شناسه (identifier) نامی است که به یک قسمت از برنامه مانند متغیر، تابع، ثابت و یا ... داده می شود. در زبان C برای انتخاب شناسه ها فقط می توان از علائم زیر استفاده کرد: - حروف انگلیسی کوچک و بزرگ (A…Z a…z)
- ارقام (0…9)
- علامت خط پایین یا _

البته یک شناسه تمی تواند با یک رقم شروع شود. مثلا شناسه های sum ، average ، name2 و یا student_average مجاز هستند، اما شناسه های 2name و یا student average مجاز نیستند. البته در برنامه نویسی امروزی پیشنهاد می شود بجای شناسه هایی همانند student_average از studentAverage استفاده گردد. یعنی بجای اینکه در شناسه ها از _ برای جداکننده استفاده کنیم، اولین حرف هر قسمت را بصورت بزرگ بنویسیم.

 

نکته مهم دیگری که باید به آن اشاره کرد آنستکه زبان C برخلاف بسیاری از زبانهای دیگر به کوچک و بزرگی حروف حساس است (case sensitive). در نتیجه شناسه های زیر با یکدیگر متفاوتند :

Sum ≠ sum ≠ SUM

این مسئله معمولا درهنگام برنامه نویسی باعث ایجاد بعضی خطاها می شود.
آخرین نکته اینستکه در هنگام انتخاب شناسه نمی توانید از کلمات کلیدی که برای منظورهای خاص در زبان C رزرو شده اند استفاده کنید. زبان C دارای 32 کلمه کلیدی است که عبارتند از :

 

auto

break

case

char

Const

continue

default

do

double

Else

enum

extern

float

for

Goto

if

int

long

register

Return

short

signed

sizeof

static

Struct

switch

typedef

union

unsigned

Void

volatile

while

 

 

 

البته در نسخه های جدید C کلمات کلیدی دیگری نیز به لیست فوق اضافه شده است. دقت کنید که کلیه این کلمات با حروف کوچک نوشته شده اند.

انواع داده ها در C

همانطور که قبلا نیز گفتیم هر متغیر پیش از آنکه استفاده گردد ابتدا باید اعلان گردد. اعلان یک متغیر تعیین نوع آن را نیز دربر می گیرد. سوال اصلی آنستکه چه نوع داده هایی در زبان C و جود دارد. انواع داده های متداول عبارتند از :

 

نوع داده

توضیح

اندازه (بیت)

محدوده

char

کاراکتر

8

-128 to +127

int

عدد صحیح

16

-32768 to + 32767

float

عدد اعشاری

32

3.4e-38 to 3.4e+38

double

عدد اعشاری با دقت مضاعف

64

1.7e-308 to 1.7e+308

البته چند نکته مهم درمورد جدول فوق قابل ذکر است :

- اندازه int در محیطهای 16 بیتی مانند DOS برابر 16 بیت است. اما در محیطهای 32 بیتی همانند Windows اندازه آن 32 بیت می باشد که در اینصورت محدوده ای برابر -2,147,483,647 تا +2,147,483,647 را پوشش می دهد.

- در بعضی از کامپایلرهای C، نوع داده bool نیز وجود دارد که می تواند یکی از مقادیر true(درست) یا false (غلط) را نشان دهد . اما در نسخه های اولیه C از همان نوع داده صحیح یا int برای اینکار استفاده می شد. بدین صورت که 0 نشاندهنده false و هر عدد غیر صفر (معمولا 1) نشاندهنده true است.

- از آنجا که برای ذخیره سازی کاراکترها کد اسکی آنها ذخیره می گردد، از یک متغیر کاراکتری یا char می توان بعنوان یک عدد صحیح کوچک نیز استفاده کرد و اعمال ریاضی برروی آنها نیز مجاز است.

علاوه براین چندین اصلاح کننده نیز وجود دارد که به ما اجازه می دهد نوع داده مورد نظر را با دقت بیشتری برای نیازهای مختلف استفاده نماییم.

 این اصلاح کننده ها عبارتند از : short, long, signed, unsigned

تمام اصلاح کننده های فوق می توانند به نوع داده int اعمال شوند و اثر آنها بستگی به محیط دارد. مثلا در یک محیط 16 بیتی، short int بازهم برابر 16 بیت است ولی long int برابر 32 بیت خواهد بود. علاوه براین unsigned int باعث می شود که یک عدد 16 بیتی بدون علامت داشته باشیم که بازه بین 0 تا 65535 را پوشش می دهد. signed int نیز همانند int معمولی بوده و تفاوتی ندارد. البته ترکیب این اصلاح کننده ها نیز ممکن است. مثلا unsigned long int یک عدد 32 بیتی بدون علامت است که بازه 0 تا 4,294,967,295 را پوشش می دهد.

اما برروی نوع داده char فقط اصلاح کننده های signed و unsigned را می توان اعمال کرد. معمولا از اصلاح کننده unsigned وقتی استفاده می شود که قصد داشته باشیم از char بعنوان یک عدد صحیح مثبت بین 0 تا 255 استفاده کنیم.

برروی نوع داده double تنها اصلاح کننده long قابل اعمال است و دراینصورت عدد اعشاری با 80 بیت را خواهیم داشت که قادر است هر عددی در بازه 3.4e-4932 تا 1.1e+4932 را در خود نگاه دارد.

 تعریف متغیرها

برای تعریف متغیرها به شکل زیر عمل می کنیم:

;

که type یکی از نوع داده های گفته شده و variable-list لیستی از متغیرها است که با کاما از یکدیگر جدا شده اند. بعنوان مثال :

int sum;
float average;
long int a, b, c ;
unsigned long int i, j, k ;

علاوه براین می توان در هنگام تعریف متغیر به آن مقدار اولیه نیز داد. مثال :

int d = 0 ;

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

 ثوابت

ثابتها مقادیر ثابتی هستند كه مقدار آنها در حین اجرای برنامه تغییر نمی یابد. ثابتها می توانند از هریك از نوع داده های اصلی باشند. برای نمایش هر ثابت بسته به نوع آن عمل می كنیم كه شرح هریك در زیر آمده است :
4 ثوابت عددی صحیح : برای نمایش این دسته از ثوابت، از دنباله ای از ارقام بعلاوه علامت + یا - استفاده می كنیم. بعنوان مثال 45- و یا 3489 ثوابت صحیح هستند. در حالت عادی C هر عدد را در كوچكترین نوع داده ای كه می تواند قرار می دهد. مثلا عدد 85 در یك int قرار می گیرد، اما عدد 145398 در یك long int قرار خواهد گرفت. اما اگر قصد دارید یك عدد كوچك بعنوان long محسوب گردد، می توانید از پسوند L در انتهای آن استفاده می كنیم. مثلا 245L یك عدد long محسوب می شود.

 

long int a = 20L;

ضمن اینكه پسوند U در انتهای عدد نیز نشانه بدون علامت بودن آن است.
نكته دیگر آنكه C به شما اجازه می دهد درصورت لزوم ثوابت صحیح خود را در مبنای 8 یا 16 نیز كه از مبناهای متداول در برنامه نویسی هستند، بنویسید. برای نوشتن عدد در مبنای 8 باید آن را با 0 آغاز كنید، مثلا 0342 یك عدد در منای 8 محسوب می گردد. اما برای نوشتن یك عدد در مبنای 16 باید آن را با 0x آغاز نمایید، مانند 0x27A4.
8 ثوابت عددی اعشاری : برای نمایش اعداد اعشاری، باید از نقطه اعشار استفاده كنیم، مانند 237.45 ، اما نكته جالب آنستكه می توانید از نماد علمی نیز برای نمایش اعداد اعشاری استفاده كنید. برای اینكار كافی است از حرف e برای نمایش قسمت توان استفاده نمایید. بعنوان مثال :

-23.47 × 10 5 = -23.47e5
42.389 × 10 -3 = 42.389e-3

دقت كنید كه قسمت توان، حتما یك عدد صحیح است. نكته جالب اینجاست كه برخلاف مورد قبل، كامپایلر بطور پیش فرض داده های اعشاری را از نوع double فرض می كند.چنانچه دوست دارید ثابت شما ازنوع float درنظر گرفته شود، در انتهای آن F قرار دهید. ضمنا پسوند L نیز داده اعشاری را از نوع long double درنظر می گیرد. 10 ثوابت كاراكتری : برای نشان دادن ثوابت كاراكتری، آنها را در داخل ' قرار می دهیم. بعنوان مثال 'A' یك ثابت كاراكتری است.

char ch = 'S' ;

دقت كنید كه همانطور كه قبلا گفته شد، كد اسكی كاراكترها در متغیر ذخیره می گردد، بنابراین می توان از آن بعنوان یك عدد صحیح نیز استفاده كرد. نكته مهم دیگر آنستكه به تفاوت عدد 5 و كاراكتر '5' دقت داشته باشید. در حقیقت '5' برابر است با عدد 53 كه همان كد اسكی آن است.
از آنجا كه بعضی كاراكترها، مانند enter قابل نمایش نیستند، بهمین دلیل آنها را با استفاده از \ نمایش می دهیم. علاوه براین بعضی كاراكترها مانند خود " نیز چون دارای معنای خاص هستند، باید با استفاده از \ نمایش داده شوند. موارد مهم عبارتند از :

\n خط جدید
\t tab كاراكتر
\a بوق كامپیوتر \" "
\' ' \\ \


14 ثوابت رشته ای : C علاوه بر ثوابت فوق، از یك ثابت دیگر بنام رشته نیز حمایت می كند. رشته، دنباله ای از كاراكترها است كه در داخل " قرار می گیرند. بعنوان مثال "this is a test" یك رشته است. دقت كنید كه 'a' یك كاراكتر است، اما "a" یك رشته است كه فقط شامل یك كاراكتر می باشد.

عملگرها

عملگر، نمادی است كه به كامپایلر می گوید تا عملیات محاسباتی یا منطقی خاصی را برروی یك یا چند عملوند، انجام دهد. به عملگرهایی كه فقط یك عملوند دارند، عملگر یكانی می گوییم و همواره عملگر در سمت چپ عملوند قرار می گیرد(مانند عدد -125). اما عملگرهایی كه برروی دو عملوند اثر می كنند را عملگر دودویی نامیده و عملگر را بین دو عملوند قرار می دهیم (مانند 23+86). هر ترکیب درستی از عملگرها و عملوندها را یک عبارت می نامیم.


C از نقطه نظر عملگرها یك زبان بسیار قوی است. این عملگرها به چند دسته اصلی تقسیم می گردند كه آنها را به ترتیب بررسی می كنیم..

عملگرهای محاسباتی

این عملگرها، همان اعمال متداول ریاضی هستند كه در زبان C مورد استفاده قرار می گیرند. این اعمال عبارتند از :

عمل

نوع

عملگر

منفی كردن عملوند سمت راست

یكانی

-

جمع دو عملوند

دودویی

+

تفریق دو عملوند

دودویی

-

ضرب دو عملوند

دودویی

*

تقسیم دو عملوند

دودویی

/

محاسبه باقیمانده تقسیم دو عملوند

دودویی

%

 

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

int a,b ;
float c,d ;
a = 10 ; b = 4 ;
c = 8.2; d = 4.0;

اكنون به نتایج عملیات زیر دقت كنید :

a / b = < 2
c / d = < 2.05
a / d = < 2.5
a / 4 = < 2

چنانچه به آخرین مورد توجه كنید، متوجه می شوید كه از آنجا كه a یك متغیر صحیح است و 4 نیز یك ثابت صحیح در نظر گرفته شده، درنتیجه تقسیم بصورت صحیح بر صحیح انجام گرفته است. چنانچه بخواهیم تقسیم بصورت اعشاری صورت پذیرد، به دو شكل می توانیم عمل كنیم. اول اینكه آن را بصورت a / 4.0 بنویسیم و دوم اینكه از عملگر قالب ریزی استفاده كنیم.
عملگر قالب ریزی می تواند یك نوع را به نوع دیگری تبدیل نماید. شكل كلی آن به شكل زیر است :

(< type >) < expression >


كه type نوع مورد نظر است كه قصد تبدیل عبارت expression به آن نوع را داریم. بعنوان مثال در مورد بالا می توان به شكل زیر عمل كرد :

(float) a / 4

در این حالت ابتدا از كامپایلر خواسته ایم كه ابتدا عدد a را به اعشاری تبدیل كند (البته بصورت موقت) و سپس آن را بر 4 تقسیم نماید، كه مسلما حاصل اعشاری خواهد بود.
بطوركلی هرگاه ثابتها و متغیرهایی از انواع مختلف در یك عبارت محاسباتی داشته باشیم، كامپایلر C همه آنها را به یك نوع یكسان كه همان بزرگترین عملوند موجود است تبدیل خواهد كرد. بعنوان مثال به مورد زیر دقت كنید :

  

نكته بسار مهم دیگری كه باید به آن توجه كرد، اولویت عملگرها است. یعنی در عبارتی که شامل چندین عملگر است، کدامیک در ابتدا اعمال خواهد گردید. اولویت عملگرهای محاسباتی از بالا به پایین بشرح زیر است:

1        عملگر یکانی –

2        عملگرهای * و / و %

3        عملگرهای + و –

 

چنانچه اولویت دو عملگر یکسان باشد، این عملگرها از چپ به راست محاسبه خواهند شد. چنانچه بخواهیم یک عمل با اولویت پایین زودتر انجام شود، باید از پرانتز استفاده کنیم. بنابراین اولویت عملگر پرانتز از همه موارد فوق بیشتراست. در مورد پرانتزهای متداخل، ابتدا پرانتز داخلی محاسبه می شود؛ اما در مورد پرانتزهای هم سطح، ابتدا پرانتز سمت چپتر محاسبه می گردد. به چند مثال زیر دقت کنید:

 

عبارت زبان c

ترتیب اجرای عملگرها

b + c * d

ابتدا عمل * و سپس عمل +

(b + c) * d

ابتدا عمل + و سپس عمل *

b + c / d * e

ابتدا عمل / سپس عمل * و در انتها عمل +

b + c / (d * e)

ابتدا عمل * سپس عمل / و در انتها عمل +

 

مثال زیر، یک مثال کامل در این زمینه می باشد :

عملگرهای انتساب

در زبان C برای انتساب چندین عملگر وجود دارد. ساده ترین عملگر انتساب، همان عملگر = است که در بسیاری از زبانها استفاده می شود. بعنوان مثال :

a = 5;
b = c + 2 * d;

این عملگر باعث می شود که عبارت سمت راست در عبارت سمت چپ قرار گیرد. توجه کنید که مقدار سمت چپ باید عبارتی باشد که بتوان به آن یک مقدار را نسبت داد(مانند یک متغیر) که به آن Lvalue گفته می شود، بنابراین یک ثابت نمی تواند در سمت چپ قرار گیرد. نکته دیگر اینکه اولویت عملگر = از عملگرهای ریاضی کمتر است و درنتیجه ابتدا آن عملیات انجام شده و در پایان حاصل در عبارت سمت چپ ریخته می شود. لازم به ذکر است که در هنگام انتساب، درصورت لزوم نوع عبارت سمت راست به نوع عبارت سمت چپ تبدیل می شود. مثال:

int a;
a = 2.5 * 5.0;

که دراینصورت عدد 12 در a ذخیره خواهد شد.
شرکت پذیری این عملگر از راست به چپ می باشد، بدین معنا که چنانچه چندین عملگر نسبت دهی داشته باشیم، این عملگرها از راست به چپ محاسبه می شوند. مثلا پس از اجرای دستور زیر :

a = b = c = 10;

مقدار هر 3 متغیر برابر 10 خواهد شد.
نکته جالب درمورد زبان C آنستکه دارای یک سری عملگرهای انتساب خلاصه شده است که باعث می شوند در بعضی موارد بتوانیم عبارات کوتاهتری را بنویسیم. این عملگرها عبارتند از :

عملگر

مثال

عبارت انتساب معادل

++

a ++;

a = a + 1;

--

a --;

a = a – 1;

+=

a += 5;

a = a + 5;

-=

a -= 8;

a= a – 8;

*=

a *= 10;

a= a * 10;

/=

a /= 2;

a = a / 2;

%=

a %= 10;

a = a % 10;

عملگر اول و دوم، عملگرهای یکانی هستند که بترتیب عملگر افزایش و عملگر کاهش نامیده می شوند. نکته جالب آنستکه این دو عملگر به دوصورت مورد استفاده قرار می گیرند. در حالتی که از دستور a ++; استفاده شود به آن پس افزایش می گویند و بدین معناست که ابتدا از مقدار فعلی a در عبارت موردنظر استفاده کن و سپس آن را افزایش بده. اما دستور ++ a که به آن پیش افزایش گفته می شود، ابتدا a را افزایش داده و سپس از آن در عبارت استفاده می کند. به برنامه زیر دقت کنید:

#include < stdio.h >
void main() {
int a ,b ;
a = 5 ;
b = a ++;
printf(“a=%d and b=%d \n”,a,b);
a = 5 ;
b = ++ a;
printf(“a=%d and b=%d \n”,a,b);
}

 

a=6 b=5
a=6 b=6

و اما پنج عملگر بعدی هنگامی می توانند استفاده شوند که عبارتی بصورت زیر داشته باشیم:

عبارت عملگر متغیر = متغیر

که عملگر یکی از عملگرهای محاسباتی ( + ، - ، * یا / ) باشد، دراینصورت می توانیم آن را بصورت زیر بنویسیم:

عبارت =عملگر متغیر

عملگرهای مقایسه ای (رابطه ای)

این عملگرها دو عبارت را بایکدیگر مقایسه کرده و نتیجه را باز می گردانند. نتیجه می تواند درست (true) یا غلط (false) باشد. همانطور که قبلا نیز گفته شد در کامپایلرهای جدید C++ نوع داده bool اضافه شده است و بنابراین نتیجه این عملگرها یک مقدار bool است. اما در کامپایلرهای قدیمیتر، نتیجه این عملگرها یک عدد صحیح است که درصورت درست بودن 1 و درصورت غلط بودن 0 باز می گردانند. این عملگرها عبارتند از:

 

عملگر

مفهوم عملگر

مثال

<

بزرگتر (<)

a > b

>

کوچکتر (>)

a < b

=<

بزرگتر یا مساوی (≤)

a >= b

=>

کوچکتر یا مساوی (≥)

a <= b

==

مساوی (=)

a == b

=!

نامساوی (≠)

a != b

نکته مهمی که باید به آن دقت کرد عملگر مساوی (==) است، چرا که یک اشتباه بسیار متداول برنامه نویسان C استفاده اشتباه از عملگر انتساب (=) بجای عملگر تساوی (==) است که باعث ایجاد خطا در برنامه می شود.
اولویت این عملگرها از بالا به پایین بشرح زیر است:
3 عملگرهای <، > ، =< و = >
4 عملگرهای == و =!
لازم بذکر است که در هنگام مساوی بودن اولویت چند عملگر، این عملگرها از چپ به راست محاسبه می گردند.
عملگرهای منطقی
این عملگرها به شما اجازه می دهند که شرطهای ساده ای را که با استفاده از عملگرهای مقایسه ای ایجاد شده اند را با یکدیگر ترکیب نموده و شرطهای پیچیده تری را بسازید. این عملگرها عبارتند از :

عملگر

مفهوم عملگر

نحوه کار

مثال

&&

AND منطقی

اگر هر دو عملوند درست باشند, درست و در غیر اینصورت نادرست باز می گرداند.

a>0 && sw==1

||

OR منطقی

اگر هر دو عملوند نادرست باشند, نادرست و در غیر اینصورت درست باز می گرداند.

a<=100 || b!=0

!

NOT منطقی

اگر عملوند درست باشد، نادرست و اگر نادرست باشد، درست برمی گرداند.

! (a==1 || b<10)

همانطور که قبلا نیز گفته شد مقدار بازگشتی این عملگرها، درست (1) یا نادرست (0) می باشد. اولویت این عملگرها بترتیب عبارتست از :

1- عملگر !

2- عملگر &&

 3- عملگر ||

عملگر شرطی

گاهی لازم است که ابتدا یک شرط بررسی شده و سپس برمبنای نتیجه (درست یا نادرست بودن آن) یکی از دو عبارت ممکن بازگردانده شود. گرچه معمولا برای اینکار از دستور if (که در فصل بعدی بحث شده است) استفاده می شود، اما یک عملگر 3تایی (با 3 عملوند) نیز برای آن وجود دارد. شکل کلی این عملگر بصورت زیر است:

عبارت2 : عبارت1 ? شرط

نحوه کار بدینصورت است که درصورت درست بودن شرط عبارت1 و در غیراینصورت عبارت 2 بازگردانده می شود. مثال :

a = (k<10) ? 100 : 50;

که این عبارت معادل دستور زیر است:

if(k<10) a=100;
else a=50;

البته این عبارت به شکلهای پیچیده نیز می تواند مورد استفاده قرار گیرد. مثلا :


c += (a>0 &&a<10) ? ++a : a/b;
که معادل است با :
if (a>0 &&a<10) {
a= a + 1;
c = c + a;
}
else c = c + a/b;


که البته توصیه می شود از این عبارات پیچیده استفاده نشود.

چند نکته درمورد عملگرها


در یک عبارت می توان بین عملوندها و عملگرها از فضاهای خالی به میزان دلخواه استفاده کرد. گرچه استفاده از فضای خالی اجباری نیست اما معمولا باعث بالا رفتن خوانایی عبارت می گردد. علاوه براین در عبارات پیچیده می توان از پرانتز برای نشان دادن ترتیب اجرای عملگرها، حتی درمواردی که مورد نیاز نباشد استفاده کرد. بعنوان مثال به مورد زیر توجه کنید:

شکل نامناسب

result=a-b*c/d+f*g;

شکل بهتر

result = a – b * c / d + f * g

شکل کاملا مناسب

result = a – ( b * c / d) + (f * g)


مورد دیگری که باید به آن اشاره کرد، نحوه محاسبه عبارات پیچیده ای است که عملگرهای مختلفی در آنها استفاده شده باشد. درچنین حالتی باید از اولویت گروههای مختلف عملگرها نسبت به یکدیگر آگاه باشیم. جدول زیر اولویت عملگرهای گفته شده تاکنون را بترتیب از بالا به پایین آ ورده است:

 

اولویت

عملگر

شرکت پذیری

1

()

از چپ به راست

2

++   --   !   +   -

از راست به چپ

3

%   /   *

از چپ به راست

4

-   +

از چپ به راست

5

>>   <<

از چپ به راست

6

>=   >   <=   <

از چپ به راست

7

=!   ==

از چپ به راست

8

&&

از چپ به راست

9

||

از چپ به راست

10

?:

از راست به چپ

11

=%   =/   =*   =-   =+   =

از راست به چپ

12

,

از چپ به راست

خواندن و نمایش اطلاعات

همانطور كه قبلا نیز گفته شد، یكی از اهداف زبان C قابل حمل بودن آن است. بهمین منظور سعی شده است كه از دستوراتی كه ممكن است وابسته به ماشین خاصی باشد، اجتناب گردد. بهمین دلیلی زبان C برخلاف سایر زبانها دارای هیچ دستوری برای خواندن از ورودی و یا نوشتن در خروجی نیست.

اما در عوض دارای تعدادی تابع (زیربرنامه) استاندارد می باشد كه تقریبا تمامی كامپایلرها از آنها حمایت می كنند. این كار به كامپایلر این امكان را می دهد كه بر حسب نوع سخت افزار موردنظر، توابع ورودی و خروجی را طراحی نماید. این توابع در یك فایل سرآمد بنام stdio.h تعریف شده اند و بنابراین قبل ازاینكه بتوانید از این توابع استفاده نمایید، باید این فایل را نیز با استفاده از #include در برنامه خود بگنجانید.

تابع نمایش در خروجی

برای نمایش اطلاعات در خروجی از تابع printf استفاده می شود. این تابع رشته موردنظر شما را به خروجی استاندارد (كه در حالت عادی همان صفحه نمایش یا مانیتور است) می فرستد. شكل كلی این تابع بصورت زیر است:

printf(< لیست متغیرها > , < رشته کنترلی >) ;

رشته كنترلی همان متنی است كه قصد چاپ آن را داریم، با ذكر این نكته كه در قسمتهایی كه باید مقدار یك متغیر چاپ شود، از یك مشخصه تبدیل استفاده می شود. هر مشخصه تبدیل از یك علامت % بعلاوه یك كاراكتر كه نوع متغیر مورد نظر را نشان می دهد تشكیل می گردد. مشخصه تبدیل های متداول عبارتند از :

مفهوم

مشخصه تبدیل

كاراكتر

%c

عدد صحیح در مبنای 10

%d

عدد اعشاری بدون نماد علمی

%f

عدد اعشاری با نماد علمی

%e

عدد اعشاری با حالت كوتاهتر بین e و f

%g

رشته

%s

عدد صحیح بزرگ

%ld

عدد اعشاری بزرگ

%lf  %le  %lg

عدد صحیح در مبنای 8

%o

عدد صحیحی در مبنای 16

%x

عدد صحیح بدون علامت

%u

البته بعضی موارد دیگر نیز وجود دارد كه از بحث فعلی ما خارج است. توجه كنید كه از آنجا كه رشته كنترلی یك ثابت رشته ای است، باید در داخل " قرار گیرد. لیست متغیرها نیز همان متغیرهایی هستند كه قصد چاپ آنها را داریم. این متغیرها باید بترتیب قرار گرفته و با كاما (,) از یكدیگر جدا شوند. برای نمونه به مثال زیر توجه كنید:

#include
void main() {
int age = 20;
floate average = 18.23;
printf("You are %d years old and your average is %f \n",age,average);
}
You are 20 years old and your average is 18.230000

دقت كنید كه علامت \n انتهای رشته كنترلی باعث می شود كه خروجی بعدی برنامه (در صورت وجود) در خط بعد چاپ شود. البته ممكن است نحوه چاپ عدد اعشاری به شكل فوق چندان برای شما دلخواه نباشد و بخواهید تعداد ارقام اعشاری قابل نمایش را محدود كنید. برای اینكار باید از مشخصه طول میدان استفاده كنید. مشخصه طول میدان برای اعداد به شكل زیر استفاده می شود:

برای اعداد صحیح از %nd استفاده می كنیم كه n تعداد ارقام را نشان می دهد (مثلا %3d). در اینصورت برای هر متغیر n رقم درنظر گرفته می شود. اگر اندازه عدد از n كوچكتر باشد، به سمت چپ آن فضای خالی اضافه می شود و اگر اندازه عدد بیش از n رقم باشد، طول میدان نادیده گرفته شده و عدد بطور كامل چاپ می شود.

برای اعداد اعشاری از %n.mf استفاده می كنیم كه n اندازه كل عدد (شامل علامت ممیز) و m تعداد ارقام اعشار است (مثلا %5.2f). در صورتیكه تعداد ارقام اعشاری عدد موردنظر از m بیشتر باشد، عدد به m عدد اعشار گرد می شود و در صورتیكه از m كمتر باشد، در سمت راست آن 0 قرار داده می شود.

البته موارد دیگری نیز در مورد نحوه چاپ وجود دارد كه برای اطلاع از آنها می توانید به قسمت Help كامپایلر خود مراجعه نمایید.

آخرین نكته درمورد تابع printf اینكه این تابع مقدار بازگشتی نیز دارد كه درصورت موفقیت عمل چاپ، تعداد كاراكترهای چاپ شده و درصورت عدم موفقیت مقدار -1 را باز می گرداند. البته معمولا از این مقدار بازگشتی صرفنظر می گردد.

تابع خواندن از ورودی

برای خواندن اطلاعات از ورودی از تابع scanf استفاده می شود. این تابع اطلاعات را ازورودی استاندارد (معمولا صفحه كلید) خوانده و در متغیرهای تعیین شده قرار می دهد. شكل كلی این تابع بصورت زیر است:

scanf(< لیست متغیرها > , < رشته کنترلی >) ;

همانطور كه می بینید نحوه احضار تابع scanf نیز مشابه printf است. تنها تفاوت در آن است كه در scanf باید لیست آدرسهای متغیرها ارسال شود. مبحث مربوط به آدرسها در فصول بعدی بررسی خواهد شد ولی در حال حاضر بخاطر بسپارید كه برای بدست آوردن آدرس یك متغیر از علامت & استفاده می كنیم. بعنوان مثال &age بمعنای آدرس متغیر age است. بطور كلی در C قدیمی هرگاه كه یك تابع دارای پارامترهای خروجی بود (یعنی پارامترهایی كه یك مقدار را باز می گرداندند) از آدرس متغیرها استفاده می شد كه امروزه این مسئله وجود ندارد.

رشته كنترلی حاوی تعداد و نوع متغیرهایی است كه باید دریافت شوند و از همان مشخصه های تبدیل مربوط به printf استفاده می كند. به مثال زیر توجه كنید:

#include
void main() {
int age;
float average ;
printf("Please enter your age and average : ");
scanf("%d %f",&age,&average);
printf("You are %d years old and your average is %5.2f \n",age,average);
}

 

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

لازم به ذكر است كه هنگامی كه قصد وارد كردن دو عدد فوق را دارید، هم می توانید این دو عدد را با یك فاصله (فضای خالی یا tab) نوشته و سپس كلید enter را فشار دهید و یا پس از نوشتن هر عدد كلید enter را فشار دهید.

توجه كنید كه معمولا رشته كنترلی فقط حاوی مشخصه های تبدیل است و هیچ متنی در آن نوشته نشده است. ازنظر منطقی نیز این كار درست است ولی چنانچه متنی در آن نوشته شود بدین معنا است كه كاربر باید علاوه بر داده های مورد نظر، عین آن متن را نیز وارد كند. بعنوان مثال عبارت زیر:

scanf("level=%d", &a) ;

بدین معناست كه كاربر باید ابتدا كلمه level= را عینا تایپ كرده و سپس عدد موردنظر را وارد نماید. معمولا از چنین حالاتی استفاده نمی گردد.

نكته آخر اینكه در scanf نیز می توان از مواردی همچون طول میدان برای كنترل نحوه ورود اطلاعات استفاده كرد كه از حوصله بحث ما خارج است. برای اطلاعات بیشتر به Help كامپایلر خود مراجعه نمایید.

نکته مهم: توابع printf و scanf از رنگ استاندارد یعنی سفید برروی زمینه مشکی استفاده می کنند، اما می توانید برای تغییر رنگ از توابع textcolor و textbackground نیز استفاده کنید. البته دراینصورت برای دریافت و نمایش اطلاعات نیز باید از توابع cprintf و cscanf استفاده نمایید. برای توضیحات بیشتر به Help کامپایلر خود مراجعه کنید.

ورودی و خروجی اطلاعات در CPP

زبان C++ یک زبان شی گرا است، بهمین دلیل در این زبان برای ورودی و خروجی از اشیاء بجای توابع استفاده می گردد. از آنجا که امروزه معمولا برنامه نویسان C از کامپایلرهای C++ استفاده می کنند، می توانند از اشیای ورودی و خروجی آن نیز استفاده کنند. اینکار در بین بسیاری از برنامه نویسان C متداول است، بهمین دلیل ما در اینجا نحوه کار با اشیای خواندن و نوشتن در C++ را بطور مقدماتی توضیح می دهیم؛ گرچه توضیح کامل این موارد نیاز به آشنایی با شی گرایی و زبان C++ دارد. قبل از هرچیز لازم به ذکر است که کلیه اشیای مربوط به ورودی و خروجی در فایل سرآمدی بنام iostream.h تعیریف شده اند، بنابراین ابتدا باید این فایل به برنامه توسط دیتور #include الحاق گردد.

زبان C++ برای نمایش اطلاعات از یک شیئ بنام cout استفاده می نماید. برای ارسال اطلاعات مورد نظر برای چاپ به cout باید از عملگر درج در جریان یا >> استفاده نماییم. بعنوان مثال :

cout << “Please enter your name: ” ;

و یا مثال دیگر :

int a = 10;
float b = 2.86;
cout << a;
cout << b;

نکته جالبی که در این مثالها دیده می شود، آنستکه برخلاف تابع printf هیچ نیازی به مشخص کردن نوع متغیری که قصد چاپ آن را داریم نیست و خود شئ cout نوع آن را تشخیص می دهد. علاوه براین می توان چندین عملگر درج در جریان را با یکدیگر الحاق کرد و چندین متغیر را با یک دستور چاپ کرد. بعنوان مثال به برنامه زیر دقت کنید:

#include < iostream.h >
void main() {
int age = 20;
floate average = 18.23;
cout << “You are ” << age << “ years old and your average is ” << average ;
}

 

You are 20 years old and your average is 18.230000

برای دریافت اطلاعات از کاربر، از شئ دیگری بنام cin استفاده می شود. برای ارسال متغیر مورد نظر به cin باید از عملگر استخراج از جریان یا << استفاده نماییم. بعنوان مثال:

int a;
cin >> a;

بازهم همانطور که می بینید نیازی به تعیین نوع متغیر موردنظر نیست و خود شئ cin نوع متغیر را بطور اتوماتیک تشخیص داده و داده ای از همان نوع را از کاربر دریافت و در متغیر مورد نظر قرار می دهد. عملگرهای استخراج از جریان را نیز می توان با یکدیگر الحاق کرد. اکنون به یک برنامه کاملتر توجه کنید:

#include < iostream.h >
void main() {
int age;
float average ;
cout << "Please enter your age and average : " ;
cin >> age >> average ;
cout << "You are " << age << "years old and your average is " << average;
}

 

Please enter your age and average : 19 16.72
You are 19 years old and your average is 16.72

برای رفتن به خط بعد در شئ cout می توان از دستکاری کننده endl استفاده کرد. مثلا در دستور زیر پس از چاپ پیغام، مکان نما به خط بعد منتقل می شود:

cout << “List of students : “ << endl;

البته دستکاری کننده های متعدد دیگری نیز ازجمله موارد مربوط به تعیین طول میدان و نحوه چاپ مقادیر وجود دارد که توضیح آنها نیاز به یک مبحث مستقل دارد.

توابع کتابخانه ای

همانطور که قبلا نیز گفته شد، زبان C از زیر برنامه ها نیز حمایت می کند. هر زیر برنامه در C یک تابع نامیده می شود که آن را بطور مفصل در فصول بعدی بررسی خواهیم کرد. تا کنون با توابعی همچون main و یا printf و scanf آشنا شده ایم.

معمولا عرضه کنندگان کامپایلرها و یا سایر فروشندگان نرم افزار، برخی از توابع عمومی را که ممکن است مورد نیاز جمع کثیری از برنامه نویسان مختلف باشد را در قالب کتابخانه ای از توابع در اختیار برنامه نویسان می گذارند (این کتابخانه ها ممکن است مجانی باشند و یا نیاز به پرداخت مبلغی داشته باشند). بعضی از این توابع کتابخانه ای مانند printf و scanf بصورت استاندارد درآمده و توسط عرضه کنندگان مختلف ارائه می شوند.

در کامپایلر عرضه شده توسط شرکت بورلند (Borland C++ 3.1) نیز کتابخانه های متعددی از توابع برای شما عرضه شده اند که بتدریج با آنها و کاربردشان آشنا خواهید شد. نکته مهم آنستکه برای استفاده از این توابع ابتدا باید فایل سرآمد مربوط به آنها را نیز در ابتدای برنامه خود اضافه نمایید ( با استفاده از #include). هر فایل سرآمد شامل تعاریف اولیه گروهی از توابع مرتبط با هم و داده های مربوط به آنها بوده و در استاندارد قدیمی تر دارای پسوند .h می باشد(در استاندارد جدید پسوند این فایلها حذف شده است). برخی از این فایلهای سرآمد عبارتند از:

stdio.h : توابع ورودی و خروجی استاندارد
math.h : توابع ریاضی
graphics.h : توابع مربوط به عملیات گرافیکی
string.h : توابع مربوط به کار با رشته ها

البته تعداد این فایلها و توابع مربوطه بسیار زیاد است و در آینده با هریک از آنها بنا به کاربرد، آشنا خواهید شد.

منبع: http://www.prdev.com/search/aisearch.asp?id=188

 

+ نوشته شده در  سه شنبه بیست و یکم آبان 1387ساعت 19:15  توسط گروه مولفان  | 

اطلاعیه

سلام دوستان

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

اگه راجع به محتوای وبلاگ کسی نظر خاصی داره با کمال میل می پذیرم و امیدوارم اگه موضوعی مرتبط با کامپیوتر و برنامه نویسی در اختیار دارین واسه به اشتراک گذاشتن تو این لاگ و استفاده ی خوانندگان مطرحش کنین...بخصوص در مورد همکلاسی ها

+ نوشته شده در  جمعه دهم آبان 1387ساعت 14:22  توسط گروه مولفان  | 

جزوه جلسه2

انواع داده ها:    1-عددى(مثل سن،تاريخ تولد و...)حجم اين داده ها كم است.

                         2-متني(مثل نام،محتواي كتاب)

                         3-تصويري

                         4-صوتي

داده هاي عددي:

1-صحيح(بي علامت-علامت دار)

2-اعشاري((fixed point-floating point

داده هاي عددي علامت دار:

1-signmag    محدوده:                   ±0 تا  2ⁿ-¹ -1           

2-S complementُ1(مكمل1)            +0 تا  2ⁿ-¹ -1

3-S complementُ2(مكمل2)            0 تا  2ⁿ-¹ -1

ايراد هاي signmag:           دو صفر وجود دارد

                                       2-جمع و تفريق مشكل است

مزيت     :signmag           ضرب و تقسيم راحت است

 

مثبت یعنی 0

 

منفي یعنی  1

 

 

 

 

 

 

 

 

N-1عدد↑

 

 

 

 

 


1

0

0

1

0

0

0

0

1                 2             4           8                        16                32                     64        128

 

9+=

    

 

شكل بالا نمايش اعداد در سيستم signmag بود

اما براي نمايش اعداد منفي تمام بيت ها not  ميشود:

0

1

1

0

1

1

1

1

9- =

 

در سيستم مكمل 1براي جمع كردن 2 عدد فقط كافي است آنها را با هم جمع كنيم اگر دست آخر يك بيت كري ايجاد شد دوباره آن را با عدد حاصل جمع مي كنيم(اگر هم علامت باشند كري ايجاد نمي شود)

 

1 1 0 1 0 0 0 0

0  1 1 0 1 1 1 1

 1 0 0 0 0 0 0 0

 

مكمل 1:    ايرادها:1-دو صفر وجود دارد

                            2-ضرب و تقسيم سخت است

                   مزيت :  جمع و تفريق آسان است

 

 

 

در سيستم مكمل 2براي منفي كردن اعدادبه اين روش عمل ميكنيم كه ابتدا تمام بيت هاي عدد را notكرده سپس به عدد حاصل يك اضافه مي كنيم.در اين اعداد جهت انجام دادن جمع فقط كافيست ارقام عدد را بدون توجه به علامت با هم جمع كنيم.

 

1 1 1 0 1 1 1 1 →1  + 0 1 1 0 1 1 1 1   →    9=1 0 0 1 0 0 0 0

 

1 1 0 1 0 0 0 0

1  1 1 0 1 1 1 1

 0 1 0 0 0 0 0 0

 

 

 

 

 

 


داده هاي اعشاري:

Fixed point: غير قابل انعطاف (براي اعداد خيلي بزرگ كارايي ندارد)

Floating point: در كامپيوتر ها داده ها معمولا با اين روش ذخيره مي شوند.

 

براي ضرب و تقسيم بهتر است از signmagاستفاده شود.

براي جمع و تفريق بهتر است از S complementُ 2 استفاده شود.

 

 

 

داده هاي متني كاراكتري:     1-ASCI                           8BIT

                                              2-UNICODE                 16BIT

 

داده هاي متني STRING در هر زباني مفهوم متفاوتي دارند.

 D %                          به صورت دسيمال مي نويسد.

X%                        به صورت هگزا دسيمال←در مبناي 16

 

+ نوشته شده در  چهارشنبه هشتم آبان 1387ساعت 22:33  توسط گروه مولفان  | 

برنامه جلسه2

#include
#include

/* har chi beyn e in 2 alamat gharar girad comment mishavad
in barnameh be onvan e avvalin barnameh e kelas e mabani mohandesi dar tarikh ..............
esm e in barnameh test e 1 ast ....
tavassot e ......
copyright ?
opensource ?
sharayet e vijeh?

 

*/

void main()
{
int a; // barayetarif e motaghayyer be in shekl amal mikonim
// yani  type name;
// type ?
/*

 Data Types

 Type           Length                    Range

 unsigned char   8 bits                  0 to 255
 char            8 bits               -128 to 127
 enum           16 bits            -32,768 to 32,767
 unsigned int   16 bits                  0 to 65,535
 short int      16 bits  two bytes -32,768 to 32,767
 int            16 bits  one word  -32,768 to 32,767
 unsigned long  32 bits                  0 to 4,294,967,295
 long           32 bits     -2,147,483,648 to 2,147,483,647
 float          32 bits    3.4 * (10**-38) to 3.4 * (10**+38)
 double         64 bits   1.7 * (10**-308) to 1.7 * (10**+308)
 long double    80 bits  3.4 * (10**-4932) to 1.1 * (10**+4932)


 the system in which we store our signed numbers

 1`s complement
 2`s complement
 sign magnitude

 

 */

long double hoghoogh_mahaneh;

int b,c;
a=1;
b=2;
hoghoogh_mahaneh=123123213.3;

//exchange  using add and sub
a=a+b;
b=a-b;
a=a-b;
// a=? b=?
// using a helping variable
c=a;
a=b;
b=c;


hoghoogh_mahaneh=a+b;    //loss-less
a=hoghoogh_mahaneh;      //lossy
// here we have two aspects of the type cast process
// printf ( " formatting string" , variable1 , ariable2 , .....);
a=65;
printf("\n\n\n\n\n     \t      a= %d ",a);
printf("\nsalam");
// \n means newline \t means tab

getche();
}

 

 

 

 

 


/*

 getch and getche                

   getch gets a character from console but does not echo to the screen
   getche gets a character from console, and echoes to the screen

 Declaration:
   int getch(void);
   int getche(void);

 Remarks:
getch reads a single character directly from the keyboard, without echoing
to the screen.

getche reads a single character from the keyboard and echoes it to the
current text window, using direct video or BIOS.

 Return Value:
Both functions return the character read from the keyboard.

 Portability:
 É DOS Ñ UNIX Ñ ANSI C Ñ C++ Only »
   Yes


 See Also:
  cgets     cscanf    fgetc     getc      getchar   getpass   kbhit
  putch     ungetch

 Examples:
  getch example    getche example

 

 

 getch example


#include
#include

int main(void)
{
  int c;
  int extended = 0;
  c = getch();
  if (!c)
 extended = getch();
  if (extended)
 printf("The character is extended\n");
  else
 printf("The character isn't extended\n");

  return 0;
}

 

 


 getche example


#include
#include

int main(void)
{
   char ch;

   printf("Input a character:");
   ch = getche();
   printf("\nYou input a '%c'\n", ch);
   return 0;
}

 

 

 

#include
#include

int main(void)
{
  int c;
  int extended = 0;
  c = getch();
  if (!c)
 extended = getch();
  if (extended)
 printf("The character is extended\n");
  else
 printf("The character isn't extended\n");

  return 0;
}

 

printf functions    


   cprintf  sends formatted output to the text window on the screen
   fprintf  sends formatted output to a stream
   printf   sends formatted output to stdin
   sprintf  sends formatted output to a string
   vfprintf sends formatted output to a stream, using an argument list
   vprintf  sends formatted output to stdin, using an argument list
   vsprintf sends formatted output to a string, using an argument list

 Declaration:
   int cprintf (              const char *format [, argument, ...]);
   int fprintf (FILE *stream, const char *format [, argument, ...]);
   int printf  (  const char *format [, argument, ...]);
   int sprintf (char *buffer, const char *format [, argument, ...]);
   int vfprintf(FILE *stream, const char *format, va_list arglist);
   int vprintf (              const char *format, va_list arglist);
   int vsprintf(char *buffer, const char *format, va_list arglist);

 Remarks:
All these functions are declared in STDIO.H, except cprintf, which is
declared in CONIO.H.

The ...printf functions do the following:
   Accept a series of arguments
   Apply to each argument a format specifier
    contained in the format string *format
   Output the formatted data (to the screen,
    a stream, stdin, or a string)

These functions apply the first format specifier to the first argument, the
second specifier to the second argument, the third to the third, etc., to
the end of the format.

                  NOTE                  ³
 ³ There must be enough arguments for the ³
 ³ format.                                ³
 ³                                        ³
 ³ If there are not, the results will be  ³
 ³ unpredictable and likely disastrous.   ³
 ³                                        ³
 ³ Excess arguments (more than required   ³
 ³ by the format) are merely ignored.     ³

  Argument³ Functions ³ What Argument Is/Does

  arglist ³ v...printf³ Pointer to a list of
          ³           ³ arguments
  argument³ cprintf,  ³ One of a series of
          ³ fprintf,  ³ arguments to which
          ³ printf,   ³ the functions apply
          ³ sprintf   ³ a format specifier
          ³           ³ contained in *format
  buffer  ³ sprintf,  ³ Buffer where function
          ³ vsprintf  ³ writes the string
  format  ³ (all)     ³ Format string
  stream  ³ fprintf,  ³ Stream where the
          ³ vfprintf  ³ functions output the
          ³           ³ formatted data


 cprintf
 ßßßßßßß
With cprintf, the string is written either directly to screen memory or by
way of a BIOS call, depending on the value of directvideo.

cprintf does not translate linefeed characters (\n) into
carriage-return/linefeed character pairs (\r\n).


 The v...printf functions

The v...printf functions are known as alternate entry points for the
...printf functions.

They behave exactly like their ...printf counterparts, except they accept a
pointer to a list of arguments (va_list arglist) instead of accepting an
actual list of arguments ([, address, ...]).

þ NOTE: When you use the SS!=DS flag, vprintf assumes that the address being
passed is in the SS segment.

 Return Value:
  þ On success, the ...printf functions return the number of bytes output
     þ cprintf returns the number of characters output
     þ sprintf does not include the terminating null byte in the count
  þ On error, these functions return EOF

 Portability:
          É DOS Ñ UNIX Ñ ANSI C Ñ C++ Only »
 cprintf  º Yes ³      ³        ³          º
 fprintf  º Yes ³  Yes ³  Yes   ³          º
 printf   º Yes ³  Yes ³  Yes   ³          º
 sprintf  º Yes ³  Yes ³  Yes   ³          º
 vfprintf º Yes ³  Yes ³  Yes   ³          º
 vprintf  º Yes ³  Yes ³  Yes   ³          º
 vsprintf º Yes ³  Yes ³  Yes   ³          º
          ÈÍÍÍÍÍÏÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍͼ

 See Also:
  atof       fscanf     getc       getche     putc       putch      va_arg
  va_end     va_start

 More ...printf topics
 ßßßßßßßßßßßßßßßßßßßßß
  Format String                  Format Specifiers
  Format Specifier Conventions   Flag Characters
  Input-size Modifiers           Precision Specifiers
  Type Characters                Width Specifiers

 Examples:
  cprintf example    fprintf example    printf example     sprintf example
  vfprintf example   vprintf example    vsprintf example

 

 

 

  ...printf Format Specifiers

In ...printf format strings, format specifiers have the following form:

  % [flags] [width] [.prec] [F|N|h|l|L] type_char

Each format specifier begins with the percent character (%).

After the % come the following, in this order:

  Component  ³ What It Controls or Specifies

  [flags]    ³(Optional) Flag character(s)
             ³   Output justification, numeric signs, decimal
             ³   points, trailing zeros, octal and hex prefixes
  [width]    ³(Optional) Width specifier
             ³   Minimum number of characters to print, padding
             ³   with blanks or zeros
  [.prec]    ³(Optional) Precision specifier
             ³   Maximum number of characters to print; for
             ³   integers, minimum number of digits to print
  [F|N|h|l|L]³(Optional) Input size modifier
             ³   Override default size of next input argument
             ³     N = near pointer    h = short int
             ³     F = far pointer     l = long int
             ³                         L = long double
  type_char  ³(Required) Conversion type character

 See Also:
  Format String                  Format Specifier Conventions
  Flag Characters                Input-size Modifiers
  Precision Specifiers           Type Characters
  Width Specifiers

 

 

 

 


  ...printf Conversion-Type Characters

The information in this table is based on the assumption that no flag
characters, width specifiers, precision specifiers, or input-size modifiers
were included in the format specifier.

 NOTE: Certain conventions accompany some of these format specifiers.

  Type ³                ³
  Char ³ Expected Input ³ Format of output
 ÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
  Numerics
 ÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
    d  ³ Integer        ³ Signed decimal integer
    i  ³ Integer        ³ Signed decimal integer
    o  ³ Integer        ³ Unsigned octal integer
    u  ³ Integer        ³ Unsigned decimal integer
    x  ³ Integer        ³ Unsigned hexadecimal int (with a, b, c, d, e, f)
    X  ³ Integer        ³ Unsigned hexadecimal int (with A, B, C, D, E, F)
    f  ³ Floating point ³ Signed value of the form [-]dddd.dddd.
    e  ³ Floating point ³ Signed value of the form [-]d.dddd or e[+/-]ddd
    g  ³ Floating point ³ Signed value in either e or f form, based on
       ³                ³ given value and precision. Trailing zeros and
       ³                ³ the decimal point are printed if necessary.
    E  ³ Floating point ³ Same as e; with E for exponent.
    G  ³ Floating point ³ Same as g; with E for exponent if e format used
 ÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
  Characters
 ÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
    c  ³ Character      ³ Single character
    s  ³ String pointer ³ Prints characters until a null-terminator is
       ³                ³ pressed or precision is reached
    %  ³ None           ³ Prints the % character
 ÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
  Pointers
 ÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
    n  ³ Pointer to int ³ Stores (in the location pointed to by the input
       ³                ³ argument) a count of the chars written so far.
    p  ³ Pointer        ³ Prints the input argument as a pointer; format
       ³                ³ depends on which memory model was used. It will
       ³                ³ be either XXXX:YYYY or YYYY (offset only).

Infinite floating-point numbers are printed as +INF and -INF.

An IEEE Not-A-Number is printed as +NAN or -NAN.

 See Also:
  Format String                  Format Specifiers
  Format Specifier Conventions   Flag Characters
  Input-size Modifiers           Precision Specifiers
  Width Specifiers

 

 

 */

+ نوشته شده در  سه شنبه هفتم آبان 1387ساعت 16:48  توسط گروه مولفان  | 

آشنایی با رشته مهندسی کامپیوتر-مقطع کارشناسی( نرم افزار- سخت افزار)
معرفی رشته مهندسی کامپیوتر:

رشته مهندسی کامپیوتر در مقطع کارشناسی دارای سه گرایش سخت افزار و نرم افزار و فناوری اطلاعات است گرایش سخت افزار در برگیرنده فعالیت های آموزشی، پژوهشی و صنعتی در خصوص قطعات، بردها، تجهیزات و در نهایت سیستم های کامپیوتری در مقیاس های مختلف است و یکی از شاخه های مهم آن به نام معماری کامپیوتر (طراحی و ساخت کامپیوتر) می باشد.هدف از گرایش نرم افزار کامپیوتر، آموزش و پژوهش در زمینه زبانهای مختلف برنامه نویسی، سیستم های عامل مختلف و طراحی انواع الگوریتم ها می باشد.

هدف تحصیل در رشته مهندسی کامپیوتر:

رشته مهندسی کامپیوتر که به طراحی و ساخت اجزای مختلف کامپیوتر می پردازد، از اهمیت بسیار زیادی در دنیای امروز برخوردار است. هدف از طی این دوره تربیت کارشناسانی است که در زمینه تحلیل، طراحی، ساخت و راه اندازی دستگاهها و مجموعه های سخت افزاری جدید، بررسی و شناخت مجموعه های سخت افزاری و نرم افزاری موجود، نگه داری، عیبیابی و تعمیر و اصلاح و توسعه فعالیت کنند.طراحی، شبیه سازی، فرآوری، پردازش، سنجش، آموزش، ویرایش و … همه مفاهیمی هستند که با بالاترین دقت و در کوتاهترین مدت زمان ممکن در برنامه های نرم افزاری کامپیوتر انجام می شوند. لذا هدف از این رشته تربیت نیروی متخصص برای انجام امور فوق است.

توانایی های فارغ التحصیلان رشته مهندسی کامپیوتر:

فارغ التحصیلان این مقطع، قابلیتها و تواناییهای زیادی دارند و چنانچه در مسیر مناسب هدایت شوند، قادر خواهند بود مشکلات زیادی را حل کنند. برخی از این تواناییها به شرح زیر است:

» بررسی و شناخت نرم افزارها و سخت افزارهای جدید و به کارگیری آنها.
» بررسی کمبودها و نیازهای نرم افزاری و سخت افزاری بخشهای صنعت و خدمات و تدوین نیازهای آنها، امکان سنجی وتعیین ابزار و نیروی انسانی لازم برای رفع کمبودها.
» تجزیه و تحلیل سیستمهای کوچک و متوسط نرم افزاری و سخت افزاری و ارائه راه حل مناسب برای اجرای آنها.
» طراحی مجموعه های کوچک و متوسط نرم افزاری و سخت افزاری و تولید طرحهای اجرایی برای آنها.
» اجرای طرحهای کامپیوتری، نصب، آزمایش و آموزش آنها.
» پشتیبانی و نگهداری سیستمهای نرم افزاری شامل شناسایی خطاها، رفع خطاها و افزودن امکانات جدید به سیستمها.
» عیب یابی کامپیوترها و سیستمهای کامپیوتری و رفع عیبها.
» شناسایی فنون جدید طراحی و ساخت کامپیوتر و ارزیابی و به کارگیری
آنها. تواناییهای ذکر شده مربوط به کارشناسان نرم افزار و سخت افزار می باشد؛ اما روشن است که کارشناسان نرم افزار در محدوده مسائل نرم افزاری توانایی بیشتری دارند و برعکس کارشناسان سخت افزار در محدوده مسائل سخت افزاری از توانایی بیشتری برخوردارند.

گرایش های مقطع لیسانس:

رشته مهندسی كامپیوتر در مقطع كارشناسی دارای دو گرایش سخت افزار و نرم افزار است كه البته این دو گرایش در مقطع كارشناسی تفاوت قابل توجهی با یكدیگر ندارند.

"گرایش سخت افزار در برگیرنده فعالیت های آموزشی، پژوهشی و صنعتی در خصوص قطعات، بردها، تجهیزات و در نهایت سیستم های كامپیوتری در مقیاس های مختلف است و یكی از شاخه های مهم آن به نام معماری كامپیوتر (طراحی و ساخت كامپیوتر) می باشد."

"هدف از گرایش نرم افزار كامپیوتر، آموزش و پژوهش در زمینه زبانهای مختلف برنامه نویسی، سیستم های عامل مختلف و طراحی انواع الگوریتم ها می باشد."

آینده شغلی، بازار كار، درآمد:

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

توانایی های جسمی، علمی، روانی و ... مورد نیاز و قابل توصیه

 توانایی علمی: یك مهندس كامپیوتر باید سخت كوش و با پشتكار باشد چون رشته كامپیوتر رشته پویایی است و همیشه باید اطلاعاتش به روز بوده و به دنبال فراگرفتن مطالب جدید باشد. مهندس كامپیوتر باید پایه ریاضی قوی داشته و توانایی اش در زمینه فیزیك خوب باشد. همچنین لازم است فردی خلاق باشد تا بتواند مسایل را از راههای ابتكاری حل كند.

علاقمندیها: مهندس كامپیوتر نرم افزار و سخت افزار باید به یادگیری و مطالعه علاقمند باشد تا پیشرفت در خور توجه داشته باشد. همچنین باید از جستجو و كاوش در مدارها و ریزساختارها استقبال كند و به كار با كامپیوتر علاقه داشته باشد.

توانایی مالی: با توجه به توضیحات گفته شده داشتن یك دستگاه كامپیوتر برای یك مهندس كامپیوتر امری ضروری به نظر می رسد ولی این گونه نیست كه بدون داشتن كامپیوتر دانشجویان از ادامه تحصیل و پیشرفت باز بمانند.


وضعیت نیاز کشور به این رشته مهندسی کامپیوتر در حال حاضر:

رشته کامپیوتر که باعث جهانی شدن اطلاعات و ارتباطات شده است ، رشته امروز و آینده است تا جایی که پیش بینی میشود تا ۱۰ سال دیگر در کشورهای پیشرفته مردم همان قدر که به نیروی برق وابسته هستند به شبکه اینترنت وابسته خواهند شد. با توجه به توضیحات گفته شده روند رو به رشد استفاده از کامپیوتر در زندگی روزانه، اشتغال و موقعیت کاری برای فارغ التحصیلان این رشته فراهم است تا در قالب شرکتهای تولیدکننده نرم افزار، شرکتهای تولیدکننده قطعات، مراکز صنعتی تولیدی، شرکتها و مؤسسات خدماتی، مراکز آموزشی و … مشغول به کار شده و فعالیت کنند. با توجه به پیشرفت کند ایران نسبت به جامعه جهانی کامپیوتر، در سالهای اخیر نیاز به مهندسین خلاق و کوشا در این زمینه کاملاً احساس میشود.روند رو به رشد استفاده از کامپیوتر در محافل عمومی و خصوصی، استفاده گسترده از شبکه اینترنت و زمینه های مرتبط با آن، فراهم آمدن شرایط آموزش و تجارت الکترونیک همه و همه دست به دست هم داده اند تا از اکنون چشم انداز روشنی نسبت به آینده این رشته وجود داشته باشد به نحوی که فعالان در این زمینه از آینده معلوم و مطمئنی برخوردار خواهند بود. تنها نگرانی به قسمت نرم افزار مربوط می شود که باید مهندسان خلاق ایرانی اقدام به تهیه نرم افزارهای گوناگون و کارآمد کرده تا تنها مصرف کننده صرف نباشیم.

نكات تكمیلی:

"بعضی از افراد تصور می كنند كه مهندسی سخت افزار در حد یك تعمیركار كامپیوتر است در حالی كه كار یك مهندس سخت افزار، تعمیر یا نصب و راه اندازی كامپیوتر نیست. هر چند كه می تواند چنین كاری را انجام دهد. در واقع كار یك مهندس سخت افزار، طراحی های سخت افزاری است و به همین دلیل در دانشگاه دروسی مثل ریاضیات و یا مدارهای منطقی را مطالعه می كند همچنین برخلاف تصور كسانی كه یك اپراتور را در حد یك مهندس نرم افزار می دانند، باید گفت كه یك مهندس نرم افزار لازم است از دانش ریاضی خوبی برخوردار باشد تا بتواند برنامه های كامپیوتری را طراحی كند و آنها را توسعه دهد. برای مثال باید بتواند یك كار گرافیكی را از بنیان طراحی كند. كاری كه از عهده یك اپراتور بر نمی آید. و به همین دلیل ما معتقدیم كه كلاسهای آزاد آموزش كامپیوتر هیچ وقت نمی توانند یك مهندس كامپیوتر پرورش دهند."


عناوین دروس رشته مهندسی کامپیوتر در گرایش سخت افزار ونرم افزار:

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 - کارگاه عمومی
+ نوشته شده در  دوشنبه ششم آبان 1387ساعت 22:11  توسط گروه مولفان  | 

مطالب جدیدتر