蛋疼的C语言,求大家分担一下,还有一半我自己解决
实验4 循环结构程序设计一、实验目的
1.掌握while,do-while和for语句实现循环的方法。
2.理解break和continue语句在循环结构中的使用方法 。
3.熟悉循环结构程序中语句的执行过程。
4. 熟练掌握循环结构程序的设计方法。
5. 掌握在程序设计中用循环的方法实现各种算法(穷举、迭代、递推等)。
二、预习内容及要求
1.熟悉while,do-while及for语句构造循环的方法及区别。
2.熟悉break、continue的使用方法及区别。
3.熟悉switch语句的基本使用。
4.完成实验任务要求的各C语言程序代码的输入。
三、实验内容及要求
1.给出程序运行结果并上机验证(要求上机前预先人工分析各程序并写出运行结果,
然后上机进行结果验证)。
程序1
#include<stdio.h>
void main()
{
int i, j;
for(i=3; i>=l; i--)
{ for(j=1; j<=2; j++) printf("%d", i+j);
printf("\n");}
}
1)若去掉第一个for后面的一对花括号,重新分析程序结果并说明原因;
2)若把“printf("\n");”后的或括号改在“printf("%d", i+j);”之后,重新分析程序结果并说明原因;
3)语句“printf("%d", i+j);”和语句“printf("\n");”在程序运行过程中分别执行了多少次?
程序2
#include <stdio.h>
void main()
{
int i=5;
do
{ if (i%3=1)
if (i%5==2)
{printf("*%d", i); break;}
i++;
} while(i!=0);
printf("\n");
}
1)将程序中while(i!=0);改为while(i==0); 重新分析程序结果并说明原因;
2)将程序中while(i!=0);改为while(i=0); 重新分析程序结果并说明原因;
3)去掉break;语句,重新分析程序结果并说明原因;
4)将break;后的花括号放在i++;后,重新分析程序结果并说明原因;
程序3
#include <stdio.h>
void main()
{
int n=12345,d;
while(n! =0)
{ d=n%10;printf("%d",d);n/=10; }
}
1) 将程序改为用do-while循环语句实现。
2) 将程序改为用for循环语句实现。
3) 将程序改为使用指针间接访问变量n。
2.程序填空(根据给出程序的设计要求在划线部分填入正确的程序代码然后上机进行
程序的验证)。
(1)请补充下列程序,该程序的功能是:求出1000以内的整数中能被7整除的最大的数。
注意:部分源程序给出如下。请勿改动主函数main的任何内容,仅在程序中横线上填入所编写的若干表达式或语句。
程序:
#include<stdio.h>
void main()
{
int i;
for(______________;i<=1000;_____________)
{
if(i%7==0)______________;
}
printf(“The result is %d\n”,i);
}
(2)下列程序使用辗转相除法求两个正整数的最大公约数,设两个正整数分别存放在变量a和b中,算法如下:
①将两数中的大数放在变量a中,小数放在变量b中;
②求出a除以b后的余数;
③若余数为0则执行步骤⑦,否则执行步骤④;
④把除数作为新的被除数,余数作为新的除数;
⑤求出新的余数;
⑥重复步骤③至⑤;
⑦输出变量b的值,该值即为所求最大公约数。
注意:部分源程序给出如下。请勿改动程序中的任何内容,仅在程序中的横线上填入所编写的若干表达式或语句。
#include<stdio.h>
void main()
{
int a,b,r;
int *p1,*p2;
p1=&a;
p2=&b;
printf(“Please input a,b:”);
scanf(“%d,%d”,p1,p2);
if(*p1>*p2)______________;
while(____________)
{*p1=___________;
*p2=___________;
r=___________;
}
printf(“The result is %d\n”,*p2);
else printf(“Error data!”);
}
(3)请补充main函数,该函数的功能是:从键盘输入学生的成绩(用回车键作为分隔符),并统计各分数段学生的人数。具体要求为:A类为90~100分,B类为80~89分,C类为70~79分,D类为60~69分,59分以下的为E类。当成绩为0时结束成绩的输入,并且最后输入的0不进行统计。例如,输入89,99,45,64,56,78,88,74,66,55,0。结果为A:1 B:2 C:2 D:2 E:3
注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。
#include<stdio.h>
#define N 100
void main()
{
float score[N];
int bb[5];
int grade, i=-1,n=0;
char ch='A';
printf("Input a score(0~100);\n");
do
{
i++;
n++;
printf("score[%d]=",i);
scanf ( );
}while (score[i]!=0);
for(i=0;i<5;i++)
;
for(i=0;i<n-1;i++)
{
grade= ;
switch(grade)
{
case 10:
case 9:bb[0]++;break;
case 8:bb[1]++;break;
case 7:bb[2]++;break;
case 6:bb[3]++;break;
default:bb[4]++;
}
}
for(i=0;i<5;i++)
printf("\n%c:%d",ch+i,bb[i]);
}
3.程序改错((改正下列程序中的错误然后上机进行程序的验证)。
(1)下列给定程序的功能是计算并输出high以内的素数之和。若high的值为100,则函数的值为1060。
请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
#include <math.h>
void main()
{
int high,j,yes,sum=0;
printf(“Please input one integer:”);
scanf(“%d”,&high);
while(high>=2)
{
yes = 1;
for(j=2; j<=high/2; j++)
/**********************found***********************/
if(high%j=0)
{
yes=0;
continue;
}
/**********************found***********************/
if(yes==0)
sum+=high;
high--;
}
printf("The result is %d\n",sum);
}
(2)下列给定程序的功能是根据输入的正整数m,计算下列公式的值。
t=1-1/2+1/3-1/4+…+(-1)(m+1)/m。例如,若输入5,则应输出0.783333。请改正程序中的错误,使它能得到正确结果。
注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
void main()
{
/**********************found***********************/
int m,i;
double t,j=1.0;
int *p=&t;
printf("\nPlease input one integer number: ");
scanf("%d",&m);
/**********************found***********************/
for(i=1;i<m;i++)
{
j=-1*j;
*p+=j/i;
}
printf("\nThe result is %lf\n", *p);
}
4.编程(根据给出的编程要求完成程序的编制及录入,然后上机进行程序的运行及调试)。
(1)使用三种循环语句输出九九乘法表。
(2)根据以下公式计算S,S=1+1/(1+2)+1/(1+2+3)+…+1/(1+2+3+…+n)
(3)输入整数n,求n!并输出。
(4)百马百担的问题。有100匹马,驮100担货,大马驮3担,中马驮2担,两匹小马驮1担,编程计算共有多少种驮法。
(5)编写程序,完成下图所示图形的输出。
1
2 2
3 3 3
4 4 4 4
5 5 5 5 5
6 6 6 6 6 6
7 7 7 7 7 7 7
8 8 8 8 8 8 8 8
9 9 9 9 9 9 9 9 9
图1 习题5的输出图形
实验5 模块化程序设计与函数
三、实验内容及要求
1.给出程序运行结果并上机验证(要求上机前预先人工分析各程序并写出运行结果,
然后上机进行结果验证)。
程序1
#include “stdio.h”
long fun( int n)
{
long s;
if(n==1||n==2)
s=2;
else
s=n-fun(n-1);
return s;
}
void main()
{
printf(“%ld\n”, fun(5));
}
程序运行输出结果为: 。
1)给出函数递归调用过程。
2)能否将语句 if(n==1||n==2) s=2;else s=n-fun(n-1);修改为:s=n-fun(n-1);说明
原因。
程序2
以下程序的输出结果是 。
int f( )
{
static int i=0;
int s=1;
s+=i;
i++;
return s;
}
void main( )
{
int i,a=0;
for(i=0;i<5;i++)
a+=f();
printf("%d\n",a);
}
1)将语句 static int i=0;前的static去掉,重新分析程序结果。
2)改写main函数中变量a的访问方式为间接访问。
程序3
#include <stdio.h>
void f( int y,int *x)
{
y=y+*x;
*x=*x+y;
}
void main( )
{
int x=2,y=4;
f(y,&x);
printf(“%d %d\n”,x,y);
}
程序运行后的输出结果是 。
1)将语句f(y,&x);修改为f(x,&y);重新分析程序结果。
2)改写main函数中变量x的访问方式为间接访问。
程序4
#include <stdio.h>
#define S(x) x*x*x
void main()
{
int i=6,j=8;
? printf("%d\n",S(i+j));
}
程序运行后的输出结果是 。
1)若要使带参宏S(x)能实现求任意表达式的立方的功能,该如何修改宏定义。
2.程序填空(根据给出程序的设计要求在划线部分填入正确的程序代码然后上机进行
程序的验证)。
程序1:函数fun是用来计算:m=1-2+3-4+…+9-10…,请在横线上填写若干表达式,
将函数补充完整。
int fun( int n)
{
int m= ,f=1,i;
for(i=1; i<=n; i++)
{ m+=i*f;
f= ;
}
return ;
}
程序2:已知一个偶数总能表示为两个素数之和,函数fun是用来输出和为偶数n的两
个素数,请在横线上填写若干表达式,将函数补充完整。
void fun(int n)
{
int b,c,d;
for(b=3;b<=n/2;b+=2)
{ for(c=2; ;c++)
if(b%c==0) break;
if(c>sqrt(b)) d=n-b;
else break;
for(c=2; ;c++)
if(d%c==0) break;
if( ) printf("%d=%d+%d\n",a,b,d);
}
}
程序3:函数fun(a,n)是用来求:s=a+aa+aaa+aaaa+aa...a(最后一个加数的位数为n)
的值。请在横线上填写若干表达式,将函数补充完整。
long fun(int a,int n)
{
int count=1;
long int sn=0,tn=0;
while(count<=n)
{ tn= ;
sn=sn+tn;
a=a*10;
;
}
return ;
}
3.程序改错(利用上机找出下列程序中的错误并改正)。
程序1:下列给定程序中,函数fun的功能是:按以下递归公式求函数值。
10 (n=1)
fun(n)= fun(n-1)+2 (n>1)
请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
/**********************found***********************/
fun(n)
{
/**********************found***********************/
int c;
if(n=1)
c=10;
else
c=fun(n-1)+2;
return(c);
}
void main()
{
int a,b;
printf(“Please input a:”);
scanf(“%d”,&a);
b=fun(a);
printf(“The result is %d\n”,b);
}
(2)下列给定程序中,函数fun的功能是:通过某种方式实现两个变量值的交换,请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include<stdio.h>
int fun(int *x,int y)
/**********************found***********************/
{
int t;
t = x ;
x = y ;
return(y) ;
}
void main()
{ int a = 3, b = 8 ;
printf("%d %d\n", a, b) ;
b = fun(&a, b) ;
printf("%d %d\n", a, b) ;
}
(3)下列给定程序中,函数fun的功能是:求s的值。设
请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
/**********************found***********************/
fun(int k,float *s)
{ int n;
float w,p,q;
n=1;
*s=1.0;
/**********************found***********************/
while(n<=k)
{ w=2.0*n;
p=w-1.0;
q=w+1.0;
*s=*s*w*w/p/q;
n++;
}
}
void main()
{
int a;
float result;
printf(“Please input a:”);
scanf(“%d”,&a);
fun(&result,a);
printf(“The result is %lf\n”,result);
}
4.编程(根据给出的编程要求完成程序的编制及录入,然后上机进行程序的运行及调
试)。
(1)编写一个函数,其功能是根据三角形的三边长,求三角形面积。要求main函数中函数调用使用传地址的方式来完成。
(2)编写一函数digh(m,k),它将回送整数m从左边开始的第k个数字的值,例如: digh(8542,3)=5,digh(12,4)=0。
(3)请编写函数fun(n),其功能是:计算并输出下列多项式值。要求main函数中函数调用使用传地址的方式来完成。
(4)请编写函数fun(n),其功能是:计算并输出下列多项式值。要求main函数中函数调用使用传地址的方式来完成。
(5)编写函数fun(x,n)用递归方法求x的n次方,n为不小于0整数。
(6)用递归方法编写函数Ack(m,n),对于m≥0,n≥0,Ack(m,n)定义为:
Ack(0,n)=n+1
Ack(m,0)=Ack(m-1,1)
Ack(m,n)=Ack((m-1),Ack(m,n-1))
(7)定义一个宏 swap(x,y),完成对两个整数x,y的交换。
实验6 数组程序设计
三、实验内容及要求
1.给出程序运行结果并上机验证(要求上机前预先人工分析各程序并写出运行结
果,然后上机进行结果验证)。
程序1
#include <stdio.h>
#define N 5
void main()
{
int a[N]={9,6,5,4,1},i,temp;
printf("\n original array:\n");
for(i=0;i<N;i++)
printf("%4d",a[i]);
for(i=0;i<N/2;i++)
{temp=a[i];
a[i]=a[N-i-1];
a[N-i-1]=temp;
}
printf("\n sorted array:\n");
for(i=0;i<N;i++)
printf("%4d",a[i]);
}
1) 修改语句for(i=0;i<N/2;i++)为for(i=0;i<N;i++)后重新分析程序结果并说明原因;
2) 修改N值为6,int a[N]={9,6,5,4,1,3}后重新分析程序结果;
3) 使用数组元素的指针引用法改写程序;
4) 利用模块化编程思想改写程序,main()函数如下:
#include <stdio.h>
#define N 5
void sort(int *p);
main()
{
int a[N]={9,6,5,4,1},i;
sort(a);
for(i=0;i<N;i++)
printf("%4d",a[i]);
}
程序2
#include <stdio.h>
void main()
{
int a[3][3],sum=0;
int i,j;
printf("please input rectangle element:\n");
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
for(i=0;i<3;i++)
sum=sum+a[i][i];
printf("duijiaoxian he is %6.2f",sum);
}
1)从键盘输入1~9共9个整数,给出该程序的结果;
2)修改语句int a[3][3],sum=0;为int a[3][3],sum;后分析程序结果并说明原因;
3)使用数组元素的指针引用法改写程序。
程序3
#include <stdio.h>
int fun(char s[],char c)
{
int i,k=0;
for(i=0;s[i]!= '\0';i++)
if(s[i]!=c) s[k++]=s[i];
s[k]='\0';
}
void main()
{
char str[]="turbo c and borland"
char ch='r';
fun(str,ch);
printf("str[]=%s\n",str);
}
1)修改语句int fun(char s[],char c) 为int fun(char s[],int c) 重新分析程序结果并说明原因;
2)修改语句fun(str,ch); 为fun(&str[0],ch); 重新分析程序结果并说明原因;
3)修改语句if(s[i]!=c) s[k++]=s[i]; 为if(s[i]!=c) s[++k]=s[i]; 重新分析程序结果并说明原因;
4)使用数组元素的指针引用法改写程序。
2.程序填空(根据给出程序的设计要求在划线部分填入正确的程序代码然后上机进行
程序的验证)。
程序1:m 个人的成绩存放在 score 数组中,求出低于平均分的所有成绩及人数。
#include <string.h>
#include <stdio.h>
int fun(int score[],int m, int below[])
{
int i,j=0,aver=0;
for(i=0;i<m;i++)
______________;
aver/=m;
for(i=0;i<m;i++)
if(score[i]<aver)
______________;
return j;
}
void main()
{
int i,n,below[9];
int score[9]={10,20,30,40,50,60,70,80,90};
clrscr();
______________;
printf("\nBelow the average score are :");
for(i=0;i<n;i++) printf("%4d",below[i]);
}
程序2将一个5*5 的矩阵左下半三角元素中的值全部置成 0。
#include<stdio.h>
#define N 5
____________
{int i,j;
for(i=0;i<N;i++)
______________
______________;
}
void main()
{
int a[N][N],i,j;
printf("*** The array ****\n");
for(i=0;i<N;i++)
{for(j=0;j<N;j++)
{a[i][j]=rand()%10;printf("%4d",a[i][j]);}
printf("\n");
}
fun(a);
printf("The result\n");
for(i=0;i<N;i++)
{for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
程序3:求出字符串中指定字符的个数。
#include<stdio.h>
#define M 81
int fun(char *ss,char c)
{
int num=0;
______________
{if(*ss==c) ______________;
ss++;
}
______________;
}
void main()
{
char a[M],ch;
printf("\nPlease enter a strint:");gets(a);
printf("\nPlease enter a char:");ch=getchar();
printf("\nThe number of the char is:%d\n",fun(a,ch));
}
3.程序改错(改正下列程序中的错误然后上机进行程序的验证)。
(1)将大于整数m的且紧靠m的k个素数存入数组a中。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
#define N 100
/**********************found***********************/
int fun(int m,int k,int x[N])
{
int n,count=0;
while(count<k)
/**********************found***********************/
{m++;
for(n=2;n<m;n++)
if(m%n=0)break;
if(n<m)continue;
x[++count]=m;
}
}
void main()
{
int m,k,a[N];
printf(“\nEnter two integers:”);
scanf(“%d%d”,&m,&k);
fun(m,k,a);
for(m=0;m<k;m++)
printf(“%d”,a[m]);
}
(2)比较2个字符串,将长的字符串返回main()函数输出。请改正程序中的错误,使它能得到正确结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。
#include <stdio.h>
char fun(char *s,char *t)
{
int s1=0,t1=0;
char *ss,*tt;
ss=s;tt=t;
/**********************found***********************/
while(*ss)
{s1++;
(*ss)++;
}
while(*tt)
{t1++;
(*tt)++;
}
if(t1<s1)return t;
else return s;
}
void main()
{
char a[80],b[80];
printf(“\nEnter a string:”);
gets(a);
printf(“\nEnter a string:”);
gets(b);
printf(\nThe longer stirng is:%s”,fun(a,b));
}
4.编程(根据给出的编程要求完成程序的编制及录入,然后上机进行程序的运行及调试)。
(1)将两个等长的一维数组中的对应元素的值相减并输出结果。
(2)将一维数组各元素逆序输出,要求使用指针法访问数组元素并采用模块化程序设计。
(3)找出一个4×4二维数组中最大的数值所在行号和列号。
(4)将一个字符串中大写字母转换成小写字母并输出。
(5)过滤一个字符串中所有小写字母并输出过滤后的字符串,要求使用指针法访问数组元素并采用模块化程序设计。