资源描述
太原理工大学13级c语言试验指导书参考答案
试验一 次序
1-3.温度*/编写程序,输入华氏温度(F),按下列公式计算并输出对应摄氏温度(C)。
C = 5/9(F – 32)
#include<stdio.h>
void main()
{
float c,f;
scanf("%f",&f);
c=5.0/9.0*(f-32);
printf("%5.2f\n",c);
}
/*1-4.三角形面积*/编写程序,从键盘输入一个三角形三条边长a、b、c(要求任何两条边边长之和均大于第三条边边长),求该三角形面积。
求三角形面积公式是:
其中:
#include "stdio.h"
#include "math.h"
void main()
{
float a,b,c,s,area;
scanf("%f,%f,%f",&a,&b,&c);
s=1.0/2.0*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("area=%f\n",area);
}
/*1-5两数合并*/编写程序,将两个两位数正整数a、b合并形成一个整数放在c中。
合并方法是:将a数十位和个位数依次放在c数十位和千位上, b数十位和个位数依次放在c数个位和百位上。
比如,当a=45,b=12,运行结果为:c=5241。
#include <stdio.h>
void main()
{
int a,b,c;
printf("Input a,b :");
scanf("%d,%d",&a,&b);
c=(b/10*1);
c+=(a/10*10);
c+=(b%10*100);
c+=(a%10*1000);
printf("The result is:%d\n",c);
}
试验二 选择
必做题
2.1编一程序,使用单分支if语句形式,求a,b,c三个整数中间值。比如:a、b、c值分别为3、4、5,则输出4。
#include <stdio.h>
void main()
{
int a,b,c,t;
printf("Input a,b,c:");
scanf("%d,%d,%d",&a,&b,&c);
if(a>b){t=a;a=b;b=t;}
if(a>c){t=a;a=c;c=t;}
if(b>c){t=b;b=c;c=t;}
printf("中间数 = %d\n", b);
}
2.2有一函数
x (x<1)
y = 2x – 1 (1≤x<10)
3x – 11 (x≥10)
用 scanf函数输入x值(分别取x<1、1~10、≥10三种情况),求y值。
#include <stdio.h>
void main()
{
int x,y;
printf("Input x:");
scanf("%d",&x);
if(x<1)y=x;
else if(x<10) y=2*x-1;
else y=3*x-11;
printf("x= %d,y=%d\n", x,y);
}
2.3编写程序,输入一位学生生日(年:y0、月:m0、日:d0)数据,再输入目前日期(年:y1、月:m1、日:d1)数据,计算并输出该学生实足年纪。
#include <stdio.h>
void main()
{
int y0,m0,d0,y1,m1,d1,nl;
printf("Input 生日(年,月,日):");
scanf("%d,%d,%d",&y0,&m0,&d0);
printf("Input 目前日期(年,月,日):");
scanf("%d,%d,%d",&y1,&m1,&d1);
if(m1>m0||m1= =m0&&d1>=d0)nl=y1-y0;
else nl=y1-y0-1;
printf("年纪 = %d\n", nl);
}
2.4编写程序,定义四个字符变量c1,c2,c3和c4,分别用getchar()函数任意输入四个字母,分别输出其中最大值和最小值。
#include <stdio.h>
void main()
{
char c1,c2,c3,c4,max,min;
printf("Input 四个字符 :");
c1=getchar();c2=getchar();c3=getchar();c4=getchar();
max=min=c1;
if(c2>max)max=c2;
if(c3>max)max=c3;
if(c4>max)max=c4;
min=c2<min?c2:min;
min=c3<min?c3:min;
min=c4<min?c4:min;
printf("max=%c,min=%c\n",max,min);
}
2.5设整型变量a值为正数,请将以下C源程序中if语句形式改写成switch语句形式。
#include <stdio.h>
main()
{ int a;
printf(”a = ”);
scanf(”%d”, &a);
if(a<30) m = 1;
else if(a < 40) m = 2;
else if(a < 50) m = 3;
else if(a < 60) m = 4;
else m = 6;
printf(”m = %d\n”, m);
}
#include <stdio.h>
void main()
{
int a,t,m;
printf("Input a=");
scanf("%d",&a);
if(a>0)
{t=a/10;
switch(t)
{case 0:case 1:case 2:m=1;break;
case 3:m=2;break;
case 4:m=3;break;
case 5:m=4;break;
default:m=6;}
printf("m=%d\n",m);
}
else
printf("a为非正数\n");
}
试验三 循环
必做题
3.1编写程序,计算并输出正整数n全部因子(1和n除外)之和。
#include <stdio.h>
void main()
{
int n,i,s=0,m=0;
printf("Input n:");
scanf("%d",&n);
for(i=2;i<n;i++)
{if(n%i= =0)
{printf("%5d",i);s+=i;m++;}
if(m%10= =0)printf("\n");}
printf("\ns= %d\n", s);
}
3.2编写程序,利用以下所表示简单迭代方法求方程:cos(x)-x=0一个实根。迭代步骤以下:
(1)取x1初值为0.0;
(2)x0=x1,把x1值赋给x0;
(3)x1=cos(x0),求出一个新x1;
(4)若x0-x1绝对值小于0.000001,实施步骤(5),不然实施步骤(2);
(5)所求x1就是方程cos(x)-x=0一个实根。
#include <math.h>
#include <stdio.h>
void main()
{
double x0,x1=0.0;
do
{x0=x1;
x1=cos(x0);
}
while(fabs(x1-x0)>=1e-6);
printf("\nx1= %.2f\n", x1);
}
3.3编写程序,输入一行字符,分别统计出其中大写字母、小写字母、空格和数字个数。
提醒:用以下循环格式处理输入一行字符。
while((c = getchar())!=’\n’) /* 若输入c不是回车符时继续 */
循环体
或:
c = getchar();
while(c !=’\n’) /* 若c不是回车符时继续 */
{
循环体
c = getchar();
}
#include <ctype.h>
#include <stdio.h>
void main()
{
char c;
int n1,n2,n3,n4;
n1=n2=n3=n4=0;
printf("请输入一行字符,以换行结束:");
while((c=getchar())!='\n')
if(isupper(c))n1++;
else if(islower(c))n2++;
else if(isdigit(c))n3++;
else if( c==' ')n4++;
printf("\n大写=:%d,小写: %d,数字: %d,空格: %d,\n", n1,n2,n3,n4);
}
3.4编写程序,在屏幕上输出杨辉三角形。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 1
… … … … …
#include "stdio.h"
#define N 20
void main()
{int i,j,array[N][N]={0},n;
printf("请输入n行:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{array[i][0]=1;array[i][i]=1;}
for(i=2;i<n;i++)
for(j=1;j<i;j++)
array[i][j]=array[i-1][j-1]+array[i-1][j];
printf("杨辉三角形:\n");
for(i=0;i<n;i++)
{ for(j=0;j<=i;j++)
printf("%4d ",array[i][j]);
printf("\n");}
printf("\n");
}
选做题
3.1
#include<math.h>
#include<stdio.h>
void main()
{
float x,,t,sum=1.0,i=1.0,m=1.0;
int s=1;
printf("请输入x:");
scanf("%f",&x);
t=x;
while(fabs(t)>1e-6)
{sum+=t;
s=-s;
i++;
m*=i;
t=s*1.0*pow(x,i)/m;
}
printf("\nx=%f,f(x)=%f\n", x,sum);
}
3.2
#include <math.h>
#include <stdio.h>
main()
{
int i,m,n,k=0,j;
double s;
printf("请输入正整数m,n(m<n):");
scanf("%d,%d",&m,&n);
for(i=m+1;i<n;i++)
{s=sqrt(i);
for(j=2;j<=s;j++)
if(i%j==0)break;
if(j>s){printf("%6d",i);k++;}
if(k%8==0)printf("\n");
}
printf("\n");
}
3.3
#include <stdio.h>
void main()
{
int i,m=2,j,n;
double s=0.0,k=1.0,t;
printf("请输入正整数n:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{t=m/k;
s+=t;
j=m;
m=m+k;
k=j;
}
printf("\n和为:%lf\n",s);
}
3.4
#include "stdio.h"
void main()
{int i;
double h=100.0,h1,s=100.0;
for(i=2;i<=10;i++)
{h1=h/2;
h=h1;
s+=2*h;
}
printf("s=%lf,h=%lf\n",s,h);
}
试验四 数组
必做题
4.1编写程序,将3~n之间全部非素数存入数组array中,然后输出该数组元素。
比如:若n=20,则输出 4,6,8,9,10,12,14,15,16,18,20。
#include <stdio.h>
#include <math.h>
#define N 20
void main()
{int i,array[N],j,m,k=0;
for(i=3;i<=N;i++)
{m=sqrt(i);
for(j=2;j<=m;j++)
if(i%j==0){array[k++]=i;break;}
}
for(i=0;i<=k-1;i++)
printf("%d ",array[i]);
printf("\n");
}
4.2 编写程序,将字符数组str中字符串逆置后输出。
比如:若str字符串为“This is a C programe.”,则输出为“.emargorp C a si sihT”。
#include <stdio.h>
#include <string.h>
#define N 80
void main()
{int i,k;
char str[N],t;
gets(str);
k=strlen(str);
for(i=0;i<k/2;i++)
{t=str[i];str[i]=str[k-1-i];str[k-1-i]=t;}
printf("\n%s\n",str);
}
4.3从键盘输入10个整数,选择一个排序算法,将这些数按从大到小次序排列输出。
#include<stdio.h>
#define N 10
void main()
{int i,j,array[N],m,t;
printf("请输入10个整数:");
for(i=0;i<N;i++)
scanf("%d",&array[i]);
for(i=0;i<N-1;i++)
{m=i;
for(j=i+1;j<N;j++)
if(array[j]>array[m])m=j;
if(m!=i)
{t=array[m];array[m]=array[i];array[i]=t;}
}
for(i=0;i<N;i++)
printf("%d ",array[i]);
printf("\n");
}
4.4计算5×5矩阵主对角线元素和此对角线元素之和。若有下列矩阵,则输出值应该是130。
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
#include <stdio.h>
#define N 5
void main()
{int i,j,array[N][N],s=0;
printf("请输入5×5个整数:");
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&array[i][j]);
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{if(i==j||i+j==N-1)s+=array[i][j];
if(i==j&&i+j==N-1)s+=array[i][j];}
for(i=0;i<N;i++)
{ for(j=0;j<N;j++)
printf("%4d ",array[i][j]);
printf("\n");}
printf("s=%d\n",s);
}
选做题
4.1
#include "stdio.h"
#include "string.h"
#define M 5
void main()
{int i,j,a[M],k,x;
char str[M][80],t[M];
printf("请输入5个字符串:");
for(i=0;i<M;i++)
{gets(str[i]);a[i]=strlen(str[i]);}
for(i=0;i<M-1;i++)
{k=i;
for(j=i+1;j<M;j++)
if(a[j]>a[k])k=j;
if(k!=i){strcpy(t,str[i]);strcpy(str[i],str[k]);strcpy(str[k],t);
x=a[k];a[k]=a[i];a[i]=x;}
}
for(i=0;i<M;i++)
puts(str[i]);
printf("\n");
}
4.2
#include "stdio.h"
#include "string.h"
#define M 80
void main()
{int i,j=0,k=0,a;
char s[M],t[M],w[M];
printf("请输入1个字符串:\n");
gets(s);a=strlen(s);
for(i=0;i<a;i++)
if(!(s[i]>='0'&&s[i]<='9'))t[j++]=s[i];
else w[k++]=s[i];
t[j]='\0';w[k]='\0';
strcat(t,w);strcpy(s,t);
puts(s);
printf("\n");
}
4.3
#include "stdio.h"
#define N 6
void main()
{int i,array[N],t,k;
printf("请输入N个整数:\n");
for(i=0;i<N;i++)
scanf("%d",&array[i]);
k=N%2?N/2+1:N/2;
for(i=0;i<N/2;i++)
{t=array[i];array[i]=array[k+i];array[k+i]=t;}
for(i=0;i<N;i++)
printf("%d ",array[i]);
printf("\n");
}
4.4
#include "stdio.h"
#define N 4
void main()
{int i,j,array[N][N],t;
printf("请输入4×4个整数:\n");
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&array[i][j]);
printf("移动前矩阵:\n");
for(i=0;i<N;i++)
{ for(j=0;j<N;j++)
printf("%4d ",array[i][j]);
printf("\n");}
printf("\n");
for(i=0;i<N;i++)
for(j=0;j<2;j++)
if(j==0){t=array[i][j];array[i][j]=array[i][2-j];array[i][2-j]=t;}
else {t=array[i][j];array[i][j]=array[i][4-j];array[i][4-j]=t;}
printf("移动后矩阵:\n");
for(i=0;i<N;i++)
{ for(j=0;j<N;j++)
printf("%4d ",array[i][j]);
printf("\n");}
printf("\n");
}
试验五 函数
必做题
5.1编写一个判定素数函数 int Isprime(int m)。在主函数中输入一个整数n,然后调用Isprime,假如n是素数,则输出:n is prime! 不然输出:n isn’t prime!
#include <stdio.h>
void main()
{
int n;
printf("请输入正整数n:\n");
scanf("%d",&n);
if(Isprime(n))printf("%d is prime!\n",n);
else printf("%d isn't prime!\n",n);
printf("\n");
}
int Isprime(int m)
{int j;
for(j=2;j<=m/2;j++)
if(m%j==0)break;
if(j>m/2)return 1;
else return 0;}
5.2编写两个函数,分别求两个整数最小公倍数和最大条约数并返回给主函数,两个整数由主函数输入。
#include <math.h>
#include <stdio.h>
int Lowest_common_multiple(int m,int n,int h);
int Greatest_common_divisor(int m,int n);
void main()
{
int m,n,t,p,k;
printf("请输入两个正整数m,n:\n");
scanf("%d,%d",&m,&n);
if(m<n){t=m;m=n;n=t;}
k=Greatest_common_divisor(m,n);
p=Lowest_common_multiple(m,n,k);
printf("最大条约数:%d\n" ,k);
printf("最小公倍数:%d\n" ,p);
printf("\n");
}
int Lowest_common_multiple(int m,int n,int h)
{ return m*n/h;}
int Greatest_common_divisor(int m,int n)
{int r;
while((r=m%n)!=0)
{m=n;n=r;}
return n;
}
5.3编一个函数fun(char s[]),其功效是把字符串中小写字母转换成大写字母,其它字符不变。
#include <stdio.h>
#include <string.h>
#define N 80
void fun(char s[]);
void main()
{int i,k;
char s1[N];
printf("请输入一个字符串:\n");
gets(s1);puts(s1);
k=strlen(s1);
fun(s1);
printf("\n%s\n",s1);
}
void fun(char s[])
{int i;
for(i=0;s[i]!='\0';i++)
if(islower(s[i]))s[i]=s[i]-32;
}
5.4编一函数 void convert(int a[][3]),求3×3矩阵转置矩阵。
比如,原矩阵是:
1 2 3
4 5 6
7 8 9
则转置后矩阵是:
1 4 7
2 5 8
3 6 9
#include <stdio.h>
void convert(int a[][3]);
void main()
{int i,j,array[3][3],s=0;
printf("请输入3×3个整数:\n");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&array[i][j]);
printf("转置前:\n");
for(i=0;i<3;i++)
{ for(j=0;j<3;j++)
printf("%4d ",array[i][j]);
printf("\n");
}
convert(array);
printf("转置后:\n");
for(i=0;i<3;i++)
{ for(j=0;j<3j++)
printf("%4d ",array[i][j]);
printf("\n");
}
printf("\n");
}
void convert(int a[][3])
{int i,j,t;
for(i=0;i<2;i++)
for(j=i+1;j<3;j++)
{t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}
}
选做题
5.1
#include <stdio.h >
#define N 40
void Fibonacci(long a[]);
int fun(int t);
int a[N];
main()
{
int t,k;
printf("请输入正整数t:\n");
scanf("%d",&t);
Fibonacci(a);
k=fun(t);
printf("小于%d最小一个数:%d\n",t,k);
}
int fun(int t)
{int j;
for(j=0;j<N;j++)
if(a[j]>t)break;
return a[j];
}
void Fibonacci(long a[])
{int i;
a[0]=a[1]=1;
for(i=2;i<=N;i++)
a[i]=a[i-2]+a[i-1];
}
5.2
#define N 10
#include <stdio.h>
float averf(float s[],int n);
main()
{
int n,i;
float s[N],av;
printf("请输入10个数组元素:\n");
for(i=0;i<N;i++)
scanf("%f",&s[i]);
printf("请输入n:\n");
scanf("%d",&n);
av=averf(s,n);
printf("\n前%d个数平均:%f\n",n,av);
}
float averf(float s[],int n)
{int j;
float sum=0.0,av;
for(j=0;j<n;j++)
sum+=s[j];
av=sum/n;
return av;
}
5.3
#include "stdio.h"
#define M 4
#define N 4
void fun(int xx[][N],int pp[]);
void main()
{int i,j,xx[M][N],pp[M*N];
printf("请输入4×4个整数:\n");
for(i=0;i<M;i++)
for(j=0;j<N;j++)
scanf("%d",&xx[i][j]);
printf("矩阵:\n");
for(i=0;i<M;i++)
{ for(j=0;j<N;j++)
printf("%4d ",xx[i][j]);
printf("\n");}
fun(xx,pp);
printf("转换后一维数组:\n");
for(i=0;i<M*N;i++)
printf("%4d ",pp[i]);
printf("\n");
}
void fun(int xx[][N],int pp[])
{int i,j;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
pp[4*i+j]=xx[i][j];
}
5.4
#include "stdio.h"
#include "string.h"
#define N 80
void deletechar(char str[],char ch);
void main()
{
char str[N],ch;
printf("请输入一个字符串:\n");
gets(str);
printf("请输入要删除一个字符:\n");
ch=getchar();
deletechar(str,ch);
printf("\n%s\n",str);
}
void deletechar(char str[],char ch)
{int i,j=0;
for(i=0;str[i]!='\0';i++)
if(str[i]!=ch)str[j++]=str[i];
str[j]='\0';
}
试验六 指针
必做题
6.1
#include <stdio.h>
main()
{
int a,b,c,t,*pa=&a,*pb=&b,*pc=&c;
printf("Input a,b,c:");
scanf("%d,%d,%d",&a,&b,&c);
printf("\n排序前:%d,%d,%d\n",a,b,c);
if(*pa>*pb){t=*pa;*pa=*pb;*pb=t;}
if(*pa>*pc){t=*pa;*pa=*pc;*pc=t;}
if(*pb>*pc){t=*pb;*pb=*pc;*pc=t;}
printf("\n从小到大排序:%d,%d,%d\n",a,b,c);
}
6.2
#include "stdio.h"
#include "string.h"
#define N 80
void fun(char *s);
void main(void)
{
char s1[N];
printf("\n请输入一个字符串:\n");
gets(s1);
fun(s1);
printf("\n逆置后:%s\n",s1);
}
void fun(char *s)
{int i,k,t;
k=strlen(s);
for(i=0;i<k/2;i++)
{t=*(s+i);*(s+i)=*(s+k-1-i);*(s+k-1-i)=t;}
}
6.4
#include "stdio.h"
#include "string.h"
#define N 80
void scat(char *s1,char *s2);
void main()
{
char s1[2*N],s2[N];
printf("请输入第一个字符串:\n");
gets(s1);
printf("请输入第二个字符串:\n");
gets(s2);
scat(s1,s2);
printf("输出连接后字符串:\n");
puts(s1);
printf("\n");
}
void scat(char *s1,char *s2)
{int i,k,m;
k=strlen(s1);m=strlen(s2);
for(i=0;s2[i]!='\0';i++)
s1[k+i]=s2[i];
s1[k+m]='\0';
}
6.5
#define N 10
#include <stdio.h>
float averf(int x[],int n,int *max,int *min);
main()
{
int i,x[N],max,min;
float av;
printf("请输入10个数组元素:\n");
for(i=0;i<N;i++)
scanf("%d",&x[i]);
av=averf(x,N,&max,&min);
printf("\n10个数平均:%f,最大:%d,最小:%d\n",av,max,min);
}
float averf(int x[],int n,int *max,int *min)
{int j;
float sum=x[0],av;
*max=*min=x[0];
for(j=1;j<n;j++)
{sum+=x[j];
if(x[j]>*max)*max=x[j];
if(x[j]<*min)*min=x[j];
}
av=sum/n;
return av;
}
选做题
6.1
#include "stdio.h"
#include "string.h"
#define N 80
int fun(char *s1,char *s2);
void main()
{
展开阅读全文