2019-2010-2-《高階語言程式設計(C)》期末考試-題
一.判斷題:
1-1
區域性變數如果沒有指定初值,則其初值不確定。 (2分)
T
F
1-2
實參向形參進行數值傳遞時,數值傳遞的方向是單向的,即形參變數值的改變不影響實參變數的值。(2分)
T
F
1-3
檔案的讀函式是從輸入檔案中讀取資訊,並存放在記憶體中。(2分)
T
F
1-4
C語言中,編譯預處理後,所有的符號常量名和巨集名都用相應的字串替換。(2分)
T
F
1-5
用typedef可以增加新型別。(2分)
T
F
答案:
T T T T F
二.單選題:
2-1
以下陣列定義中錯誤的是( )。(2分)
A.
int x[][3]={ 0};
B.
int x[2][3]={{1,2},{3,4},{5,6)};
C.
int x[][3]={{1,2,3},(4,5,6)};
D.
int x[2][3]={1,2,3,4,5,6};
2-2
以下不正確的賦值或賦初值的方式是( )。(2分)
A.
char str[]="string";
B.
char str[7]={'s', 't', 'r', 'i', 'n', 'g'};
C.
char str[10];str="string";
D.
char str[7]={'s', 't', 'r', 'i', 'n', 'g', ’\0’};
2-3
以下列舉型別的定義中,正確的是()。(2分)
A.
enum a={one,two,three};
B.
enum a{one=9,two=-1,three};
C.
enum a={"one","two","three"};
D.
enum a{"one","two","three"};
2-4
若定義pf為指向float型別變數f的指標,下列語句中__是正確的。(2分)
A.
float f, *pf = f;
B.
float f, *pf = &f;
C.
float *pf = &f, f;
D.
float f, *pf =0.0;
2-5
在單鏈表中,若p所指的結點不是最後結點,在p之後插入s所指結點,則執行( )(2分)
A.
s->next=p; p->next=s;
B.
s->next=p->next; p=s;
C.
s->next=p->next; p->next=s;
D.
p->next=s; s->next=p;
答案:
B C B B C
三.函式題:
遞迴求Fabonacci數列 (15分)
本題要求實現求Fabonacci數列項的函式。Fabonacci數列的定義如下:
f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。
函式介面定義:
int f( int n );
裁判測試程式樣例:
#include <stdio.h>
int f( int n );
int main()
{
int n;
scanf("%d", &n);
printf("%d\n", f(n));
return 0;
}
/* 你的程式碼將被嵌在這裡 */
輸入樣例:
6
輸出樣例:
8
參考答案:
int f( int n )
{
do
{
if(n==0)
{
return 0;
break;
}
else
if(n==1)
{
return 1;
break;
}
else
{
return(f(n-2)+f(n-1));
}
}while(n>=0);
}
四.程式設計題:
4-1 成績轉換 (15分)
本題要求編寫程式將一個百分制成績轉換為五分製成績。轉換規則:
大於等於90分為A;
小於90且大於等於80為B;
小於80且大於等於70為C;
小於70且大於等於60為D;
小於60為E。
輸入格式:
輸入在一行中給出一個整數的百分制成績。
輸出格式:
在一行中輸出對應的五分製成績。
輸入樣例:
90
輸出樣例:
A
參考程式碼:
#include <stdio.h>
#include <math.h>
main()
{
int a;
scanf("%d",&a);
if(a>=90)
printf("A");
else
if(a>=80)
printf("B");
else
if(a>=70)
printf("C");
else
if(a>=60)
printf("D");
else
printf("E");
}
4-2 輸出100~200之間素數 (15分)
求出100~200之間的全部素數,每行輸出8個數,每個數寬度為5列。
輸出格式:
每行輸出8個素數數,每個素數寬度為5列。
輸出樣例:
101 103 107 109 113 127 131 137
139 149 151 157 163 167 173 179
181 191 193 197 199
參考程式碼:
#include <stdio.h>
#include <math.h>
int sushu(int a);
int sushu(int a)
{
int i,flag=1;
if(a==1)
return 0;
else
{
for(i=2;i<=sqrt(a);i++)
{
if(a%i==0)
{
flag=0;
break;
}
}
if(flag==1)
return 1;
else
return 0;
}
}
main()
{
int i,j=0;
for(i=100;i<=200;i++)
{
if(sushu(i)==1)
{
printf("%5d",i);
j++;
if(j==8 || j==16||j==24)
printf("\n");
}
}
}
4-3 交換最小值和最大值 (15分)
本題要求編寫程式,先將輸入的一系列整數中的最小值與第一個數交換,然後將最大值與最後一個數交換,最後輸出交換後的序列。
注意:題目保證最大和最小值都是唯一的。
輸入格式:
輸入在第一行中給出一個正整數N(≤10),第二行給出N個整數,數字間以空格分隔。
輸出格式:
在一行中順序輸出交換後的序列,每個整數後跟一個空格。
輸入樣例:
5
8 2 5 1 4
輸出樣例:
1 2 5 4 8
參考程式碼:
#include <stdio.h>
#include<math.h>
int main()
{
int a[10],b[10],n,i,j,k,t;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[k]<a[j])
k=j;
}
if(k!=i)
{
t=a[k];
a[k]=a[i];
a[i]=t;
}
}
for(i=0;i<n;i++)
{
if(a[n-1]==b[i])
{
t=b[0];
b[0]=b[i];
b[i]=t;
}
}
for(i=0;i<n;i++)
{
if(a[0]==b[i])
{
t=b[n-1];
b[n-1]=b[i];
b[i]=t;
}
}
for(i=0;i<n;i++)
{
printf("%d ",b[i]);
}
}
4-4 計算職工工資 (20分)
給定N個職員的資訊,包括姓名、基本工資、浮動工資和支出,要求編寫程式順序輸出每位職員的姓名和實發工資(實發工資=基本工資+浮動工資-支出)。
輸入格式:
輸入在一行中給出正整數N。隨後N行,每行給出一位職員的資訊,格式為“姓名 基本工資 浮動工資 支出”,中間以空格分隔。其中“姓名”為長度小於10的不包含空白字元的非空字串,其他輸入、輸出保證在單精度範圍內。
輸出格式:
按照輸入順序,每行輸出一位職員的姓名和實發工資,間隔一個空格,工資保留2位小數。
輸入樣例:
3
zhao 240 400 75
qian 360 120 50
zhou 560 150 80
輸出樣例:
zhao 565.00
qian 430.00
zhou 630.00
參考程式碼:
#include<stdio.h>
struct str
{
char name[20];
float ji;
float fu;
float zhi;
float shi;
}t[10000];
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{ scanf("%s %f %f %f",t[i].name,&t[i].ji,&t[i].fu,&t[i].zhi);
t[i].shi=t[i].ji+t[i].fu-t[i].zhi;
}
for(i=0;i<n;i++)
{
printf("%s %.2f\n",t[i].name,t[i].shi);
}
}