久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

結(jié)構(gòu)體的定義及應(yīng)用

 fjsmfj 2012-03-29
  在實際應(yīng)用中會遇到某類信息必須用不同數(shù)據(jù)類型的數(shù)據(jù)項來描述的情況,如學生成績信息中含有:
  學號 ---int
  姓名 ---char[8] 
  性別 ---char
  成績 ---float
  等數(shù)據(jù)項。這些數(shù)據(jù)項屬于不同的數(shù)據(jù)類型,,如學號為整型,性別為字符型等,。將不同類型數(shù)據(jù)作為一個整體來處理的數(shù)據(jù)結(jié)構(gòu)稱為結(jié)構(gòu)體。
  結(jié)構(gòu)體類型是一種導(dǎo)出的數(shù)據(jù)類型,,編譯程序并不為任何數(shù)據(jù)類型分配存儲空間,,只有定義了結(jié)構(gòu)體類型的變量后,系統(tǒng)才為這種變量分配存儲空間,。如:對整數(shù)類型 int ,,系統(tǒng)并不為其分配存儲空間,只有定義整型變量 int a后,,系統(tǒng)才為變量a分配存儲空間,。與枚舉類型相似,必須先定義結(jié)構(gòu)體類型,,然后才能用結(jié)構(gòu)體類型定義結(jié)構(gòu)體變量,。

  結(jié)構(gòu)體類型的定義

  定義結(jié)構(gòu)體類型的語句格式為:
  struct <結(jié)構(gòu)體類型名>
  { <類型> <成員1>;
  <類型> <成員2>;
  …
  <類型> <成員n>;
  };
  關(guān)鍵詞struct說明,,定義的是結(jié)構(gòu)體類型,結(jié)構(gòu)體類型名由標識符組成,。由定義格式可以看出,,結(jié)構(gòu)體數(shù)據(jù)類型由若干個數(shù)據(jù)成員組成,每個數(shù)據(jù)成員可以有不同的數(shù)據(jù)類型,。數(shù)據(jù)類型可以是基本類型,,也可以是導(dǎo)出類型。

  【例】定義一個學生成績的結(jié)構(gòu)體數(shù)據(jù)類型如下:
 struct student 
 { int no ; //學號
  char name[8]; //姓名
  float eng,phy,math,ave ; //英語,、物理,、數(shù)學與平均成績 
 };
  學生成績結(jié)構(gòu)體中的數(shù)據(jù)成員有no(學號)、name[8](姓名),、eng(英語),、phy(物理)、math(數(shù)學),、平均成績(ave),。每個成員的類型可以是基本類型或?qū)С鲱愋汀T谝粋€程序中,,一旦定義了一個結(jié)構(gòu)體類型,,就增加了一種新的稱為結(jié)構(gòu)體的數(shù)據(jù)類型,也就可以用這種數(shù)據(jù)類型定義結(jié)構(gòu)體變量,。

 結(jié)構(gòu)體變量的定義

  定義結(jié)構(gòu)體變量有三種方式,,即:先定義結(jié)構(gòu)體后定義結(jié)構(gòu)體變量,定義結(jié)構(gòu)體的同時定義結(jié)構(gòu)體變量,,在函數(shù)內(nèi)直接定義結(jié)構(gòu)體變量,。現(xiàn)介紹如下:
  1.先定義類型后定義變量
  格式: 〔存儲類型〕<結(jié)構(gòu)體類型名> <變量名1> 〔,,<變量名2>,,…,<變量名n>〕,;
  用上例中的結(jié)構(gòu)體類型student 可定義變量與數(shù)組如下: 
  student stu1,stu2[10];
  此時,,系統(tǒng)為stu1分配了28個字節(jié)存儲空間,系統(tǒng)為數(shù)組stu2 分配10個與stu1相同的存儲空間。


  2.定義結(jié)構(gòu)體的同時定義結(jié)構(gòu)體變量
  格式:struct <結(jié)構(gòu)體類型名>
  { <成員列表>} <變量名1>〔,,<變量名2>…〕,;
  

  3.直接定義結(jié)構(gòu)體變量
  struct 
  { <成員列表>} <變量名1>〔,<變量名2>…〕,;
  現(xiàn)就三種定義方式舉例說明如下,。
  【例8.4】用三種方式定義職工、學生,、日期三類結(jié)構(gòu)體變量,。
 # include <iostream.h>
 # include <string.h>
 struct employee //定義職工結(jié)構(gòu)體數(shù)據(jù)類型 
 { int no ; //職工編號
  char name[8]; //職工姓名
  char addr[40]; //家庭地址
 };
 struct student //定義學生結(jié)構(gòu)體數(shù)據(jù)類型
 { int no; //學號
  float eng,phy,math,ave; //英語,、數(shù)學、物理成績,、平均成績
 } stu1,stu2; //定義結(jié)構(gòu)體同時定義結(jié)構(gòu)體變量stu1,、stu2
 main ()
 { employee emp1,emp2; //定義employ 類型的結(jié)構(gòu)體變量emp1、emp2,。
  struct 
   { int year,month,day;
   } date1,date2; // 直接定義日期結(jié)構(gòu)體類型變量,。
  emp1.no=100; //賦職工號
  strcpy ( emp1.name, "zhang sa"); //賦職工姓名
  strcpy( emp1.addr, "Nanging"); //賦家庭地址
  emp2=emp1; //將職工emp1的信息賦給emp2
  cout<<"no="<< emp2.no<<'\t' //輸出職工信息
  <<"name="<< emp2.name<<'\t' 
  << "addr="<< emp2.addr<<endl;
  stu1.no=101; //輸入學號與成績 
  stu1.eng=90; //輸入成績
  stu1.phy=95;
  stu1.math=100;
  cout<<"eng="<<stu1.eng<<'\t' //輸出學生成績
  <<"phy="<<stu1.phy<<'\t' 
  <<"math="<<stu1.math<<endl;
  date1.year=1999; //輸入入學日期 
  date1.month=09;
  date1.day=01;
  cout<<"year="<<date1.year<<'\t' //輸出入學日期
  <<"month="<<date1.month<<'\t'
  <<"day="<<date1.day<<endl;
 }
  在上例中,結(jié)構(gòu)體變量emp1,、emp2采用先定義結(jié)構(gòu)體后定義變量的方式,。結(jié)構(gòu)體變量stu1、stu2采用定義結(jié)構(gòu)體的同時定義結(jié)構(gòu)體變量,。結(jié)構(gòu)體變量date1,、date2采用在函數(shù)內(nèi)直接定義結(jié)構(gòu)體變量。幾點說明:
 ?。?)結(jié)構(gòu)體變量的初始化
  與數(shù)組類似,,在定義結(jié)構(gòu)體變量時可進行初始化。如:
  employee emp1={100, "zhang sa","Nanging"},;
  注意:在初始化時,,數(shù)據(jù)類型必須保持一致。如:
  employee emp1={"100", "zhang sa", "Nanging"},;
  由于 emp1.no為整型,,而初始化數(shù)據(jù)"100"為字符型,所以編譯出錯,。
 ?。?)通常在設(shè)計大程序時,將所有結(jié)構(gòu)體類型說明存放在頭文件中,,然后用包含命令將該頭文件嵌入程序,,編程時用結(jié)構(gòu)體名定義結(jié)構(gòu)體變量即可。因此,,提倡使用第一種方式定義結(jié)構(gòu)體變量,。
  (3)結(jié)構(gòu)體變量的作用域
  結(jié)構(gòu)體變量的作用域與普通變量的作用域相同,,即在函數(shù)外定義的結(jié)構(gòu)體變量具有文件作用域,。在函數(shù)內(nèi)定義的結(jié)構(gòu)體變量具有塊作用域。如:stu1,、stu2是在函數(shù)外定義的結(jié)構(gòu)體變量,,因此,stu1、stu2為全局變量且具有文件作用域,。而emp1,、emp2、date1,、date2是在函數(shù)內(nèi)定義的結(jié)構(gòu)體變量,,因此,emp1,、emp2 ,、date1、date2為局部變量且只具有塊作用域,。
 ?。?)指定結(jié)構(gòu)體變量的存儲類型
  定義結(jié)構(gòu)體變量時可以指定其存儲類型,如:
  static employee emp1; //指定emp1為靜態(tài)結(jié)構(gòu)體變量
  auto employee emp2; //指定emp2為自動結(jié)構(gòu)體變量
  extern employee emp3; //指定emp3為外部結(jié)構(gòu)體變量

  結(jié)構(gòu)體變量的引用

  一旦用結(jié)構(gòu)體類型定義好結(jié)構(gòu)體變量后,,便可引用結(jié)構(gòu)體變量中的成員,。引用結(jié)構(gòu)體變量成員的格式為: <結(jié)構(gòu)體變量>.<成員名>
  其中"."稱為成員運算符。在例 8.4中已多次用到"<結(jié)構(gòu)體變量>.<成員名>",,如stu1.name表示引用學生結(jié)構(gòu)體變量stu1中的姓名數(shù)據(jù)成員name,。對結(jié)構(gòu)體變量應(yīng)注意以下幾點:
  (1)同類型結(jié)構(gòu)體變量可以直接賦值,,如:emp2=emp1; 該賦值操作是將emp1中每個成員值賦給emp2對應(yīng)成員,。
  (2)結(jié)構(gòu)體變量不能直接輸入/輸出,,只能對其成員進行輸入輸出,。如:
  cin >> stu2; 是錯誤的
  cin >> stu2.name>>stu2.addr; 是正確的
  (3)結(jié)構(gòu)體變量可作為函數(shù)參數(shù)
  當結(jié)構(gòu)體變量作為函數(shù)參數(shù)時,,實參值傳送給形參屬于值傳送,,因此,函數(shù)調(diào)用后實參值仍保持不變,。
 

  【例】定義一個復(fù)數(shù)結(jié)構(gòu)體,,以復(fù)數(shù)的實部r、虛部i作為結(jié)構(gòu)體成員,,編寫能實現(xiàn)兩復(fù)數(shù)加法的函數(shù),,用結(jié)構(gòu)體變量作為其形參,。在主函數(shù)內(nèi)定義兩個復(fù)數(shù),,并賦初值。調(diào)用復(fù)數(shù)加法函數(shù),,完成兩復(fù)數(shù)相加的操作,。 
  分析:復(fù)數(shù)的一般表達式為 復(fù)數(shù)=實部+虛部 i ,因此,復(fù)數(shù)結(jié)構(gòu)體類型中兩個數(shù)據(jù)成員為實部r與虛部i,。兩個復(fù)數(shù)相加是指其實部與實部相加,,虛部與虛部相加,因此,,復(fù)數(shù)加法函數(shù)add()中,,先定義一個用于存放兩復(fù)數(shù)和的臨時復(fù)數(shù)變量c,然后進行兩個復(fù)數(shù)實部與實部相加,,虛部與虛部相加的操作,,結(jié)果存放在c的實部與虛部中,最后將c作為函數(shù)返回值,。編寫程序如下:
 # include <iostream.h>
 struct Complex //定義一個復(fù)數(shù)結(jié)構(gòu)體
 { float r; //復(fù)數(shù)的實部
  float i; //復(fù)數(shù)的虛部
 };
 Complex add(Complex c1,Complex c2) //復(fù)數(shù)加法函數(shù)
 { Complex c; //定義復(fù)數(shù)結(jié)構(gòu)體變量c
  c.r=c1.r+c2.r; //兩復(fù)數(shù)實部相加賦給c的實部 
  c.i=c1.i+c2.i; //兩復(fù)數(shù)虛部相加賦給c的虛部
  return c; //返回相加后的復(fù)數(shù)c
 }
 void main( void )
 { Complex x1={10,25},x2={20,35},x; //定義三個復(fù)數(shù)x1,、x2、x
  x=add (x1,x2); //調(diào)用復(fù)數(shù)加法函數(shù)
  cout<<"x1="<<x1.r<<"+"<<x1.i<<"i"<<endl;
  cout<<"x2="<<x2.r<<"+"<<x2.i<<"i"<<endl;
  cout<<"x="<<x.r<<"+"<<x.i<<"i"<<endl;
 }
  執(zhí)行程序后輸出
  x1=10+25i
  x2=20+35i
  x =30+60i
  主函數(shù)main()中定義了三個復(fù)數(shù)類型的結(jié)構(gòu)體變量x1,、x2,、x,并對x1,、x2賦初始值,。調(diào)用復(fù)數(shù)加法函數(shù)add(),完成x1與x2相加的操作,。實參x1,、x2的值分別傳給形參c1、c2,,即:c1.r=x1.r=10, c1.i=x1.i=25, c2.r=x2.r=20, c2.i=x2.i=35,。該參數(shù)傳送屬于值傳送,因此程序執(zhí)行后實參x1,、x2的值并未改變,。運算結(jié)果的復(fù)數(shù)值是通過函數(shù)返回,因此,,函數(shù)返回類型應(yīng)定義為復(fù)數(shù)結(jié)構(gòu)體類型,。

  結(jié)構(gòu)體數(shù)組

  由結(jié)構(gòu)體類型元素組成的數(shù)組稱為結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組定義方法與結(jié)構(gòu)體變量完全類似,,只要在結(jié)構(gòu)體變量定義的基礎(chǔ)上加上維數(shù)說明即可,。
  例如: struct student 
    { int no;
     float eng,phy,math,ave;
    } stu1[10],stu2[10][20];
  分別定義了一維數(shù)組stu1和二維數(shù)組stu2。
  【例】建立學生檔案的結(jié)構(gòu)體數(shù)組,,描述一個學生的信息:姓名,、性別、年齡,、出生日期,。并輸出已建立的學生檔案。
 #include <iostream.h>
 struct date //定義出生日期結(jié)構(gòu)體類型
 { int year,month,day; //定義出生年、月,、日 數(shù)據(jù)成員
 };
 struct student //定義學生檔案結(jié)構(gòu)體類型
 { int no ; //學號
  char name[10]; //姓名 
  char sex[2]; //性別
  int age; //年齡
  date birthday; //出生日期(結(jié)構(gòu)體類型)
 };
 void output( student x) //定義輸出函數(shù)
 { cout << x.no <<'\t'<<x.name<<'\t'<< x.sex <<'\t'<< x.age <<'\t'
   <<x.birthday.year<<'\t'<< x.birthday.month<<'\t'<< x.birthday.day<<endl;
 }
 void main(void)
 { cout <<"no"<<'\t'<<"name"<<'\t'<<"sex"<<'\t'<<"age"<<'\t'
  <<"year"<<'\t'<< "month"<<'\t'<<"day"<<endl;
  student s[2]={{100,"zhou","m",22,1980,12,1},{101,"Li","w",24,1978,1,1}};
  for ( int j=0 ;j<2;j++) output( s[j]);
 }
  程序執(zhí)行后輸出:
  no name sex age year month day
  100 zhou m 22 1980 12 1
  101 Li w 24 1978 1 1
  由上例可以看出:
 ?。?)定義結(jié)構(gòu)體數(shù)組時,也可進行初始化賦值操作,。
 ?。?)在結(jié)構(gòu)體中可以用其它結(jié)構(gòu)體類型定義數(shù)據(jù)成員。如在student結(jié)構(gòu)體中用date結(jié)構(gòu)體定義出生日期數(shù)據(jù)成員birthday,。對于在結(jié)構(gòu)體中定義的結(jié)構(gòu)體數(shù)據(jù)成員,,其引用方式為:結(jié)構(gòu)體變量名.結(jié)構(gòu)體成員名.成員名。
  如引用結(jié)構(gòu)體變量x的數(shù)據(jù)成員birthday中成員yaer,、month,、day的方式為:
  出生年份:x.brithday.year
  出生月份:x.brithday.month
  出生日期:x.brithday.day
  

  【例】定義全班學生學習成績的結(jié)構(gòu)體數(shù)組,學生結(jié)構(gòu)體類型的數(shù)據(jù)成員為:姓名,、學號,、英語、物理,、數(shù)學和這三門功課的平均成績(通過計算得到),。設(shè)計四個函數(shù):全班成績輸入,求出每個學生的平均成績,,按平均成績的升序排序,,輸出全班成績表。
 # include <iostream.h>
 struct student //定義學生成績結(jié)構(gòu)體類型
 { int no;
  char name[8];
  float eng,phy,math,ave;
 };
 void Input (student s[ ],int n) //輸入函數(shù)
 { int i;
  cout <<"輸入學生:"<<endl;
  cout <<"學號,、姓名,、英語、物理,、數(shù)學成績"<<endl;
  for (i=0;i<n;i++)
  cin >> s[i].no >>s[i].name>>s[i].eng>>s[i].phy>>s[i].math;
 } 
 void Ave (student s[ ],int n) //求平均成績函數(shù)
 { int i;
  for (i=0;i<n;i++)
  s[i].ave=(s[i].eng+s[i].phy+ s[i].math)/3;
 }
 void Sort(student s[ ],int n) //升序排序函數(shù)
 { int i,j,k;
  student temp;
  for (i=0;i<n-1;i++)
   { k=i;
   for (j=i+1;j<n;j++)
     if (s[j].ave<s[k].ave ) k=j;
    if (k>i) 
   {temp=s[k];s[k]=s[i];s[i]=temp;}
   }
  }
 void Print(student s[ ], int n) //輸出函數(shù)
 { int i;
  cout<< "學號" << '\t' << "姓名" << '\t' << "英語" << '\t' << "物理" << '\t' 
  << "數(shù)學" << '\t'<< "平均成績" << '\n';
  for (i=0;i<n;i++)
  cout<<s[i].no<<'\t' <<s[i].name<<'\t'<<s[i].eng<<'\t' <<s[i].phy<<'\t' 
  <<s[i].math<<'\t' <<s[i].ave<<'\n';
 }
 void main (void)
 { student stu[3]; //定義結(jié)構(gòu)體數(shù)組
  Input(stu,3); //輸入學生成績 
  Ave (stu,3); //計算學生平均成績
  Sort(stu,3); //按平均成績排序 
  Print(stu,3); //輸出學生成績
 } 
  程序執(zhí)行后提示:
  輸入學生:
  學號,、姓名、英語,、物理,、數(shù)學成績:
  用戶輸入:
  100 Zhou 90 85 80
  101 Li 80 75 70
  102 Zhang 100 95 90
  屏幕輸出
  學號 姓名 英語 物理 數(shù)學 平均成績
  101 Li 80 75 70 75
  100 Zhou 90 85 80 85
  102 Zhang 100 95 90 95
  程序說明:
  用結(jié)構(gòu)體數(shù)組作為函數(shù)參數(shù)屬于傳地址,即實參stu[ ]與形參s[ ]共用同一內(nèi)存區(qū),。因此,,在輸入、輸出,、計算平均成績,、排序四個函數(shù)內(nèi)對數(shù)組s[ ]的操作,就是對主函數(shù)中數(shù)組stu[ ]的操作,。

 
 

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多