結構與聯(lián)合 一.選擇題 1.設有定義“struct {int x,;int y,;} d[2]={{1,3},,{2,, 7}};”,,則 printf(“%d\n”,, d[0].y/d[0].x*d[l].x);的輸出是( ) ①0 ②l ③3 ④6
2.設有定義“enum term { my,, your=4,, his, her=his+10},;”,,則printf(“%d,%d,,%d,,%d\n”,my,, your,, his, her),;的輸出是( ) ①0,,l,2,,3 ②0,,4,0,,10 ③0,,4,5,,15 ④1,,4,5,15
3.以下對枚舉類型名的定義中,,正確的是() ①enum a ={one,,two,three},; ② enum a{a1,, a2,a3},; ③enum a ={‘1’,,‘2’,‘3’},; ④ enum a {“one”,,“two”,“three” },;
4.若有如下定義,,則 printf(“%d\n”, sizeof(them)),;的輸出是( ) typedef union { long x[2],;int y[4];char z[8],;} MYTYPE,;MYTYPE them; ①32 ②16 ③8 ④24
5設有以下說明和定義: typedef union { long i,; int k[5],; char c; } DATE,; struct date { int cat,; DATE cow; double dog,; } too,; DATE max; 則下列語句的執(zhí)行結果是( ) printh(“%d”,,sizeof(struct date)+sizeof(max)),; ① 26 ② 30 ③ 18 ④ 8
6.根據下面的定義,能打印出字母M的語句是( ) struct person {char name[9],; int age; },; struct person c[10] = {{“John”,,17 },{“Paul”,19 },,{“Mary”,,18 },{“Adam”,,16 }},; ① printf(“%c”, c[3].name),; ② printf(“%c”,, c[3].name[1] ); ③printf(“%c”,,c[2].name[1]),; ④printf(“%c”,c[2].name[0] ),;
7.設有如下定義,,則對data中的a成員的正確引用是( ) struct sk{int a;float b,;} data,,*p= & data; ①(*p).data.a ②(*p).a ③ p->data.a ④ p.data.a
二.填充題 1.運算符“.”稱為__________運算符,,運算符“ -> ”稱為__________運算符,。
2.設有定義“struct {int a; float b,; char c,;} abc,*p_abc=&abc,;”,,則對結構體成員a的引用方法可以是abc_________a和p_abc___________a.
3.若有以下說明和定義語句,則變量w在內存中所占的字節(jié)數是__________. union aa {float x,;float y,; char c[6]; },; struct st { union aa v,; float w[5]; double ave,; } w,;
三. 程序分析題 1.閱讀下列程序,寫出運行結果,。(字符0的ASCII碼為十六進制的30) main() { union { char c,; char i[4],; } z; z.i[0]= 0x39,;z.i[1]= 0x36,; printf(“%c \n”, z.c),; }
2.閱讀下列程序,,寫出程序的運行結果。 main () { struct student { char name[10],; float k1,; float k2; } a[2]={ {“zhang”,, 100,,70} ,{“wang”,,70,,80 } },* p=a,; int i,; printf(“\nname:%s total=%f”,p ->name,,p -> k1+p -> k2),; printf(“\nname:%s total=%f”,a[l].name,, a[1].k1+a[l].k2),; }
3. 閱讀下列程序,寫出程序的運行結果,。 main ( ) { enum em { em1=3,, em2=l, em3 },; char * aa[] = {“AA”,,“BB”,“CC”,,“DD” } ,; printf(“%s%s%s\n”,aa[em1],,aa[em2],, aa[em3] ); } }
四. 程序設計題 1.用結構體存放下表中的數據,,然后輸出每人的姓名和實發(fā)工資( 基本工資+浮動工資-支出),。 姓名 基本工資(元) 浮動工資(元) 支出(元) Li 220.00 300.00 90.00 Xia 370.00 180.00 60.00 Wang 620.00 0.00 70.00
2.編一個程序,,輸入10個職工的編號,、姓名,、基本工資、職務工資,,求出其中“基本工資十職務工資”最少的職工姓名并輸出,。
3.編一個程序,輸入10個學生的學號,、姓名,、3門課程的成績,求出總分最高的學生姓名并輸出,。
4.編一個程序,,輸入下列學生成績表中的數據,并用結構體數組存放,,然后統(tǒng)計并輸出三門課程的名稱和平均分數,。 name foxbase pascal c wang 98.0 87.0 77.0 qian 90.5 91.0 88.0 sun 74.0 77.5 66.5 li 84.5 64.5 55.0
答案解析 1.④「解」結構數組d有兩個結構元素,每個結構又由兩個整型成分組成,,初始化后,,d[0].x=1,d[0].y=3,,d[1].x=2.所以表達式d[0].y/d[0].x* d[l].x的值是 6.所以正確解答是④,。
2.③「解」按枚舉類型定義的規(guī)定,枚舉類型team的枚舉常量對應的整數分別是my=0,、your=4,、his=5、her=15.所以語句輸出0,,4,,5,15.正確解答是③,。
3.②「解」枚舉類型定義的句法是: enum 枚舉類型名 {枚舉類型常量1,,枚舉類型常量2,……},; 其中枚舉類型常量都是互不相同的標識符,。所以定義enum a {a1,a2,,a3 },;是一個正確的定義。任何在枚舉類型名之后接上 =,,或用字符常量,,或用字符串常量作為枚舉類型常量都是不正確的定義,。解答應是②。
4.③「解」共用型變量的成分是覆蓋存儲,,為共用型變量分配存儲時,,以其中需要最多存儲字節(jié)的成分進行分配。設long型數據占4個字節(jié),、int型數據占2個字節(jié),。共用型MYTYPE有三個成分,第一個成分是有兩個long型元素的數組,,它需要8個字節(jié),;第二個成分是有4個int型元素的數組,它也需要8個字節(jié),;第三個成分是有8個字符元素的數組,,也是8個字節(jié)。所以MYTYPE類型的共用型變量只需要8個字節(jié),。正確解答是③,。
5.②「解」設long型數據占4個字節(jié)、int型數據占2個字節(jié),,double數據占8個字節(jié),。共用型DATE有三個成分:long型成分i,有五個int型元素的數組k,,char型成分 c. 所以 DATE類型的變量需要10個字節(jié),。結構類型date有三個成分:int型成分cat,DATE共用類型cow,, double型成分dog. 所以結構類型 date需要20個字節(jié),。所以表達式 sizeof(struct date)+sizeof(max)的值是30. 正確解答是②。
6.④「解」結構類型struct person有兩個成分:九個元素的字符數組name和一個基本整型age元素類型為 struct person的數組c有10個元素,,其中前四個元素被設定了初值,。在已設定初值的元素中,只有c[2].mame[0]的值是字符M. 其余元素及元素的成分都不是字符M,。正確解答是④,。
7.②「解」結構變量data有兩個成分a和b.結構指針變量p指向結構變量data. 引用結構變量data的成分a有兩種方法:一是直接由變量data引用其自己的成分a,寫成data.a,;二是通過指針變量p. 引用它所指的結構的成分a,,這又有兩種寫法,分別是p -> a和(*p).a.正確解答是②,。
二.填空題 1.「解」引用結構變量或共用型變量的成分用成員運算符‘.’,,若某指針指向一個結構變量或共用型變量,通過指針引用它所指變量的成分用指向成員運算符‘ -> ’,。
2.「解」若有結構變量abc有成分a,,并有指針p_abc指向結構變量abc,,則引用變量abc成分a的標記形式有abc.a和p_abc ->a.
3.「解」共用型aa有三個成分,一個是float型成分x,,一個是float型成分y,,再一個是有六個元素的字符數組。若float型數據占4個字節(jié),,則類型aa數據要占用6個字節(jié),。結構變量w有三個成分,一個是共用型成分aa,,要占用6個字節(jié);一個是有5個float型元素的數組w,,要占用20個字節(jié),;再一個是double型的ave. 若doube型數據要8個字節(jié),則結構變量w要占用34個字節(jié),。
三.程序分析題 1.「解」共用型變量z有兩個成分,,一個是字符型的c,另一個是有4個字符的數組i. 由于共用型的成分是覆蓋存儲,,成分c的內容也是成分i的首元素,。程序給z的i成分的首元素置十六進制代碼0x39,即十進制數57. 數57是字符‘9’的ASCII代碼,。用字符輸出格式,,輸出該變量的值,將輸出字符‘9’ .
2.「解」結構數組a 有兩個元素,,每個元素有三個成分:10個元素的字符數組和兩個類型為float的成分k1,、k2.結構指針變量p指向結構數組a的首元素。其中初始化使a的兩個元素分別有值如下: a[0].name=“zhang”,,a[0].k1= 100.0,,a[0].k2=70.0,a[1].name=“wang”,,a[l].k1=70.0,, a[1].k2 =80.0.所以程序運行后輸出: name:zhang total = 170.000000 name: wang total= 150.000000
3.「解」由枚舉類型測的定義知,枚舉類型常量em1的值是3,,枚舉類型常量em2的值是1,,枚舉類型常量em3的值是2. 所以程序運行后輸出: DD BB CC
四. 程序設計題 1.用結構體存放下表中的數據,然后輸出每人的姓名和實發(fā)工資( 基本工資+浮動工資-支出),。 姓名 基本工資(元) 浮動工資(元) 支出(元) Li 220.00 300.00 90.00 Xia 370.00 180.00 60.00 Wang 620.00 0.00 70.00 「解」程序定義struct person結構類型,,包含人的姓名(<20個字符)、基本工資,、浮動工資和支出,,用這個struct person結構類型定義數組,。程序首先輸入人數n(<100),再輸入n人的信息,,最后輸出各人的姓名和實發(fā)金額,。程序如下: # include<stdio.h> #include<string.h> # define N 100 struct person { char name[20] ; float base,; float ds,; float pay; } person[N],, *p,; void main () { int n; float d,; char buf[120],; printf(“輸入n(<%d)! \n”,,N),; do { scanf(“%d”, &n),; if(n>0 && n<N)break,; printf(“輸入n不合理! 請重新輸入,! \n” ),; } while(1); printf(“輸入%d個人的姓名,、基本工資,、浮動工資和支出 \n”, n),; for(p=person; p<person+n; p++) { scanf(“%s”,, buf); strncpy( p -> name,, buf,, 19); scanf(“%f”,, &d),; p -> base=d; scanf(“%f”,,&d),; p -> ds=d; scanf(“%f”, &d ),; p -> pay= d,; } for(p = person; p< person+n,; p++) printf(“%s %.2f\n”,,p-> name,p->base+p->ds-p-> pay),; }
2.編一個程序,,輸入10個職工的編號、姓名,、基本工資,、職務工資,求出其中“基本工資十職務工資”最少的職工姓名并輸出,。 |解」類似上一程序,,直接給出程序如下: # include<stdio.h> #include<string.h> # define N 10 struct person { char no[10]; char name[20],; float base1; float base2,; } person[N],, *p, *minp,; void main () { float d,; char buf[120]; printf(“輸入%d個人的編號,、姓名,、基本工資、職務工資 \n”,, N),; for(p=person; p<person+N,; p++) { scanf(“%s”,, buf); strncpy(p -> no,,buf,,9); scanf(“%s”,, buf),; strncpy( p -> name, buf, 19),; scanf(“%f”,, &d); p -> base1 =d,; scanf(“%f”,,&d); p -> base2=d,; } for(minp=p=person,; p<person+N; p++) if (p -> basel+p -> base2< minp -> basel+ minp -> base2) minp =p,; printf(“基本工資與職務工資和最少的職工是%s \n”,,minp -> name); printf(“他的基本工資與職務工資和是%.2f \n”,,minp -> basel+ minp -> base2),; }
4.編一個程序,輸入10個學生的學號,、姓名,、3門課程的成績,求出總分最高的學生姓名并輸出,。 「解」類似上一程序,,直接給出程序如下: # include<stdio.h> # include<string.h> # define N 10 struct stu { char no[10]; char name[20],; I nt score[3],; } students[N],*p,, *maxp,; void main() { char buf[120]; int maxs,; printf(“輸入%d個學生的編號,、姓名、三門課程成績 \n”,, N),; for(p= students;p< students+N,;p++) { scanf(“%s”,, buf); strncpy(p -> no,, buf,, 9),; scanf(“%s”, buf),; strncpy( p -> name,, buf,19),; scanf(“%d%d%d”,,&p -> score[0], &p -> score[1],, &p -> score[2]),; } for(maxp= p =students, maxs=-1,; p< students+N,; p++) if( p -> score[0] + p -> score[1]+p -> score[2]> maxs) { maxp=p; maxs=p ->score[0]+p -> score[1]+p >score[2],; } printf(“最高總分的學生是%s他的總分是 %d \n”,, maxp -> name, maxs),; }
4.編一個程序,,輸入下列學生成績表中的數據,并用結構體數組存放,,然后統(tǒng)計并輸出三門課程的名稱和平均分數,。 name foxbase pascal c wang 98.0 87.0 77.0 qian 90.5 91.0 88.0 sun 74.0 77.5 66.5 li 84.5 64.5 55.0
「解」類似上一程序,直接給出程序如下: # include<stdio.h> # include<string.h> # define N 100 struct stu { char namep[20],; int foxbase; int pascal,; int c,; } students[N], *p,; void main () { int n,, sf, sb,, sc,; char buf[120]; printf(“輸入n(< %d) ,! \n”,, N); do { scanf(“%d”,, &n),; if(n>0 && n<N ) break; printf(“輸入n不合理!請重新輸入! \n”),; } while(1),; printf(“輸入%d個人的姓名、Foxbase成績,、Pascal成績,、C成績 \n”, n),; for( p= students,;p< students+n; p++) { scanf(“%s”,,buf ),; strncpy(p -> name, buf,, 19),; scanf(“%d%d%d”, &p -> foxbase,,&p -> pascal,,&p -> c) } sf=sb=sc =0; for( p=students,; p< students+n,; p++) { sf+= p -> foxbase; sb+= p -> pascal,; sc+= p -> c,; } printf(“Foxbase:%.2f \t Pascal:%.2f \t c:%.2f \n”, (float)sf/n,,(float)sb/n,,(float) sc/n); }
|
|
來自: running_to_you > 《結構與聯(lián)合》