资源描述
C语言程序设计案例教程(含实验)
设计性实验的程序参考答案
实验项目一 C程序的编辑、编译、连接和运行
题目:编写程序,要求屏幕上显示如下信息:
***********************
This is a C program .
***********************
程序:
#include <stdio.h>
void main()
{
printf(“***********************\n”);
printf(“This is a C programn .\n”);
printf(“***********************\n”);
}
实验项目二 数据类型、运算符、表达式
题目
(1)程序填空:输入1 个实数x,计算并输出其平方根(保留1 位小数)。
填空
1. double x,root;
2. root=sqrt(x);
(2)输入一个大写英文字母,输出相应的小写字母。
填空
1. ch=ch+32;
实验项目三 顺序结构程序设计
题目
(1)编写程序,输入三角形的三边长a、b、c,求三角形面积area。
程序代码:
#include <stdio.h>
#include <mach.h>
main()
{
float a,b,c,s,arer;
printf(" 请输入三角形的三个边a,b,c:\n");
scanf("%f,%f,%f",&a,&b,&c);
s=1.0/2*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("三角形的边为a=%7.2f, b=%7.2f, c=%7.2f\n",a,b,c);
printf("三角形的面积area=%7.2f\n ",area);
(2)设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。
程序代码:
#include <stdio.h>
main()
{
float h,r,l,s,sq,vq,vz;
float pi=3.1415926;
printf(" 请输入圆半径 r,圆柱高 h: ");
scanf("%f,%f",&r,&h);
l=2*pi*r;
s=r*r*pi;
sq=4*pi*r*r;
vq=4.0/3.0*pi*r*r?*r;
vz=pi*r*r*h;
printf("圆周长为:l=%6.2f\n",l);
printf("圆面积为:s=%6.2f\n",s);
printf("圆球表面积为:sq=%6.2f\n",sq);
printf("圆球体积为:vq=%6.2f\n",vq) ;
printf("圆柱体积为:vz=%6.2\n ",vz);
(3)分别用getchar函数和scanf函数读入2个字符给变量c1、c2,然后分别用putchar函数和printf函数输出这两个字符。
程序代码:
#include <stdio.h>
main()
{
char c1,c2;
printf(" 请输入两个字符 c1,c2:");
c1=getchar();
c2=getchar();
printf("用putchar语句输出结果为:");
putchar(c1);
putchar(c2);
printf(" 请用scanf函数输入两个字符 c1,c2:");
scanf("%c %c\n",&c1,&c2);
printf("用printf语句输出结果为:");
printf("c1=%c c2=%c\n",c1,c2);
}
实验项目四 分支结构程序设计
题目
(1)程序填空。输入四个整数,输出其中的最小值。
填空:
min=a;
if(b<min) min=b;
else if(c<min)min=c;
else if(d<min)min=d;
(2)计算如下函数Y的值。
Y=
{
X (X<1)
2X-1 (1≤X<10)
3X-11 (X>=10)
程序代码:
#include <stdio.h>
main()
{
int x,y;
printf(" 请输入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",x,y);
}
(3)给出一个百分制成绩,输出对应的等级分。共分A、B、C、D、E五个等级。90分以上为A,81-89分为B,70-79分为C,60-69分为D,60分以下为E。要求分别用if语句和switch语句实现。
程序代码:
① 用 if-else 语句实现:
#include <stdio.h>
main()
{
int g;
Loop: printf(" 请输入g:");
scanf("%d",&g);
if(g<0||g>100) goto Loop;
if(g>90) printf("A");
sele if(g>80) printf("B");
else if(g>70) printf("C");
else if(g>60) printf("D");
else printf("E");
}
② 用 switch 语句实现:
#include <stdio.h>
main()
{
int g;
Loop: printf(" 请输入g:");
scanf("%d",&g);
if(g<0||g>100) goto Loop;
switch(g/10)
{
case 10:
case 9: printf("A");
case 8: printf("B");
case 7: printf("C");
case 6: printf("D");
default: printf("E");
}
}
(4)编写程序,输入奖金数a,计算并输出税率、应缴税款和实得奖金数。
奖金 税率
a<500 0.00
500≤a<1000 0.05
1000≤a<2000 0.08
2000≤a<5000 0.10
5000≤a 0.15
提示:a=奖金数 rate=税率值 tax=应缴税款 profit=实得奖金数。
计算公式: tax = a* rate , profit= a – tax
程序代码:
#include <stdio.h>
main()
{
float a,rate,tax,profit;
scanf("%f ",&a);
if(a<500) rate=0.0;
else if (a<1000) rate=0.05;
else if (a<2000) rate=0.08;
else if (a<5000) rate=0.1;
else rate=0.15;
tax= a*rate;
profit=a-tax;
printf(" rate=%10.2f,tax=%10.2f, profit=%10.2f\n", rate, tax, profit);
}
实验项目五 循环结构程序设计
题目
(1)猴子吃桃子。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第2天早上将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。到第10天早上想再吃时,只剩下一个桃子。问第一天共摘多少个桃子?(要求使用While循环语句实现)。
算法提示
设 total:桃子的总数
x1 :前一天的桃子数
x2 : 后一天的桃子数
day: 天数
计算公式: x1=(x2+1)*2 第1天的桃子数是第2天桃子数加1后的2倍。
程序代码:
#include <stdio.h>
void main()
{
int x1,x2,day,total;
day=9;
x2=1;
while(day>0)
{ x1=(x2+1)*2;
x2=x1;
day=day-1;
}
Total=x1;
printf(" total=%d\n", x1);
}
(2)求200—300之间的素数。
程序代码:
#include <stdio.h>
void main()
{
int m,n,flag;
printf("\n The primers from 200 to 300 is: \n");
for(n=201;n<300;n+=2)
{ flag=1;
for(m=2;m<=n/2;m++)
if(n/m==0)
{ flag=0;
break;
}
if(flag==0)
continue;
printf("%d ",n);
}
printf("\n");
}
(3)程序填空
① 求1-1/2+1/3-1/4+⋯⋯,输入1 个正整数 n(n<=100),计算并输出1-1/2+1/3-1/4+⋯⋯的前n 项和(保留3 位小数)。
程序代码:
#include <stdio.h>
void main( )
{
int i, n, flag;
float sum;
scanf("%d", &n);
/*----以下为所填语句------*/
sum=0;
flag=1;
for(i=1;i<=n;i++)
{ sum+=flag*1.0/i;
flag=-flag;
}
printf("%.3f\n", sum);
}
② 统计字符。输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。
程序代码:
#include <stdio.h>
void main( )
{
int ri, repeat;
int blank, digit, letter, other;
char c;
scanf("%d", &repeat);
getchar();
for(ri=1; ri<=repeat; ri++)
{
c = getchar();
/*----以下为所填语句------*/
blank=digit=letter=other=0;
while(c!='\n')
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z') letter++;
else if(c>='0'&&c<='9') digit++;
else if(c==' ') blank++;
else other++;
c = getchar();
}
printf("letter=%d, blank=%d, digit=%d, other=%d\n", letter, blank, digit, other);
}
}
③ 找最大值。输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入 4个整数
输出 其中的最大值。
例:输入
3 (repeat=3)
12 6 1 90
10 40 30 20
-1 -3 -4 -5
输出
max is 90 (12 6 1 90 中的最大值是90)
max is 40 (10 40 30 20 中的最大值是40)
max is -1 (-1 -3 -4 -5 中的最大值是-1)
程序代码:
#include <stdio.h>
void main( )
{
int ri, repeat;
int a, b, c, d, max;
scanf("%d", &repeat);
/*----以下为所填语句------*/
for(ri=1; ri<=repeat; ri++)
{
scanf("%d%d%d%d", &a, &b, &c, &d);
/*----以下为所填语句------*/
max=a;
if(max<b)max=b;
if(max<c)max=c;
if(max<d)max=d;
printf("max is %d\n", max);
}
}
(4)编写程序:输出“九九乘法表”。
程序代码:
#include <stdio.h>
void main()
{
int i,j;
for(i=1;i<9;i++);
for(j=1;j<=i;j++);
{
if(i==j) printf("\n");
printf("%d*%d= %d ",i, j, i*j);
}
}
实验项目六 函数及其应用
题目
(1) 程序填空。计算代数多项式1.1+2.2x+3.3x2+4.4x3+5.5x4的值。
例: 输入
1.5
输出
54.52
程序代码:
#include <stdio.h>
float f(float);
void main()
{
float x,y;
scanf(“%f”,&x);
/*----以下为所填语句------*/
y=f(x);
printf("%.2f\n",y);
}
/*----以下为所填语句------*/
float f(float x)
{
float sum=0,t=1;
int i;
for(i=1;i<=5;i++){
sum+=(i+1.0*i/10)*t;
t*=x;
}
return sum;
}
(2)编写程序,求 s=1!+2!+3!+....+10! 之和。要求定义递归函数fact(n)求n!,程序的输出形式为:1!+2!+3!+4+5!+6!+7!+8!+9!+10! = s,其中,s为求和值。
实验提示
求n!的递归公式为:
1 (n=0、n=1)
fact(n)=
fact(n)=n*fact(n-1) (n>1)
注意:s 和fas(n)均为长整型。!
程序代码:
#include <stdio.h>
void main()
{ long int fas(int);
int i, m;
long int s=0;
for(i=1;i<=10;i++)
{ m=fas(i);
s=s+m;
print(“%d!+”,i);
} print(“\b=%d\n”,s);
}
long int fas(int x)
{
if (x==0||x==1)
return(1);
else
return(x*fas(x-1));
}
(3)编写程序,N名裁判给某歌手打分(假定分数都为整数)。评分原则是去掉一个最高分,去掉一个最低分,剩下的分数取平均值为歌手的最终得分。裁判给分的范围是:
60 <= 分数〈=100,裁判人数N=10。要求:每个裁判的分数由键盘输入。
实验提示
定义两个函数:
l max():返回两个数中较大的值;
l min():返回两个数中较小的值。
程序代码:
#include <stdio.h>
Int m=0;n=100;
void main()
{ int i,x,sum;
sum=0;
for(i=1;i<=10;i++)
{
LOOP: scanf(“%d”,&x) ;
if(x<60||x>100)
goto LOOP;
m=max(x,m);
n= min(x,n);
sum=sum+x;
}
print(“%d”,(sum-m-n)/8);
}
int max (int x)
{
if (x>m) m=x;
return(m);
}
int min (int x)
{
if (x<n) n=x;
return(n);
}
(4)编写程序,用递归法将一个十进制整数转换成二进制数。
程序代码:
#include <stdio.h>
void DtoB(int n);
void main()
{
int n;
scanf("%d",&n);
printf("%d-----)",n);
DtoB(n);
printf("\n");
}
void DtoB(int n)
{
if(n)
{
DtoB(n/2);
printf("%d",n%2);
}
}
实验项目七 数组及其应用
题目
(1)程序填空。
① 求n个数中较大值及其下标。输入一个正整数n (1<n<=10),再输入n 个整数,输出最大值极其下标(设最大值唯一,下标从0 开始)。
程序代码:
#include <stdio.h>
void main( )
{
int ri, repeat;
int i, index, n;
int a[10];
scanf("%d", &repeat);
for(ri=1; ri<=repeat; ri++){
scanf("%d", &n);
for(i=0; i<n; i++)
scanf("%d", &a[i]);
/*----以下为所填语句------*/
index=0;
for(i=1; i<n; i++)
if( a[index]<a[i])index=i;
printf("max=%d,index=%d\n", a[index],index);
}
}
② 逆序输出。输入一个正整数repeat (0<repeat<10),做repeat 次下列运算:
输入一个正整数n (1<n<=10),再输入n 个整数,按逆序输出这些数。
程序代码:
#include <stdio.h>
void main( )
{
int ri, repeat;
int i, n, temp;
int a[10];
scanf("%d", &repeat);
for(ri=1; ri<=repeat; ri++){
scanf("%d", &n);
for(i=0; i<n; i++)
scanf("%d", &a[i]);
/*----以下为所填语句------*/
for(i=0; i<n/2; i++)
{
temp=a[i];
a[i]=a[n-1-i];
a[n-1-i]=temp;
}
for(i=0; i<n; i++)
printf("%d ", a[i]);
printf("\n");
}
}
③ 找鞍点(选作)。
输入 1 个正整数 n(1≤n≤6)和n 阶方阵a 中的元素,如果找到a 的鞍点(鞍点的元素值在该行上最大, 在该列上最小), 就输出它的下标, 否则,输出"NO"(设a 最多有1 个鞍点)。
程序代码:
#include "stdio.h"
void main( )
{
int ri,repeat;
int flag,i,j,k,row,col,n,a[6][6];
scanf("%d",&repeat);
for(ri=1;ri<=repeat;ri++){
scanf("%d",&n);
for(i=0; i<n; i++)
for(j=0; j<n; j++)
scanf("%d",&a[i][j]);
/*----以下为所填语句------*/
for(i=0; i<n; i++)
{
row=i;col=0;
for(j=1; j<n; j++)
if(a[row][col]<a[row][j])
col=j;
flag=1;
for(k=0; k<n; k++)
if(a[row][col]>a[k][col])
{ flag=0;
break;}
if(flag)
{
printf("a[%d][%d]=%d\n", row, col,a[row][col]);
break;
}
}
if(!flag)
printf("NO\n");
}
}
(2)有10个数存放在一个数组中,先对该10个数从大到小排序,然后输入一个数,要求找出该数是数组中第几个元素的值,若找不到,输出未找到信息。
实验提示
① 用冒泡或者选择排序法对数组中的10个数进行排序;
② 用折半查找的方法在数组中查找指定的数。
程序代码:
#include <stdio.h>
#define N 11
#include <stdio.h>
#define N 11
void sort(int a[N]) /* 排序 */
{ int i,j,min,temp;
for(i=1;i<=9;i++)
{ min=i;
for(j=i+1;j<=10;j++)
if(a[min]>a[j])
min=j;
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
void main()
{ int i,j,x,a[N];
void badd( int,int[],int);
printf("Enter data:\n");
for(i=1;i<=10;i++)
{ printf("a[%d]=",i);
scanf("%d",&a[i]);
}
printf(" \n");
for(i=1;i<=10;i++)
printf("%5d",a[i]);
printf(" \n");
sort(a);
printf("\n The sorted numbers: \n");
for(i=1;i<=10;i++)
printf("%5d",a[i]); printf("\n");
scanf("%d",&x);
badd(x,a,N); /* zheban find x */
}
void badd (int x,int a[] ,int n)
{ int mid,top,bot;
top=0;
bot=n-1;
while(top<=bot)
{ mid=(top+bot)/2;
if(x==a[mid])
{ printf("\n%d=a[%3d ]\n",x,mid-1);
exit(0);
}
else if( x>mid)
top=mid+1;
else bot=mid-1;
}
printf("\n can`t find %d ! ",x);
}
(3)/**/统计6个学生各4门功课的成绩。要求程序具有如下功能:
① 每个学生的4门功课的成绩从键盘读入;
② 计算每个学生的总分和平均分;
③ 按平均成绩进行排序,输出排序后的成绩单(四门功课的成绩和均分),给出名次。
如先输入学生4门课成绩:
1: 67,72,65,80
2: 75,82,94,95
3: 70,74,80,76
4:......
程序代码:
#include<stdio.h>
main()
{
int i,j,k,t,s,a[7][7];
for(i=1;i<=6;i++) a[i][0]=i; /*输入序号*/
for(j=1;j<=6;j++)
{ t=0;
for(k=1;k<=4;k++)
{ scanf("%d",&a[j][k]); /*输入成绩*/
t=t+a[j][k]; /*计算总成绩*/
}
a[j][6]=t/4; /*计算平均成绩存入第6列*/
a[j][5]=t; /*总平均成绩存入第5列*/
printf("\n");
}
for(j=1;j<=6;j++)
{ for(k=0;k<=6;k++)
printf("%d ",a[j][k]); /*输出序号及成绩*/
printf("\n");
}
for(j=1;j<=5;j++)
for(i=1;i<=7-j-1;i++)
if (a[i][6]<a[i+1][6]) /*按平均成绩排序*/
for(k=0;k<=6;k++) /*按平均成绩大小进行两行数据交换*/
{ s=a[i][k];
a[i][k]=a[i+1][k];
a[i+1][k]=s;
}
printf(" NO: c1 C2 C3 C4 TOLA AVE\n");
for(j=1;j<=6;j++) /*输出排序后的成绩*/
{ for(k=0;k<=6;k++)
printf("%4d",a[j][k]);
printf("\n");
}
}
实验项目八 指针及其应用
题目
(1)编写函数int search(int list[],int n,int x),在数组list中查找元素x,若找到则返回相应下标,否则返回-1。
实验提示
① 在数组list中查找元素x可以用单循环,采用顺序查找的方法实现;
② 注意控制循环语句的执行。
程序代码:
int search(int list[],int n,int x)
{
int i,*p;
for(i=0,p=list; p<list+n; p++,i++)
if(*p==x)
return i;
if(p>=list+n)
return -1;
}
(2)编写函数,用指针实现把字符串1中第m个字符开始的所有字符复制成字符串2。
实验提示
① 编写函数void substrcpy(char *,int ,char *)将字符串1中第m个字符开始的所有字符复制成字符串2。
② 在主函数中:
l 输入m,将字符串1输入到一维字符数组str1;
l 调用substrcpy函数;
l 输出字符串2。
程序代码:
#include<stdio.h>
#define m 20
main()
{ int m;
char *str1[m]}, *str2[m];
printf(“input string: “);
gets(str1);
printf(“ input the number: “);
scanf(“%d”,&m);
if (strlen(str1)<m)
printf(“ input error !“);
else
{ substrcpy(str1,str2, m);
printf(“ the result is :%s“,str2);
}
}
viod substrcpy(char *p1, char *p2 ,int m)
{
int n=0;
while(n<m-1)
{ n++;
p1++;
}
while(*p1!=’\0’)
{ *p2=*p1;
P1++;
P2++;
}
*p2=’\0’;
}
(3)编写一个函数,将数组中n个整数按逆序存放。
实验提示
① 编写函数void invert(int *,int)将n个数按反序存放。方法为:将a[0]与a[n-1]对换,a[1]与a[n-2]对换,直到将a[(n-①/2]与a[n-int((n-1)/2)]对换。
② 在主函数中:
l 输入n,并将n个数输入到一维数组a;
l 要求用指向函数的指针调用invert函数;
输出数组a。
程序代码1:
#include<stdio.h>
#define N 10
main()
{int invert(int x[]);
int i,a[N];
int(*p)();
p=invert;
for(i=0;i<N;i++)
scanf("%d",&a[i]);
for(i=0;i<N;i++)
printf("%4d",a[i]);
printf("\n");
(*p)(a);
for(i=0;i<N;i++)
printf("%4d",a[i]);
printf("\n");
}
invert(int x[])
{int i,n,temp;
for(i=0;i<(N-1)/2;i++)
{temp=x[i];
x[i]=x[N-i-1];
x[N-i-1]=temp;
}
printf("\n");
for(i=0;i<N;i++)
printf("%4d",x[i]);
}
程序代码2:
#include <stdio.h>
#define N 10
void main ( )
{ int invert(int x[]);
int i, a[10] ;
int (*p)() ;
p=invert;
for (i=0;i<N;i++)
scanf("%d",&a[i]);
for (i=0;i<N;i++)
printf("%4d",a[i]);
printf("\n");
(*p)(a) ;
}
int invert ( int x[ ]);
{ int i,temp;
for (i=0;i<=(N-1);i++)
{ temp=x[i] ;
x[i] = x[N-i-1]
x[N-i-1]= temp;
}
printf("\n");
for (i=0;i<N;i++)
printf("%4d",a[i]);
}
实验项目九 结构体及应用
题目
(1)程序填空。 猴子选王问题:一群编号是1,2,3 ...m 的猴子(m个)按照1-m的顺序围坐一圈,从第1开始数数,每数到n(n<m)时,该猴子就要离开此圈,这样依次下来,直到圈中只剩下最后一只猴子,则该猴子为大王。要求编程利用单循环链表作为存储结构来模拟实现此过程。
实验提示
输入数据是m和n两个整数,其中n<m且n>1,输出是最后为王的猴子编号。猴子选王的过程实际上可描述成以下操作:
① 建立一个单循环链表,每个结点的数据域依次存放的是猴子编号(模拟m个猴子围坐成一圈);
② 从链表的第一个结点开始顺着后继指针依次访问到第n个结点的前驱,将第n个结点从链表中删除(模拟猴子报数和猴子出列);
③ 再从被删结点的后继结点开始,重复②中的猴子报数和出列过程,直到链表中只剩下一个结点为止,剩下的这个结点中的编号即为猴王的编号。
程序代码:
#include <stdio.h>
#include <malloc.h>
typedef struct clink
{
int no;
struct clink *next;
}clink;
void creat(clink **head,int m)
/*用尾插法建立长度为m的单循环链表head,并通过形参返回值head*/
{
int i;
clink *p,*q;
/*指针p用来指向新生成的结点,指针q用来指向当前链表的尾结点*/
*head=(clink *)malloc(sizeof(clink)); /*生成链表中的第一个结点*/
(*head)->no=1;
q=*head; /*使q指向当前链表的尾结点*/
for(i=2;i<=m;i++) {
/*----以下为所填语句------*/
p=(clink *)malloc(sizeof(clink));
p->no=i;
q->next=p;
q=p;
}
q->next=*head; /*使尾结点的后继指针指向链表的第一个结点从而形成循环链表*/
}
void number(clink **head,clink **p,int n)
/*从指针p指向的结点开始报数,报到n的结点删除,并将链表的头指针和下一轮开始报数的位置p值返回*/
{
int i;
clink *q;
for(i=2;i<n;*p=(*p)->next,i++); /*指针p指向报数为n的前驱结点*/
/*----以下为所填语句------*/
q=(*p)->next;
if (q= =(*head)) /*如果被删的结点是head所指向的结点则要修改head值*/
*head=q->next;
free(q);
/*----以下为所填语句------*/ /*使p指针指向下一轮开始报数的结点位置*/
(*p)->next=(*p)->next->next;
*p=(*p)->next;
}
void main()
{
int m,n;
clink *head=NULL,*p;
printf("please enter int m&n(m>n&&n>1):");
scanf("%d%d",&m,&n);
creat(&head,m);
p=head; /*指针p用于指示当前开始报数的位置*/
while(head->next!=head) /*循环到链表中只有一个结点为止*/
number(&head,&p,n);
printf("Monkey king is %d\n",head->no);
}
(2)编程,建立一个链表,并删除某个结点。链表中的每个结点包括:学号,姓名,性别,
展开阅读全文