C語言結構體數組,結構體數組的定義,結構體數組的輸出,結構體的應用

結構體數組

結構體數組的定義:

結構體數組格式:聲明變量類型 數組名稱[數組長度]

//定義一個結構體數組名爲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);
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章