結構體數組
結構體數組的定義:
結構體數組格式:聲明變量類型 數組名稱[數組長度]
//定義一個結構體數組名爲a,它裏面包含有5個元素,每一個元素都是一個結構體變量
Wor a[5]={};
#include<stdio.h>
typedef struct worker{
char id[10];
char name[10];
char sex[10];
int pay;
}WOR;
void main(){
WOR a[3]=
{
{"0001","陳文傑","男",1200},
{"0001","張三丰","女",500},
{"0001","張四豐","女",1200}
}
}
對比記憶
結構體數組的輸出
#include<stdio.h>
typedef struct worker{
char id[10];
char name[10];
char sex[10];
int pay;
}WOR;
void main(){
WOR a[6]={
{"0001","陳文傑","男",1200},
{"0002","張三丰","女",5000},
{"0003","張四豐","女",1200},
{"0004","張五豐","男",2200},
{"0005","張六豐","男",5200},
{"0006","張七豐","男",6200}
};
int i;
for(i=0;i<6;i++){
printf("%s,%s,%s,%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
}
}
結構體對象中的a[i]就代表一個對象,它已經不再是一個值了
所以我們應該用a[ii].成員名
改進以上程序
#include<stdio.h>
typedef struct worker{
char id[10];
char name[10];
char sex[10];
int pay;
}WOR;
void output(WOR a[],int n){//次函數是用來輸出長度爲n的工人數組的信息
int i;
printf("工號\t姓名\t性別\t年齡\n");
for(i=0;i<6;i++){
printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
}
}
void main(){
WOR a[6]={
{"0001","陳文傑","男",1200},
{"0002","張三丰","女",5000},
{"0003","張四豐","女",1200},
{"0004","張五豐","男",2200},
{"0005","張六豐","男",5200},
{"0006","張七豐","男",6200}
};
output(a,6);
}
結構體的應用
案例一、
1、編寫一個函數,它的目的是爲了輸出所有性別爲男的的職工信息
算法分析:
1)這個函數它不用返回值因爲該函數是爲了完成輸出
2)該函數要處理很多職工,就需要一個數組,數組的類型爲職工類型
注意:在C語言當中字符串不能直接比較是否相同,要通過strcmp這個函數來比較其兩個字符串是否相同
#include<stdio.h>
#include<string.h>
typedef struct worker{
char id[10];
char name[10];
char sex[10];
int pay;
}WOR;
void QueryWorker(WOR a[],int n){//次函數是用來輸出長度爲n的工人數組的信息
int i;
printf("全部員工:\n");
printf("工號\t姓名\t性別\t年齡\n");
for(i=0;i<6;i++){
printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
}
printf("所有男員工:\n");
printf("工號\t姓名\t性別\t年齡\n");
for(i=0;i<6;i++){
if(strcmp(a[i].sex,"男")==0){
printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
}
}
printf("所有女員工:\n");
printf("工號\t姓名\t性別\t年齡\n");
for(i=0;i<6;i++){
if(strcmp(a[i].sex,"女")==0){
printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
}
}
}
void main(){
WOR a[6]={
{"0001","陳文傑","男",1200},
{"0002","張三丰","女",5000},
{"0003","張四豐","女",1200},
{"0004","張五豐","男",2200},
{"0005","張六豐","男",5200},
{"0006","張七豐","男",6200}
};
QueryWorker(a,6);
}
2、能夠輸出指定性別的職工
#include<stdio.h>
typedef struct worker{
char id[10];
char name[10];
char sex[10];
int pay;
}WOR;
void QueryBySex(WOR a[],int n,char b[]){//次函數是用來輸出長度爲n的工人數組的信息
int i;
printf("工號\t姓名\t性別\t年齡\n");
for(i=0;i<6;i++){
if(strcmp(a[i].sex,b)==0){
printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
}
}
}
void main(){
WOR a[6]={
{"0001","陳文傑","男",1200},
{"0002","張三丰","女",5000},
{"0003","張四豐","女",1200},
{"0004","張五豐","男",2200},
{"0005","張六豐","男",5200},
{"0006","張七豐","男",6200}
};
char b[10];
printf("請輸入您要查詢的性別 :\n");
scanf("%s",b);
QueryBySex(a,6,b);
}
案例二、
讓用戶輸入一個工號,然後在一個結構體數組當中去查找有沒有這個工人,如果有則輸出這個工人的信息,如果沒有則找不到此人
#include<stdio.h>
typedef struct worker{
char id[10];
char name[10];
char sex[10];
int pay;
}WOR;
void FindById(WOR a[],int n,char id[]){
//我們要訪問數組裏面每一個工人,如果發現了一個工人,就退出循環。如果找不到就輸出找不到此人
int i;
for(i=0;i<n;i++){
if(strcmp(a[i].id,id)==0){//說明第i個工人就是我們要找的職工
break;//強制終止循環
}
}
//在退出循環之後,再來檢查i與n的關係
if(i<n){//說明循環在中途就break,發現了職工
printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
}
else//找不到職工
{
printf("找不到此人");
}
}
void main(){
WOR a[6]={
{"0001","陳文傑","男",1200},
{"0002","張三丰","女",5000},
{"0003","張四豐","女",1200},
{"0004","張五豐","男",2200},
{"0005","張六豐","男",5200},
{"0006","張七豐","男",6200}
};
char b[10];
printf("請輸入您要查詢的id :\n");
gets(b);
FindById(a,6,b);
}
案例三、
求出所有職工中最高工資那個職工的信息
注意:這裏有一個知識點:成員比較整體賦值
#include<stdio.h>
#include<string.h>
typedef struct worker{
char id[10];
char name[10];
char sex[10];
int pay;
}WOR;
void max(WOR a[],int n){
WOR m=a[0];
int i;
for(i=0;i<n;i++){
if(m.pay<a[i].pay){//如果m的工資小於a[i]的工資,就把m賦值給a[i]
m=a[i];
}
}
printf("%s\t%s\t%s\t%d\n",m.id,m.name,m.sex,m.pay);
//假設第一個工人是最高工資的那個工人
}
void main(){
WOR a[6]={
{"0001","陳文傑","男",1200},
{"0002","張三丰","女",7000},
{"0003","張四豐","女",1200},
{"0004","張五豐","男",2200},
{"0005","張六豐","男",5200},
{"0006","張七豐","男",6200}
};
max(a,6);
}
上方程序改進
輸出所有工資大於平均工資的職工
1、必須要先求出平均
2、在訪問每一個職工,如果發現這個職工的工資要小於平均工資的話,就輸出這個職工的信息。
#include<stdio.h>
#include<string.h>
typedef struct worker{
char id[10];
char name[10];
char sex[10];
int pay;
}WOR;
void QueryByAver(WOR a[],int n){
int i;
float aver;
int sum = 0;
//求出總工資
for(i=0;i<n;i++){
sum+=a[i].pay;
}
//求出平均工資aver
aver =(float)sum/n;
printf("平均工資爲%f\n",aver);
printf("大於平均工資爲:\n");
//訪問每一個職工
for(i=0;i<n;i++){
if(a[i].pay>=aver){//如果發現職工的工資大於等於平局工資,就輸出對應職工的信息
printf("%s\t%s\t%s\t%d\n",a[i].id,a[i].name,a[i].sex,a[i].pay);
}
}
}
void main(){
WOR a[6]={
{"0001","陳文傑","男",3200},
{"0002","張三丰","女",7000},
{"0003","張四豐","女",1200},
{"0004","張五豐","男",2200},
{"0005","張六豐","男",5200},
{"0006","張七豐","男",6200}
};
QueryByAver(a,6);
}
算法變換
#include<stdio.h>
#include<string.h>
typedef struct stud{//定義了一個結構體
char Id[10];//學號
char Name[10];//姓名
int China;//語文成績
int Math;//數學成績
int English;//英語成績
}STU;
//編寫一個函數,它的目的是爲了輸出所有學生的總分與平均分
void fun(STU a[],int n){
int sum=0,i;
printf("學號\t姓名\t語文\t數學\t英語\t總分\t平局分\n");
//要訪問裏面的每一個學生
for(i=0;i<n;i++){
//對於一個學生a[i]而言我們要來輸出它的信息
printf("%s\t%s\t%d\t%d\t%d\t%d\t%.1f\n",
a[i].Id,a[i].Name,a[i].China,a[i].Math,a[i].English,
a[i].China+a[i].Math+a[i].English,
(a[i].China+a[i].Math+a[i].English)/3.0);
sum = a[i].China+a[i].Math+a[i].English;
}
}
void main(){
STU a[8]={
{"S1","張一軍",127,150,100},
{"S2","張二軍",75,85,89},
{"S3","張三軍",67,58,86},
{"S4","張四軍",120,101,87},
{"S5","張五軍",136,100,82},
{"S6","張六軍",141,52,83},
{"S7","張七軍",125,85,81},
{"S8","張八軍",136,65,79}
};
fun(a,8);
}
案例變換:
注意字符串也不能夠直接賦值,要通過一個函數來對字符串進行賦值
strcpy:通過這個函數纔可以給字符串進行賦值
#include<stdio.h>
#include<string.h>
typedef struct stud{//定義了一個結構體
char Id[10];//學號
char Name[10];//姓名
int China;//語文成績
int Math;//數學成績
int English;//英語成績
}STU;
//編寫一個函數,求出每一個學生的優秀科目,目的不是輸出分數,而是要輸出對應科目的名稱
void Perferct(STU a[],int n){
int sum=0,i;
char per[20];
int maxscore;//用來確保最優科目的分數
//要輸出標題
printf("學號\t姓名\t語文\t數學\t英語\t最優秀科目\n");
//要訪問裏面的每一個學生,對於第i學生要確認它的最優科目名稱(語文,數學,英語)
//科目名稱是字符串,所以要先定義一個字符串來確保保存最優科目名稱
for(i=0;i<n;i++){
maxscore=a[i].China;//認爲第i個學生的語文是最優秀的
strcpy(per,"語文");
if(maxscore<a[i].Math){
maxscore = a[i].Math;
strcpy(per,"數學");
}
if(maxscore<a[i].English){
maxscore = a[i].Math;
strcpy(per,"英語");
}
printf("%s\t%s\t%d\t%d\t%d\t%s\n",
a[i].Id,a[i].Name,a[i].China,a[i].Math,a[i].English,per);
}
}
void main(){
STU a[8]={
{"S1","張一軍",127,150,100},
{"S2","張二軍",75,85,89},
{"S3","張三軍",67,58,86},
{"S4","張四軍",120,101,87},
{"S5","張五軍",136,100,82},
{"S6","張六軍",141,52,83},
{"S7","張七軍",125,85,81},
{"S8","張八軍",136,65,79}
};
Perferct(a,8);
}