ImageVerifierCode 换一换
格式:DOC , 页数:65 ,大小:1.17MB ,
资源ID:7201134      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/7201134.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(C语言Structure的功能.doc)为本站上传会员【pc****0】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

C语言Structure的功能.doc

1、第十章 C語言Structure的功能 假設我們有一組學生的資料,包含學生的學號、姓名和體重,我們要如何表示這種資料呢?對很多電腦語言而言,我們必須要有三個陣列。這三個陣列分別表示學生的學號,姓名和體重。舉例而言,假如我們有五位學生,他們的資料如表10-1: 學號 姓名 體重 109 John 79.1 201 Mary 60.3 159 Peter 81.4 163 Kelly 76.6 200 Gloria 62.3 表10-1 我們就需要三個陣列,如表10-2所示: 學號陣列 姓名陣列 體重陣列 109

2、John 79.1 201 Mary 60.3 159 Peter 81.4 163 Kelly 76.6 200 Gloria 62.3 表10-2 麻煩的是:這三個陣列是互有關聯的。如果我們要將學生的資料按照學號的大小排列,學號陣列當然會改變,但是我們必須跟著同時改變姓名、陣列和體重陣列。改過以後的三個陣列如表10-3。 學號陣列 姓名陣列 體重陣列 109 John 79.1 159 Peter 81.4 163 Kelly 76.6 200 Glor

3、ia 62.3 201 Mary 60.3 表10-3 所以,我們只好承認這是一件很複雜的事情。可是,在C語言中,我們有一個簡單的辦法,我們可以利用一種叫做structure的功能,一下子就解決了這個問題。 Structure使我們可以宣告學生的資料有三個欄位:學號、姓名、體重。學號和體重都用整數來代表,姓名用文字來表示,所以我們可以作以下的宣告。 struct student { int idnum; char name[20]; float weight; } 從以上的宣告看來,學生的姓名最長不能超過20個

4、英文字。 一旦對下定義,我們就宣告一個陣列有的結構,這個陣列當然也要有一個名字,我們不妨將它叫做,內容有如表10-1所示。假設我們要找第個的資料,我們只要找即可。如果我們要找第個學生的學號,我們就要指定,他的姓名是,而他的體重則是。有了以後,我們可以根據其中任何一個欄位排列。假設我們用學號排列,就可以得到以下的,如表10-4 學號 姓名 體重 109 John 79.1 159 Peter 81.4 163 Kelly 76.6 200 Gloria 62.3 201 Mary 60.3 表10-

5、4 如果用體重來排列,我們會得到如表10-5所示的資料。 學號 姓名 體重 201 Mary 60.3 200 Gloria 62.3 163 Kelly 76.6 109 John 79.1 159 Peter 81.4 表10-5 至於如何會有資料的?當然是靠讀入的,我們通常應該宣告一個文字檔,用讀檔案的方法可以將資料讀到去。 例題10-1 讀入學生資料檔,根據學號將學生資料排列,並將結果輸出至另一檔案 要使用structure來表示學生資料,我們必需在主程式的外面先註明

6、所以我們會在主程式的前面,有以下的指令: struct studentdata { int idnum; char name[20]; float weight; } 主程式的流程圖如圖10-1。 圖10-1 至於排序的副程式,它的流程圖如圖10-2所示。 圖10-2 當然,我們還要有一個輸出結果至文字檔的副程式,這個副程式非常簡單,我們就不再討論它的流程圖了。 以下是這個程式。 程式 10-1 #include #define MAX_ARRAY_SIZE 256 #define STUDENT_DA

7、TA_FILE_NAME "student.txt" #define OUTPUT_FILE_NAME "student_output.txt" struct student { int idnum; char name[20]; float weight; }; int read_all_student_data(struct student A[MAX_ARRAY_SIZE], FILE *fp); void output_all_student_data(FILE* output_data_fp, struct student A[MAX

