c语言实用教程答案
❶ c语言答案
C语言程序设计复习:
1、理解以下术语的含义:数组、函数、地址 指针 指针变量 直接访问 间接访问、结构体
2、用起泡法对10个数由小到大排序(P134例题)
5、输入10个学生的成绩,分别用函数实现下列功能:
1)计算所有学生的平均分;
2) 计算学生成绩中最高分;
3) 计算学生成绩中最低分;
4) 统计及格学生人数;
5) 查找成绩为指定成绩(如90)记录,如果没有,请给出提示,如果有,请统计满足条件的记录数。
6、有一个已经排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。(P153习题7.4)
7、编写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字字符间空一个空格。如输入1990,应输出“1 9 9 0”。(要求用函数)(P202习题8.8)
8、编写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。(要求用指针,不能使用strlen()函数) (P279习题10.6)
9、编写一个程序,打入月份号,输出该月的英文月名。例如,输入“3”则输出“March”(要求用指针数组)。(P279习题10.18)
10、将一个数组中的值按逆序重新存放。例如,输入的数组顺序为8,6,5,4,1,要求改为1,4,5,6,8。(P153习题7.5)
11、编写一个函数用“起泡法”对输入的10个字符按由小到大顺序排序(要用函数)。(P202习题8.11)
12、将数组a中n个整数按相反顺序存放(要用函数)。(P237例题10.7)
13、输入一行文字,找出其中大写字母、小写字母、空格、数字及其他字符各有多少。(要求用指针实现)(P279习题10.8)
14、编写一个函数,将两个字符串连接(要用自定义函数,不能用strcat函数)。(P202习题8.6)
15、输入3个字符串,按照由小到大的顺序输出。(要求用指针) (P278习题10.2)
16、输入10整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数:1、输入10个数; 2、进行处理; 3、输出10个数(数据对换要求用指针实现)(P278习题10.3)
参考答案:
2、用起泡法对10个数由小到大排序
#include <stdio.h>
void main()
{ int a[10]; int i,j,t;
printf("input 10 numbers :\n");
for (i=0;i<10;i++)
scanf("%d“,&a[i]);
printf(“\n");
for(j=0;j<9;j++)
for(i=0;i<10-j;i++)
if (a[i]>a[i+1])
printf("the sorted numbers :\n");
for(i=0;i<10;i++)
printf(“%d “,a[i]);
}
3、用递归方法求n阶勒让德多项式的值,递归公式为(要求用函数):(P202习题8.13)
pn(x)= 1 n=0
x n=1
((2n-1)*x-pn-1(x)-(n-1)*pn-2(x)/n n>1
3、#include <stdio.h>
void main()
{
int x,n;
float p(int,int);
printf(“input n & x:”);
scanf(“%d,%d”,&n,&x);
printf(“n=%d,x=%d\n”,n,x);
printf(“P%d(%d)=%6.2f\n”,n,x,p(n,x));
}
float p(int n,int x)
{
if(n==0)
return 1;
else if(n==1)
return x;
else
return ((2*n-1)*x*p((n-1),x)-(n-1)*p((n-2),x))/n;
}
4、输入3个整数,按由小到大的顺序输出(要求用指针类型)(P228例题)
4、输入3个整数,按由小到大的顺序输出(要求用指针类型)
#include <stdio.h>
void main()
{
void sort (int*a, int*b,int*c);
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
sort(&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
}
void sort (int *a, int *b,int *c)
{
int tmp;
if (*a>*b)
{
tmp=*a;
*a=*b;
*b=tmp;
}
if (*a>*c)
{
tmp=*a;
*a=*c;
*c=tmp;
}
if (*b>*c)
{
tmp=*b;
*b=*c;
*c=tmp;
}
}
5、输入10个学生的成绩,分别用函数实现下列功能:
1)计算所有学生的平均分;
6) 计算学生成绩中最高分;
7) 计算学生成绩中最低分;
8) 统计及格学生人数;
9) 查找成绩为指定成绩(如90)记录,如果没有,请给出提示,如果有,请统计满足条件的记录数。
#include <stdio.h>
void main()
{
int average(int a[]);
int max(int a[]);
int min(int a[]);
int pass(int a[]);
int search(int a[],int g);
int i,j,g;
int score[10],aver,m1,m2,p,s;
printf("Please input 10 scores:\n");
for(i=0;i<10;i++)
scanf("%d",&score[i]);
printf("\n");
aver=average(score);
m1=max(score);
m2=min(score);
p=pass(score);
printf("平均分为: %d\n",aver);
printf("最高分为: %d\n",m1);
printf("最低分为: %d\n",m2);
printf("及格人数为: %d\n",p);
printf("需要查找吗?\n");
printf("输入1继续查找,输入0退出(1/0):");
scanf("%d",&j);
if(j==1)
{
printf("请输入要查找的分数: \n");
scanf("%d",&g);
s=search(score,g);
if(s==0)
printf("没有满足条件的记录");
else
printf("成绩为%d的学生共有%d名\n",g,s);
}
}
int average(int a[])
{
int i;
int aver,sum=a[0];
for(i=1;i<10;i++)
sum=sum+a[i];
aver=sum/10;
return aver;
}
int max(int a[])
{
int i;
int m=a[0];
for(i=1;i<10;i++)
if(m<a[i])
m=a[i];
return m;
}
int min(int a[])
{
int i;
int m=a[0];
for(i=1;i<10;i++)
if(m>a[i])
m=a[i];
return m;
}
int pass(int a[])
{
int i;
int s=0;
for(i=0;i<10;i++)
if(a[i]>=60)
s++;
return s;
}
int search(int a[],int g)
{
int i;
int s=0;
for(i=0;i<10;i++)
if(a[i]==g)
s++;
return s;
}
6、已有一个已排好次序的数组,要求输入一个数后,按原先排序的规律将它插入数组中。
Void main()
;
int temp1,temp2,number,end,i,j;
printf("初始数组如下:");
for (i=0;i<10;i++)
printf("%5d",a[i]);
printf("\n");
printf("输入插入数据:");
scanf("%d",&number);
end=a[9];
if(number>end)
a[10]=number;
else
{for(i=0;i<10;i++)
{ if(a[i]>number)
{temp1=a[i];
a[i]=number;
for(j=i+1;j<1;j++)
{temp2=a[j];
a[j]=temp1;
temp1=temp2;
}
break;
}
}
}
for(i=0;i<11;i++)
printf("a%6d",a[i]);
}
7、编写一个函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字字符间空一个空格。如输入1990,应输出“1 9 9 0”。
#include <iostream>
void main()
{
void stradd(char str[]);
char str[80];
printf("输入一串数字\n\n");
gets(str);
stradd(str);
printf("\n\n加空格后的字符串\n\n");
puts(str);
}
void stradd(char str[])
{
char a[80];
int i=0,j;
for(j=0;str[j]!='\0';j++)
{
a[i]=str[j];
a[i+1]=' ';
i+=2;
}
a[i]='\0';
for(i=0;a[i]!='\0';i++)
{
str[i]=a[i];
}
str[i]='\0';
}
8、编写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。(要求用指针实现)
#include "stdio.h"
int stringlength( char *str )
{int n;
n=0;
While(*str!=0)
{n++;
str++;
}
Return(n);
}
int main()
{
char str〔100〕,
int len,
printf("Please input a string: "),
scanf("%s".str),
len = stringlength( str ),
printf("The string’s length is %d.".len),
return 0;
}
9、编写一个程序,打入月份号,输出该月的英文月名 n。例如,输入“3”则输出“March”,要求用指针数组处理。
#include <stdio.h>
main()
{ char *month_name[13]={"illegal month","January","February","March","April",
"May","June","July","August","September","October","November","December"};
int n;
printf("Input month: ");
scanf("%d",&n);
if((n<=12)&&(n>=1))
printf("It is %s.\n",*(month_name+n));
else
printf("It is wrong.\n");
}
10、将一个数组中的值按逆序重新存放。例如,输入的数组顺序为8,6,5,4,1,要求改为1,4,5,6,8。
#include <stdio.h>
#define N 5;
void main()
{
int a[N],i,temp;
printf(“enter array a:\n”);
for(i=0;i<N;i++)
scanf(“%d”,&a[i]);
printf(“array a:\n”);
for(i=0;i<N;i++)
printf(“\nNow, array a:\n”);
for(i=0;i<N;i++)
printf(“%4d”,a[i]);
printf(“\n”);
}
11、编写一个函数用“起泡法”对输入的10个字符按由小到大顺序排序(要用函数)。
#include <stdio.h>
void main()
{ char str[80];
void sort(char str[]);
printf("输入一个字符串\n\n");
gets(str);
sort(str);
printf("\n\n字符由小到大排序为:\n\n");
puts(str);
}
void sort(char str[])
{ int i,j;
char temp;
for(i=0;i<strlen(str);i++)
{
for(j=0;j<strlen(str)-i-1;j++)
{
if(str[j]>str[j+1])
{
temp=str[j];
str[j]=str[j+1];
str[j+1]=temp;
}
}
}
}
12、将数组a中n个整数按相反顺序存放(要用函数)。
#include <stdio.h>
void inv(int x[ ],int n)/*形参x是数组名*/
{
int temp,i,j,m=(n-1)/2;
for(i=0;i<=m;i++)
{j=n-1-i;
temp=x[i];x[i]=x[j];x[j]=temp;}
return;
}
void main()
{ int i,a[10]={3,7,9,11,0,6,7,5,4,2};
printf(“转换前的数组为:\n");
for(i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
inv(a,10);
printf(“转换后的数组为:\n");
for(i=0;i<10;i++)
printf("%d,",a[i]);
printf("\n");
}
13、输入一行文字,找出期中大写字母、小写字母、空格、数字及其他字符各有多少?(要求用指针实现)
#include<stdio.h>
#include<string.h>
int main()
{
char str[40];//创建字符串数组
int count[5]=;//创建计数器数组并初始化
printf("Please input a string .\n");
scanf("%s",str);
char *p=str;//指针p指向字符串数组str
int n=strlen(str);//确定输入字符串的长度
for(int i=0;i<n;i++)
{
if(*(p+i)>='A'&&*(p+i)<='Z')
{
count[0]++;//统计大写字母数目
}
else if(*(p+i)>='a'&&*(p+i)<='z')
{
count[1]++;//统计小写字母数目
}
else if(*(p+i)>='0'&&*(p+i)<='9')
{
count[2]++;//统计数字数目
}
else if(*(p+i)=='')
{
count[3]++;//统计空格数目
}
else
{
count[4]++;//统计其他字符数目
}
}
printf("大写字母 小写字母 数字 空格 其他字符:\n");
for(i=0;i<5;i++)
{
printf("%d\t ",count[i]);//打印各统计数目
}
printf("\n\n");
return 0;
}
14、编写一个函数,将两个字符串连接。
#include < stdio.h >
#include<string.h>
void concatenate(char string1[],char string2[],char string[])
{
int i,j;
for(i=0;string1[i]!=’\0’;i++)
string[i]=string1[i];
for(j=0;string2[j]!=’\0’;j++)
string[i+j]=string2[j];
string[i+j]=’\0’;
}
void main()
{
char s1[100],s2[100],s[100];
printf(“input string1:”);
scanf(“%s”,s1);
printf(“input string2:”);
scanf(“%s”,s2);
concatenate(s1,s2,s)
printf(“the new string is %s”,s);
}
15、输入3个字符串,按照由小到大的顺序输出。 (要求用指针实现)
#include <stdio.h>
void main()
{
void sort (int*a, int*b,int*c);
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
sort(&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
}
void sort (int *a, int *b,int *c)
{
int tmp;
if (*a>*b)
{
tmp=*a;
*a=*b;
*b=tmp;
}
if (*a>*c)
{
tmp=*a;
*a=*c;
*c=tmp;
}
if (*b>*c)
{
tmp=*b;
*b=*c;
*c=tmp;
}
}
16、输入10整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数:1、输入10个数; 2、进行处理; 3、输出10个数(数据对换要求用指针实现)
#include <stdio.h>
void input(int number[])
{
Int I;
Printf(“input 10 numbers:”);
For(i=0;i<10;i++)
Scanf(“%d”,&number[i]);
}
void max_min_value(int number[])
{
int *max,*min,*p,temp;
max=min=number;
For(p=number+1;p<number+10;p++)
if(*p>*max)
max=p;
else if(*p<*min)
min=p;
temp=number[0];number[0]=*min;*min=temp;
if(max=number) max=min;
temp=number[9];number[9]=*max;*max=temp;
}
void output(int number[])
{
int *p;
printf(“Now, they are: “);
for(p=number;p<number+10;p++)
Printf(“%d”,*p);
printf(“\n”);
}
void main()
{
int number[10];
input(number);
max_min_value(number);
output(number);
}
❷ 计算机二级C语言选择题及答案(2)
}
printf("%d ",num);
}
程序执行后的输m结果是()。
A.35
B.37
C.39
D.3975
32.以下程序的'输出结果是()。
main()
{char st[20]="hello \";
printf("%d%d ",strlen(st).sizeof(st));
}
A.9 9
B.5 20
C.13 20
D.20 20
33.若有以下的定义:‘int t[3][2];”,能正确表示t数组元素地址的表达式是()。
A.&t[3][2]
B.t[3]
C.t[l]
D.t[2][2]
34.函数fseek(pf,OL,SEEK END)中的SEEK ENE 代表的起始点是()。
A.文件开始
B.文件末尾
C.文件当前位置
D.以上都不对
35.下述程序的输出结果是()。
#include
main()
{ int i;
for(i=l;i<=10;i++)
{if(i*i>=20)&&(i*i<=100))
break;
}
printf("%d ",i*i);
}
A.49
B.36
C.25
D.64
36.若有定义“int b[8],*p=b;”,则p+6表示()。
A.数组元素b[6]的值
B.数组元素b[6]的地址
C.数组元素b[7]的地址
D.数组元素b[o]的值加上6
37.设变量已正确定义,则以下能正确计算f=n!的程序是()。
A.f=0:
for(i=1;i<=n;i++)f*=i:
B.F=1:
for(i=l;i<2n;i++)f*=i:
C.f=l:
for(i=n;i>1;i++)f*=i:
D.f=1;
for(i=n;i>=2;i--)f*=i:
38.下述程序执行的输出结果是()。
#include
main()
{ char a[2][4];
strcpy(a,"are");strcpy(a[1],"you");
a[0][3]=’&’;
printf("%s ",a):
}
A.are&you
B.you
C.are
D.&
39.设x=011050,则x=x&01252的值是()。
A.0000001000101000
B.1111110100011001
C.0000001011100010
D.1100000000101000
40.在“文件包含”预处理语句的使用形式中,当#include后面的文件名用(双引号)括起时,寻找被包含文件的方式是()。
A.直接按系统设定的标准方式搜索目录
B.先在源程序所在的目录搜索,如没找到,再按系统设定的标准方式搜索
C.仅仅搜索源程序所在目录
D.仅仅搜索当前目录
【答案与解析】
1.D。【解析】算法的空间复杂度,是指执行这个算法所需的存储空间。算法所占用的存储空间包括算法程序所占用的空间、输入的初始数据所占用的存储空间、算法执行过程中所需要的额外空间。
2.D。【解析】数据的存储结构是指数据的逻辑结构在计算机存储空间中的存放形式,一种数据结构可以根据需要采用不同的存储结构,用的存储结构有顺序和链式结构。用不同的存储结构,其处理的效率是不同的。
3.D。【解析】所谓的交换排序方法是指借助数据元素之间的互相交换进行排序的一种方法,包括冒泡排序和快速排序,冒泡排序通过相邻元素的交换,逐步将线性表变成有序是一种最简单的交换排序方法。
4.C。【解析】结构化程序设计的原则和方法之一是限制使用GOT0语句,但不是绝对不允许使用GOT0语句。其他三项为结构化程序设计的原则。
5.D。【解析】文件系统所管理的数据文件基本上是分散、相互独立的。相对于数据库系统,以此为基础的数据处理存在3个缺点:数据冗余大、数据的不一致性、程序与数据的依赖性强。
6.C。【解析】面对象的设计方法的基本原理是:使用现实世界的概念抽象地思考问题从而自然地解决问题。它虽强调模拟现实世界中的概念而不强调算法,但是它鼓励开发者在软件开发的过程中从应用领域的概念角度去思考。
7.D。【解析】所谓的后序遍历是指,首先遍历左子树,然后遍历右子树,最后访问根结点,并且在遍历左、右树时,仍然先遍历左子树,然后遍历右子树,最后访问根点。因此,后序遍历二叉树的过程也是一个递归过程。
8.B。【解析】软件的过程设计是指系统结构部件转换成软件的过程描述。
9.A。【解析】①对软,牛开发的进度和费用估计不准确:②用户对已完成的软件系统不满意的现象时常发生;③软件产品的质量往往靠不住;④软件常常是不可维护的;⑤软件通常没有适当的文档;⑥软件成本在计算机系统总成本中所占的比例逐年上升;⑦软件开发生产率提高的速度远远跟不上计算机应用迅速普能及深入的趋势。
10.C。【解析】对象的封装性是指从外面看只能看到对象的外部特性,而对象的内部,其处理能力的实行和内部状态对外是不可见的,是隐蔽的。
11.C。【解析】数据库系统由如下5个部分组成:数据库(DB)、数据库管理系统fDBMS)、数据库管理员(人员)、系统平台之一——硬件平台(硬件)、系统平台之二——软件平台(软件)。其中 DB(DataBase)即数据库,是统一管理的相关数据的集合;DBMS即数据库管理系统,是位于用户与操作系统之间的一层数据管理软件,为用户或应用完程序提供访问DB的方法。由以上可知,选C为正确答案。
12.A。【解析】标识符是由字母、数字或下划线组成,并且它的第一个字符必须是字母或者下划线。B选项int不是表达变量类型的标识符,它不能再用做变量名和函数名。C 选项do是C语言的一个关键字。D选项标识符只能以字母或下划线开始。
13.D。【解析】本题考查逻辑运算符的使用。当“&&”的两个运算对象都是逻辑1时,表达式返回值才是1;“||” 的两个运算对象至少有一个是逻辑1时,表达式返回值也是1,x14.C。【解析】第1个printf函数,格式说明的个数是2,而输出项的个数是3,所以对于多余的输出项k不予输出;第2个printf函数,有两个%说明,第1个%后面的字符要原样输出。本题考查printf函数的格式。①“%x”和“%0”分别表示以十六进制和八进制无符合型输出整型数据(不带前导ox或0);②printf函数中格式说明符之前插入的任何字符都原样输出;③格式说明与输出项的个数,也要相等,如果格式说明的个数少于输出项的个数,则对于多余的输出项不予输出。
15.C。【解析】函数fun(int x,int y)的功能是返回x+y的值。在主函数中,变量a,b,c的初始值分别为1,2,3。因此,逗号表达式“a++,b++,aq b”的值等于5,表达式c++的值为3,调用于函数的表达式为“fun(5,3);”,其返回值等于8。
16.D。【解析】在x=2,y=x+3/2中,3/2=1。2+1= 3,因此表达式的值为3,因为x,y为double型变量,故选择D选项。
17.A。【解析】当x为1时,执行case 1,a自加等于1,因为case 1后没有break,接着执行case 2,此时a的值为2,b自加为1,故选择A选项。
18.D。【解析】本题考梦自增运算符“++”、逻辑与运算符“&&”和逻辑或运算符“||”。自增运算符“++”出现在变量之前,表示先使用变量的值加l,再使用变量的值进行运算;出现在变量之后,表示先使用变量的值进行运算,再使用变量的值加l。当逻辑与运算符“&&’’两边的运算对象都为真时,逻辑表达式的值才为真;当逻辑或运算符“||”只要一个值为1,值就为1。根据运算符的优先级,题中应先计算内层括号中的值。++j是先自加后运算,因此运算时j的值等于3,所以表达式++j=3成立,即表达式的值为1;1与任何数都为进行或(||)运算,结果都为1,因此k=3的表达式i++是先运算后自加,因此运算时i为1,所以i++=1成立,自加1后i=2。if语句的条件为真即“1”,所以输出i、j、k的值分别是2,3,3。
19.A。【解析】本题考查switch语句。当i一1时,执行case 1,因为没有遇到break语句,所以依次往下运行,“a=a+ 2=2,a=a+3=5”;当i=2时,执行case 2,因为没有遇到break语句,所以依次往下执行,“a=a+2=7,a=a+3= 10”;当i=3时,执行case 3,a=a+1=11,因为没有遇到break语句,所以依次往下运行,a—a+2—13,a—a+3一l6:当i=4时,执行default,a=a+3=19,结束循环。
20.C。【解析】只有当3个if条件同时成立,即能够同时被2、3、7整除时,才输出i的值,而从0到50能够同时被2、3、7整除的数只有42,故选择C选项。
21.A。【解析】循环的作用是求行下标从1到2列下标从0到i的元素之和,即s=a[1][0]+a[1][1]+a[2][0]+a [2][1]+a[2][2]=3+4+5+6+0=18。
22.A。【解析】在程序语句中,k的初始值为5,进行第l次while循环后,k自减1为4,非0,执行循环体里的printf语句,输出k,此时k的值变为1。程序执行第2次循环时,k 自减1变为0,为假,退出while循环语句。所以程序的最后结果为1。
23.A。【解析】通过地址来引用数组元素的方法有下列5种:
(1)a[i][j];(2)*(a[i]+j);(3)*(*(a+j)+i);(4)* (a[i][j]);(5)(&aE0][0]q-3*i+j)。故A正确。
24.C。【解析】选项A、B的空间不够;字符串存储要有结束符’