8、ARRAY_SIZE], int N); void sort_student_data(struct student A[MAX_ARRAY_SIZE], int N); int FMIN_student_data(struct student A[MAX_ARRAY_SIZE], int i, int N); void SWAP_student_data(struct student A[MAX_ARRAY_SIZE], int i, int j); void main(void) { FILE *student_data_fp; FILE *out

9、put_data_fp; struct student sdata[MAX_ARRAY_SIZE]; int num_of_student; int i; student_data_fp = fopen(STUDENT_DATA_FILE_NAME, "r"); output_data_fp = fopen(OUTPUT_FILE_NAME, "w"); /* Read the student data from file to array */ if( student_data_fp != N

10、ULL ) { num_of_student = read_all_student_data(sdata, student_data_fp); fclose(student_data_fp); if(num_of_student==0) { printf("There is no student data in the input file."); } else { output_all_student_da

11、ta(output_data_fp,sdata, num_of_student); /* Sort student data */ fprintf(output_data_fp,"Start sorting student data.\n"); sort_student_data(sdata, num_of_student); /* Display sorted student data */ fprintf(output_data_fp,"

12、Sorted student data.\n"); output_all_student_data(output_data_fp,sdata, num_of_student); } } else { printf("Student data file doesn't exist.\n"); } fclose(output_data_fp); /* Program ends here */ } int read_all_student_data(struct

13、 student A[MAX_ARRAY_SIZE], FILE *fp) { int i; i = 0; while(i < MAX_ARRAY_SIZE) { if( !feof(fp) ) { fscanf(fp,"%d %s %f", &A[i+1].idnum, A[i+1].name, &A[i+1].weight); if(A[i+1].idnum!=0) { i++;

14、 } } else { return i; } } return i; } void output_all_student_data(FILE* output_data_fp, struct student A[MAX_ARRAY_SIZE], int N) { int i; fprintf(output_data_fp,"ID\t\tName\t\tWeight\n"); for(i

15、 = 1; i <= N; i++) { fprintf(output_data_fp,"%d\t\t%s\t\t%.1f\n", A[i].idnum, A[i].name, A[i].weight); } } void sort_student_data(struct student A[MAX_ARRAY_SIZE], int N) { int i; int j; for( i = 1; i <= N; i++ ) { j = FMIN_student_data(A,

16、 i, N); SWAP_student_data(A, i, j); } } void SWAP_student_data(struct student A[MAX_ARRAY_SIZE], int i, int j) { struct student tmp_var; tmp_var = A[i]; A[i] = A[j]; A[j] = tmp_var; } int FMIN_student_data(struct student A[MAX_ARRAY_SIZE], int i, i

17、nt N) { int MIN; int k; int j; k = i; j = k; MIN = A[j].idnum; while( k <= N ) { if(A[k].idnum < MIN) { j = k; MIN = A[j].idnum; } k++; } return j; } 執行範例 ID Na

18、me Weight 109 John 79.1 201 Mary 60.3 159 Peter 81.4 163 Kelly 76.6 200 Gloria 62.3 Start sorting student data. Sorted student data. ID Name Weight 109 John 79.1 159 Peter 81.4 163 Kelly 76.6 200 Gloria 62.3 201 Mary 60.3 解釋 [資料檔] 資料檔的格式如下: 109 John 79.1 2

19、01 Mary 60.3 159 Peter 81.4 163 Kelly 76.6 200 Gloria 62.3 資料檔中,每一行儲存一個學生的資料。每個學生的資料(ID, Name, Weigh)以一個空白(space)當作分隔。 [主程式] 1. 當要存取檔案時,我們需要使用到標準函式庫,在程式的一開始加入#include 。 2. struct student sdata[MAX_ARRAY_SIZE]; 這個指令宣告sdata是一個student structure,而student structure的定義在前面有如下的定義: st

20、ruct student { int idnum; char name[20]; float weight; }; 3. 讀檔時需要先做打開檔案的動作,因此我們呼叫fopen來打開檔案。而我們所開啟的檔案是student.txt。 4. num_of_student = read_all_student_data(sdata, student_data_fp); 這個指令不僅將檔案中的資料讀入了sdata,也同時算出了一共有多少個學生。學生數目就是num_of_student,也是read_all_student_data副程式所傳回的值。若num_

21、of_student的值為0,則表示檔案中沒有任何一筆學生資料,則印出檔案為空檔案的訊息後就結束程式,不為0則繼續執行程式。 5. 以後我們呼叫另一個副程式,將陣列中的資料依學號做排序。 6. 將排序好的學生資料陣列輸出至檔案student_output.txt中。如果輸出到螢幕上當然也可以,但是如果要再複製結果貼上word檔案,會產生不對齊的問題,現在我們輸出到文字檔案中,再貼到word檔案,就不會有不對齊的問題。 [副程式] int read_all_student_data(struct student A[MAX_ARRAY_SIZE], FILE *fp); 將打開好的

22、檔案指標傳入,此副程式則會將存在裡面的學生資料,一筆一筆讀至陣列中,而由於我們習慣索引值從1開始使用,所以將讀入的資料存入第i+1個陣列。由於檔案是可能不含任何學生資料的空檔案,而學生的學號的值必定不會是0,因此我們以if(A[i+1].idnum!=0) 來判斷是否已經沒有學生資料,若為0,則表示檔案中讀不到任何學生資料,回傳i值後結束副程式。 void output_all_student_data(struct student A[MAX_ARRAY_SIZE], int N); 1. 將學生資料陣列的資料(學號(id)、姓名(name)、體重(weight)),及裡面的資料的

23、數目(N)輸出至檔案student_output.txt中。 2. fprintf(output_data_fp,"%d\t\t%s\t\t%.1f\n", A[i].idnum, A[i].name, A[i].weight); 這個指令的用意是在輸出學生學號、姓名與體重的資料到檔案中,需要注意的是”\t”個指令,由於每個學生的姓名長度都不相同,而”\t”就相當於我們在打字的過程中,按下了鍵盤上的Tab鍵。當按下Tab鍵後,畫面上不單單只是多出一段空白,而且會自動的進行上下對齊,使得每一筆資料看起來都是對齊的。也因此,當我們在輸出時使用”\t”這個指令,是為了讓每一筆學生資料在輸出時能夠

24、自動對齊。而%.1f的指令,則是因為若不做任何指定的話,%f將會印出小數點後五個位數,但我們的資料只有使用到小數點後1位,因此我們使用%.1f來控制輸出的浮點數格式,使其僅印到小數點後1位的部份。 3. 在此A[i].name前不用加&,這是因為name宣告為一個陣列。 4. 注意return有跳出副程式的功能,一旦程式執行到return,將會結束副程式。 void sort_student_data(struct student A[MAX_ARRAY_SIZE], int N); 根據輸入的學生資料及長度,依學號來做排序。排序的方法與之前相同,只是之前是根據數字大小來做排序,而

25、我們這次則是用學號來對整個學生資料陣列來做排序。 int FMIN_student_data(struct student A[MAX_ARRAY_SIZE], int i, int N); 在學生資料陣列的第個到最後一筆學生資料中找出學號最小的那一筆,並回傳它在陣列中的所在位置。 void SWAP_student_data(struct student A[MAX_ARRAY_SIZE], int i, int j); 將學生資料陣列第與個位置的學生資料互換。 例題10-2 依據學號找出學生資料 假設我們有以下的資料, 學號 姓名 體重 9301 J

26、ohn 65.2 9302 Tom 47.3 9310 Peter 70.5 9303 Mary 67.1 9311 Gloria 42.6 9308 George 70.8 而我們要找學號為9310的資料,我們找出的就是"9310 Peter 70.5"。 這個程式的主程式如圖10-3 圖10-3 Search副程式如10-4所示: 圖10-4 以下是程式 程式 10-2 #include #define MAX_ARRAY_SIZE 256 #define STUDENT_

27、DATA_FILE_NAME "student.txt" struct student { int idnum; char name[20]; float weight; }; int read_all_student_data(struct student A[MAX_ARRAY_SIZE], FILE *fp); void display_student_data(struct student x[MAX_ARRAY_SIZE],int i); void display_all_student_data(struct student A[M

28、AX_ARRAY_SIZE], int N); void search(struct student A[MAX_ARRAY_SIZE], int target_id_num, int N); void main(void) { FILE *student_data_fp; struct student sdata[MAX_ARRAY_SIZE]; int num_of_student; int i; int target_id_num; printf("Please enter the ID for searc

29、hing the student: "); scanf("%d", &target_id_num); student_data_fp = fopen(STUDENT_DATA_FILE_NAME, "r"); /* Read the student data from file to array */ if( student_data_fp != NULL ) { num_of_student = read_all_student_data(sdata, student_data_fp);

30、 fclose(student_data_fp); if(num_of_student==0) { printf("There is no student data in the input file."); } else { display_all_student_data(sdata, num_of_student); search(sdata, target_id_num, num_of_student);

31、 } } else { printf("Student data file doesn't exist.\n"); } /* Program ends here */ } int read_all_student_data(struct student A[MAX_ARRAY_SIZE], FILE *fp) { int i; i = 0; while(i < MAX_ARRAY_SIZE) { if( !feof(fp) )

32、 { fscanf(fp,"%d %s %f", &A[i+1].idnum, A[i+1].name, &A[i+1].weight); if(A[i+1].idnum!=0) { i++; } } else { return i; } } return i; } void search(struct

33、 student A[MAX_ARRAY_SIZE], int target_id_num, int N) { int i; int test = 0; /* 0:false, 1:ture */ for(i = 1; i <= N; i++) { if( A[i].idnum == target_id_num ) { test = 1; break; } } if( test == 1 ) {

34、 printf("\nData Found.\n"); display_student_data( A,i ); } else { printf("Data Not Found.\n"); } } void display_student_data(struct student x[MAX_ARRAY_SIZE],int i) { printf("ID\t\tName\t\tWeight\n"); printf("%d\t\t%s\t\t%.1f\n", x[i].

35、idnum, x[i].name, x[i].weight); } void display_all_student_data(struct student A[MAX_ARRAY_SIZE], int N) { int i; printf("ID\t\tName\t\tWeight\n"); for(i = 1; i <= N; i++) { printf("%d\t\t%s\t\t%.1f\n", A[i].idnum, A[i].name, A[i].weight); } } 執

36、行範例 Please enter the ID for searching the student: 159 ID Name Weight 201 Mary 60.4 159 Peter 81.2 163 Kelly 76.6 200 Gloria 62.8 Data Found. ID Name Weight 159 Peter 81.2 解釋 [主程式] 1. 首先打開學生資料檔案然後呼叫副程式read_all_student_data將資料讀入學生資料陣列中。 2. 讀入所要尋找的學生學號至變數ta

37、rget中。 3. 呼叫副程式search找出學生資料陣列中學號為target的所在位置。 4. 輸出找到的學生資料。如未找到,則顯示學生資料不存在。 5. 因為輸出有關找到或沒有找到,我們僅僅輸出結果到螢幕上。 [副程式] int read_all_student_data(struct student A[MAX_ARRAY_SIZE], FILE *fp); 同範例10-1,將打開好的檔案指標傳入,此副程式則會將存在裡面的學生資料,一筆一筆讀至陣列中。注意,一旦return,就等於結束副程式。 void display_all_student_data(struct

38、 student A[MAX_ARRAY_SIZE], int N); 將所有學生資料陣列的資料(學號(id)、姓名(name)、體重(weight)),及裡面的資料的數目(N)輸出至螢幕上。 void display_student_data(struct student x[MAX_ARRAY_SIZE],int i); 將第i筆學生的資料輸出至螢幕上。 void search(struct student A[MAX_ARRAY_SIZE], int target_id_num, int N); 從學生資料陣列的第1個位置開始檢查,若學號與所要找尋的相符,即列印出該筆學

39、生資料。若搜尋完學生資料陣列而無相符的資料時,則顯示無此資料。 例題10-3 求學生體重的平均值 例題10-2中學生的體重平均值是(79.1+60.3+81.4+76.6+62.3)/6=71.9。 這個程式和例題10-3的主程式非常相似,我們就略去它的流程圖。 副程式的流程圖如圖10-5 圖10-5 以下是程式.。 程式 10-3 #include #define MAX_ARRAY_SIZE 256 #define STUDENT_DATA_FILE_NAME "student.txt" struct studen

40、t { int idnum; char name[20]; float weight; }; int read_all_student_data(struct student A[MAX_ARRAY_SIZE], FILE *fp); void display_all_student_data(struct student A[MAX_ARRAY_SIZE], int N); void ave(struct student A[MAX_ARRAY_SIZE], int N); void main(void) { FILE *stud

41、ent_data_fp; struct student sdata[MAX_ARRAY_SIZE]; int num_of_student; int i; student_data_fp = fopen(STUDENT_DATA_FILE_NAME, "r"); /* Read the student data from file to array */ if( student_data_fp != NULL ) { num_of_student = read_all_student

42、data(sdata, student_data_fp); fclose(student_data_fp); if(num_of_student==0) { printf("There is no student data in the input file."); } else { display_all_student_data(sdata, num_of_student); ave(sdata, num

43、of_student); } } else { printf("Student data file doesn't exist.\n"); } /* Program ends here */ } int read_all_student_data(struct student A[MAX_ARRAY_SIZE], FILE *fp) { int i; i = 0; while(i < MAX_ARRAY_SIZE)

44、{ if( !feof(fp) ) { fscanf(fp,"%d %s %f", &A[i+1].idnum, A[i+1].name, &A[i+1].weight); if(A[i+1].idnum!=0) { i++; } } else { return i; } } ret

45、urn i; } void ave(struct student A[MAX_ARRAY_SIZE], int N) { int i; float x; float ave; float sum; for(sum = 0, i = 1; i <= N; i++) { x = A[i].weight; sum = sum + x; } ave = sum / N; printf("The average weight is %

46、1f\n", ave); } void display_all_student_data(struct student A[MAX_ARRAY_SIZE], int N) { int i; printf("ID\t\tName\t\tWeight\n"); for(i = 1; i <= N; i++) { printf("%d\t\t%s\t\t%.1f\n", A[i].idnum, A[i].name, A[i].weight); } } 執行範例 ID Name Weigh

47、t 109 John 79.1 201 Mary 60.3 159 Peter 81.4 163 Kelly 76.6 200 Gloria 62.3 The average weight is 71.9 解釋 [主程式] 1. 首先打開學生資料檔案然後呼叫副程式將資料讀入學生資料陣列中。 2. 呼叫副程式算出學生資料陣列中的平均體重,算出結果後列印至螢幕上。 [副程式] int read_all_student_data(struct student A[MAX_ARRAY_SIZE], FILE *fp); void display_a

48、ll_student_data(struct student A[MAX_ARRAY_SIZE], int N); 請參閱程式10-2的解釋。 void ave(struct student A[MAX_ARRAY_SIZE], int N); 從學生資料陣列的每一筆資料中,將體重取出存放至一臨時變數,之後將加總到變數中。全部做完後,將除以學生資料的筆數,即可以得到學生資料的平均體重。 例題10-4 利用structure新增資料 假設我們仍然利用以上幾個例子中所定義的structure,而要加入一筆學生資料,我們必需先查一下這位學生的學號是否已經存在。如果已經存在

49、就不能加入。如果存在,就將新增的資料寫入原來的檔案之中。 我們假設原來的資料存在一個叫做student.txt的文字檔案中,新增的資料要放入這個檔案的末端,而新資料是由鍵盤輸入的。 我們的主程式必需要有兩個陣列,兩個都是的資料結構,其中一個addedstudent是為了存放所新增學生的資料,另一個sdata為了存放原來學生的資料。 主程式所呼叫的副程式,叫做,的功能是檢查新增學生的學號有沒有和任何一位原有學生的學號相同,如果有就回傳0,否則,回傳1。 主程式的流程圖如圖10-6 圖10-6 副程式的流程圖如圖10-7。 圖10-7

50、 以下是程式.。 程式 10-4 #include #define MAX_ARRAY_SIZE 256 #define STUDENT_DATA_FILE_NAME "student.txt" struct student { int idnum; char name[20]; float weight; }; int read_all_student_data(struct student A[MAX_ARRAY_SIZE], FILE *fp); void read_new_student_data(

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服