第四章 程序编写
![第四章 程序编写](https://img.360docs.net/img3d/01uhi8zxhdjmnq7fhz8k-d1.webp)
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(6)输入100个整数,编一程序,分别统计其中偶数和奇数的个数。
(7)编写打印输出以下图案的程序。
MTMTMTM
MTMTM
MTM
M
(8)用迭代法求 求平方根的迭代公式为
要求前后两次求出的x的差的绝对值小于10-5。
(9)求整数m的所有素数因子
(10)一个数恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3而6=1+2+3,因此6是完数。编程找出求1000以内的所有完全数。
(21)试用while控制结构,求出给定十进制正整数n的位数(例:278是三位数),并将结果存于变量C中。
(22)定义一个函数,统计3行4列的整数二维数组中有多少个正数、多少个负数,多少个零,并返回统计结果
(23)编写一个程序求数组a的最大数和第二最大数并分别存放于a[0]和a[1]中。假设数组中元素各不相同。
case '*': data3=data1*data2;break;
case '/': if(data2==0)
{printf ("\nDivision by zero 1 ");
exit(1);}
(37)将三个学生的数据存入名为“student.dat”的文件。学生数据包括学号、姓名、年龄。
(38)编写程序将终端读入的文本(用#作为文本结束标志)复制到一个名为bi.dat的新文件中。
(39)设单链表的结点类型doctor中有工号num(整型)、工资pay(实型)和next(指向doctor类型的指针类型)三个成员。假定单链表已经建立,链表首指针为head,试写一个函数,以head为形式参数,其功能是删除给定工号为n的结点。
max=i; /* max为最小元素的下标,即最小元素为a[i]的。*/
for(j=i+1;j<=10;j++)
{
if(a[j]<a[max])
max=j;
t=a[i];a[i]=a[max];a[max]=t;
这样,完整的选择排序程序为:
main()
{ int i,j,t,max,a[11];
for(i=1;i<=9;i++)
{ max=i;
for(j=i+1;j<=10;j++)
{
if(a[j]<a[max])
max=j;
}
t=a[i];a[i]=a[max];a[max]=t;
}
}
我们从以上所举的例子可以看出,只要把握结构化程序设计的思想,熟练掌握实现三种基本结构——顺序结构、选择结构、循环结构的语句,掌握常用算法的思路,就可以解决一些常规的编程问题。
}
下面的工作是细化t,t为阶层,而求阶层运算是用累乘的方法即t=t*i,变量i的值在循环中的变化,步长为1。这样程序为:
main()
{int t=1,i=1;float s=1,
while (1.0/t>=1e-7)
{t=t*i;
s=s+1.0/t;
i=i+1;
}
printf(“e=%.5f”,s);
(11)以下程序的功能是统计正整数的各位数字中零的个数,并求各位数字中最大者。
(12)写完整的程序,用公式
计算e的近似值,直到某项小于10-7为止。
(13)试写一个函数,以m为整型参数,判别m是否为素数。若m是素数,则返回1;若m不是素数,则返回0。
(14)编写函数,根据公式1公里=5/8英里,把英里数转换为公里数。
printf("input x:");
scanf("%f",&x);
if (x==0) y=x-1;
else if (0<x&&x<10) y=x+1;
else y=x;
printf("y=%f",y);
}
(3)#include"stdio.h"
void main(void)
{float data1,data2,data3;char op;
y=1!+3!+5!+7!
(18)编写一个程序,打印出所有的“梅花数”。所谓“梅花数”是一个五位数,其各位数字的五次方和等于该数本身。例如:54748是一个“梅花数”,因为54748=55+45+75+45+85
(19)求100~150之间和400~450之间能被9整除的数。
(20)输出1至100之间每位数的乘积大于每位数的和的数。
for(i=1;i<=n;i++)
{
打印第i行
}
循环体为“打印第i行”的操作。而第i行是由若干列,i个1和2,3,……n-i组成。所以打印“第i行”的操作为输出n个数:for(j=1;j<=i;i++) printf(“%d”,1);for(j=2;j<=n-i;j++) printf(“%d”,j);。所以此题目的程序为:
maxa=a[i];/* maxa为最小元素。*/
for(j=i+1;j<=10;j++)
{
if(a[j]<maxa)
{
{t=a[j];a[j]=maxa;maxa=t;}
max=j;/* max为最小元素下标。*/
}
t=a[i];a[i]=a[max];a[max]=t;
在数组中我们用下标区分数组元素。如,若max为最小元素下标,则a[max]为最小元素。那么,以上程序段可以简化为:
(29)输入正偶数n,计算以下级数之和并输出结果(显示结果保留小数点后3位)
(30)编写一个求两个数最大公约数的函数。
(31)编写一函数,其功能是将形参x的值转换成二进制数,所得二进制数的每一位数放在一维数组中返回。
(32)编写一函数,其功能是在一维数组a中查找x值;若找到则返回所在的下标值,否则返回0;
printf("\nType in your expression:");
scanf("%f%c%f",&data1,&op,&data2);
switch(op)
{case '+': data3=data1+data2 ;break;
case '-': data3=data1-data2;break;
计算e的近似值,直到某项小于10-7为止。
此题目属于累加问题,也就是我们要重复执行s=s+1/t的操作,到1/t的值小于10-7为止。重复操作用循环实现,这样程序的初步框架为:
main()
{int t=1;floats=1;
while (1.0/t>=1e-7)
{
s=s+1.0/t;
}
printf(“e=%.5f”,s);
(33)编写函数统计某字符在字符串中出现的次数,若该字符不出现则返回值零。
(34)编写函数,其函数功能是将字符串s倒置。例如,输入为”tracher”,则应输出“rehcaet”
(35)编写一个程序计算1到正整数n之间的奇数之和以及偶数之和。
(36)编写侯选人得票的统计程序。设有三个候选人,每次输入一个得票的后选人的名字,要求最后输出各人得票结果。
显示:3+5=8
(提示:用 switch语句实现)。
(4)编一程序,对于给定的一个百分制成绩,输出相应的五分制成绩。设:90分以上为‘A’;80-89分为‘B’;70-79分为‘C’;60-69分为‘D’,60分以下为‘E’(用switch实现)。
(5)设等差数列的第一项a=2,公差d=3,编写程序,输出前n项和中能被4整除的所有小于200的和。
for(i=1;i<=9;i++)
{
选择a[i],a[i+1],……a[9],a[10]中的最小值放入a[i]中。
}
下一步的工作是细化循环体:求a[i],a[i+1],……a[9],a[10]中的最小值即最小元素,然后将其与a[i]交换值。求a[i],a[i+1],……a[9],a[10]中的最小元素,是求最小值问题。我们用下面程序段实现。
(15)试用for控制结构,求数组a[N]的前k(k<=n)个元素中的最大值及最小值,并将结果分别存于变量max和min中。
(16)编写函数,实现计算n个元素组成的整型数组中去掉一个最大值和一个最小值后的平均值(如有多个相同的最大值和最小值,只要去掉一个,且设n大于2)。
(17)设计函数,求整数n的阶乘,并在主函数中调用该函数(通过循环结构)计算下列多项式:
4
(1)试编程判断输入的正整数是否既是5又是7的整倍数。若是,则输出yes;否则输出no。
(2)有一函数:
分别用if-else语句和嵌套的if语句编写程序,要求输入x的值,输出y的值。
(3)编写程序,对任意输入的两个实型数以及一个运算符(+、-、*、/),能够输出算式和计算结果,如:
输入:3+5<CR>
例:编写一函数,其功能是将形参intx的值转换成二进制数,所得二进制数的每一位数放在一维数组中返回。
完成这个题目主要解决两个问题,函数定义问题和十进制转换为二进制问题。函数定义首先需要解决的问题是参数定义和函数返回值的问题,其次是函数体。根据题意,函数参数为需要转换的十进制数,返回值是一维数组。返回数组通常的处理方法是数组名作参数。函数体是将形式参数转换为二进制。这样函数的基本框架为:
voiddtob(int x,int b[ ])
{
x转换为二进制;
}
这里的函数体是我们需要解决的第二个问题——十进制转换为二进制问题。十进制转换为二进制用除二取余法,即求x除以2的余数,将其存入数组;再求商除以2的余数,存入数组,用得到的再商求除以2的余数,存入数组,……值到商为0。根据题意,“十进制转换为二进制”用C语言描述为:
scanf(“%d”,&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=i;i++) printf(“%d”,1);
for(j=2;j<=n-i;j++) printf(“%d”,j);
}
通常打印图形用两重循环组成,外层循环控制行,内重循环控制列;若图形为上下对称图形,则分上下两部分分别打印。
我们先将10个数依次放入数组元素a[1],a[2],a[3],……,a[9],a[10]中。
选择排序的思想是:在a[1],a[2],a[3],……,a[9],a[10]中选择最小的值放入a[1],在a[2],a[3],……,a[9],a[10]中选择最小的值放入a[2]中,……,在a[i],a[i+1],……a[9],a[10]中选择最小值放入a[i]中(i=1,2,…9),如此,数组就成为有序数组。这样,选择排序的基本框架为:
(40)编写程序,从键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件test.txt中,然后从该文件读出字符串并显示出来。
4
(1)main()
{int x;
printf(“input x:”);
scanf("%d",&x);
if (x%5==0 && x%7==0)
printf("yes");
第四章
在掌握了程序设计语言基本概念和基本技能的基础上,我们讨论程序的编写。本章运用结构化程序设计的思想,通过具体实例介绍了一般的编程方法。我们同时还提供一些专项练习题,并作了较详细的解答。
4
结构化程序设计的思想是由顶到底逐步细化。下面我们通过具体的编程例子来体现结构化程序设计的思想。
例:写完整的程序,用公式
(24)用公式
求л的近似值,直到最后一项的值小于10-6为止。
(25)试用do-while控制结构,计算下列公式的近似值
当某项的值小于0.0001时,该项及以后各项不再累加,结束循环求和。
(26)输入一个正整数,要求以相反的顺序输出该数。
(27)编写计算字符串长度的函数。
(28)用公式:
求π的值,直到最后一项的绝对值小于10-6为止。
else
printf("no");
}
(2)方法1:
main()
{ float x,y;
printf("input x:");
scanf("%f",&x);
y=x;
if (x==0) y=x-1;
if (0<x&&x<10) y=x+1;
printf("y=%f\n",y);
}
方法2:
main()
{ float x,y;
}
例:请输入n值,编写程序输出下列图形(例如n=5).
1 2 3 4 5
1 1 2 3 4
1 1 1 2 3
1 1 1 1 2百度文库
1 1 1 1 1
对于图形打印题目,我们应该这样来考虑。图形由若干行组成,也就是我们要重复打印行的操作若干次,用循环实现。这样程序的基本结构为:
scanf(“%d”,&n);
int k=0;
do
{ b[k]=x%2;
x/=2;
k++;
}while(x);
这样,完整的函数为:
void dtob(int x,int b[ ])
{
int k=0;
do
{ b[k]=x%2;
x/=2;
k++;
}while(x);
}
例:将10个整数按小到大排列。
数据排序有多种方法,我们这里介绍选择排序法。
(7)编写打印输出以下图案的程序。
MTMTMTM
MTMTM
MTM
M
(8)用迭代法求 求平方根的迭代公式为
要求前后两次求出的x的差的绝对值小于10-5。
(9)求整数m的所有素数因子
(10)一个数恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3而6=1+2+3,因此6是完数。编程找出求1000以内的所有完全数。
(21)试用while控制结构,求出给定十进制正整数n的位数(例:278是三位数),并将结果存于变量C中。
(22)定义一个函数,统计3行4列的整数二维数组中有多少个正数、多少个负数,多少个零,并返回统计结果
(23)编写一个程序求数组a的最大数和第二最大数并分别存放于a[0]和a[1]中。假设数组中元素各不相同。
case '*': data3=data1*data2;break;
case '/': if(data2==0)
{printf ("\nDivision by zero 1 ");
exit(1);}
(37)将三个学生的数据存入名为“student.dat”的文件。学生数据包括学号、姓名、年龄。
(38)编写程序将终端读入的文本(用#作为文本结束标志)复制到一个名为bi.dat的新文件中。
(39)设单链表的结点类型doctor中有工号num(整型)、工资pay(实型)和next(指向doctor类型的指针类型)三个成员。假定单链表已经建立,链表首指针为head,试写一个函数,以head为形式参数,其功能是删除给定工号为n的结点。
max=i; /* max为最小元素的下标,即最小元素为a[i]的。*/
for(j=i+1;j<=10;j++)
{
if(a[j]<a[max])
max=j;
t=a[i];a[i]=a[max];a[max]=t;
这样,完整的选择排序程序为:
main()
{ int i,j,t,max,a[11];
for(i=1;i<=9;i++)
{ max=i;
for(j=i+1;j<=10;j++)
{
if(a[j]<a[max])
max=j;
}
t=a[i];a[i]=a[max];a[max]=t;
}
}
我们从以上所举的例子可以看出,只要把握结构化程序设计的思想,熟练掌握实现三种基本结构——顺序结构、选择结构、循环结构的语句,掌握常用算法的思路,就可以解决一些常规的编程问题。
}
下面的工作是细化t,t为阶层,而求阶层运算是用累乘的方法即t=t*i,变量i的值在循环中的变化,步长为1。这样程序为:
main()
{int t=1,i=1;float s=1,
while (1.0/t>=1e-7)
{t=t*i;
s=s+1.0/t;
i=i+1;
}
printf(“e=%.5f”,s);
(11)以下程序的功能是统计正整数的各位数字中零的个数,并求各位数字中最大者。
(12)写完整的程序,用公式
计算e的近似值,直到某项小于10-7为止。
(13)试写一个函数,以m为整型参数,判别m是否为素数。若m是素数,则返回1;若m不是素数,则返回0。
(14)编写函数,根据公式1公里=5/8英里,把英里数转换为公里数。
printf("input x:");
scanf("%f",&x);
if (x==0) y=x-1;
else if (0<x&&x<10) y=x+1;
else y=x;
printf("y=%f",y);
}
(3)#include"stdio.h"
void main(void)
{float data1,data2,data3;char op;
y=1!+3!+5!+7!
(18)编写一个程序,打印出所有的“梅花数”。所谓“梅花数”是一个五位数,其各位数字的五次方和等于该数本身。例如:54748是一个“梅花数”,因为54748=55+45+75+45+85
(19)求100~150之间和400~450之间能被9整除的数。
(20)输出1至100之间每位数的乘积大于每位数的和的数。
for(i=1;i<=n;i++)
{
打印第i行
}
循环体为“打印第i行”的操作。而第i行是由若干列,i个1和2,3,……n-i组成。所以打印“第i行”的操作为输出n个数:for(j=1;j<=i;i++) printf(“%d”,1);for(j=2;j<=n-i;j++) printf(“%d”,j);。所以此题目的程序为:
maxa=a[i];/* maxa为最小元素。*/
for(j=i+1;j<=10;j++)
{
if(a[j]<maxa)
{
{t=a[j];a[j]=maxa;maxa=t;}
max=j;/* max为最小元素下标。*/
}
t=a[i];a[i]=a[max];a[max]=t;
在数组中我们用下标区分数组元素。如,若max为最小元素下标,则a[max]为最小元素。那么,以上程序段可以简化为:
(29)输入正偶数n,计算以下级数之和并输出结果(显示结果保留小数点后3位)
(30)编写一个求两个数最大公约数的函数。
(31)编写一函数,其功能是将形参x的值转换成二进制数,所得二进制数的每一位数放在一维数组中返回。
(32)编写一函数,其功能是在一维数组a中查找x值;若找到则返回所在的下标值,否则返回0;
printf("\nType in your expression:");
scanf("%f%c%f",&data1,&op,&data2);
switch(op)
{case '+': data3=data1+data2 ;break;
case '-': data3=data1-data2;break;
计算e的近似值,直到某项小于10-7为止。
此题目属于累加问题,也就是我们要重复执行s=s+1/t的操作,到1/t的值小于10-7为止。重复操作用循环实现,这样程序的初步框架为:
main()
{int t=1;floats=1;
while (1.0/t>=1e-7)
{
s=s+1.0/t;
}
printf(“e=%.5f”,s);
(33)编写函数统计某字符在字符串中出现的次数,若该字符不出现则返回值零。
(34)编写函数,其函数功能是将字符串s倒置。例如,输入为”tracher”,则应输出“rehcaet”
(35)编写一个程序计算1到正整数n之间的奇数之和以及偶数之和。
(36)编写侯选人得票的统计程序。设有三个候选人,每次输入一个得票的后选人的名字,要求最后输出各人得票结果。
显示:3+5=8
(提示:用 switch语句实现)。
(4)编一程序,对于给定的一个百分制成绩,输出相应的五分制成绩。设:90分以上为‘A’;80-89分为‘B’;70-79分为‘C’;60-69分为‘D’,60分以下为‘E’(用switch实现)。
(5)设等差数列的第一项a=2,公差d=3,编写程序,输出前n项和中能被4整除的所有小于200的和。
for(i=1;i<=9;i++)
{
选择a[i],a[i+1],……a[9],a[10]中的最小值放入a[i]中。
}
下一步的工作是细化循环体:求a[i],a[i+1],……a[9],a[10]中的最小值即最小元素,然后将其与a[i]交换值。求a[i],a[i+1],……a[9],a[10]中的最小元素,是求最小值问题。我们用下面程序段实现。
(15)试用for控制结构,求数组a[N]的前k(k<=n)个元素中的最大值及最小值,并将结果分别存于变量max和min中。
(16)编写函数,实现计算n个元素组成的整型数组中去掉一个最大值和一个最小值后的平均值(如有多个相同的最大值和最小值,只要去掉一个,且设n大于2)。
(17)设计函数,求整数n的阶乘,并在主函数中调用该函数(通过循环结构)计算下列多项式:
4
(1)试编程判断输入的正整数是否既是5又是7的整倍数。若是,则输出yes;否则输出no。
(2)有一函数:
分别用if-else语句和嵌套的if语句编写程序,要求输入x的值,输出y的值。
(3)编写程序,对任意输入的两个实型数以及一个运算符(+、-、*、/),能够输出算式和计算结果,如:
输入:3+5<CR>
例:编写一函数,其功能是将形参intx的值转换成二进制数,所得二进制数的每一位数放在一维数组中返回。
完成这个题目主要解决两个问题,函数定义问题和十进制转换为二进制问题。函数定义首先需要解决的问题是参数定义和函数返回值的问题,其次是函数体。根据题意,函数参数为需要转换的十进制数,返回值是一维数组。返回数组通常的处理方法是数组名作参数。函数体是将形式参数转换为二进制。这样函数的基本框架为:
voiddtob(int x,int b[ ])
{
x转换为二进制;
}
这里的函数体是我们需要解决的第二个问题——十进制转换为二进制问题。十进制转换为二进制用除二取余法,即求x除以2的余数,将其存入数组;再求商除以2的余数,存入数组,用得到的再商求除以2的余数,存入数组,……值到商为0。根据题意,“十进制转换为二进制”用C语言描述为:
scanf(“%d”,&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=i;i++) printf(“%d”,1);
for(j=2;j<=n-i;j++) printf(“%d”,j);
}
通常打印图形用两重循环组成,外层循环控制行,内重循环控制列;若图形为上下对称图形,则分上下两部分分别打印。
我们先将10个数依次放入数组元素a[1],a[2],a[3],……,a[9],a[10]中。
选择排序的思想是:在a[1],a[2],a[3],……,a[9],a[10]中选择最小的值放入a[1],在a[2],a[3],……,a[9],a[10]中选择最小的值放入a[2]中,……,在a[i],a[i+1],……a[9],a[10]中选择最小值放入a[i]中(i=1,2,…9),如此,数组就成为有序数组。这样,选择排序的基本框架为:
(40)编写程序,从键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件test.txt中,然后从该文件读出字符串并显示出来。
4
(1)main()
{int x;
printf(“input x:”);
scanf("%d",&x);
if (x%5==0 && x%7==0)
printf("yes");
第四章
在掌握了程序设计语言基本概念和基本技能的基础上,我们讨论程序的编写。本章运用结构化程序设计的思想,通过具体实例介绍了一般的编程方法。我们同时还提供一些专项练习题,并作了较详细的解答。
4
结构化程序设计的思想是由顶到底逐步细化。下面我们通过具体的编程例子来体现结构化程序设计的思想。
例:写完整的程序,用公式
(24)用公式
求л的近似值,直到最后一项的值小于10-6为止。
(25)试用do-while控制结构,计算下列公式的近似值
当某项的值小于0.0001时,该项及以后各项不再累加,结束循环求和。
(26)输入一个正整数,要求以相反的顺序输出该数。
(27)编写计算字符串长度的函数。
(28)用公式:
求π的值,直到最后一项的绝对值小于10-6为止。
else
printf("no");
}
(2)方法1:
main()
{ float x,y;
printf("input x:");
scanf("%f",&x);
y=x;
if (x==0) y=x-1;
if (0<x&&x<10) y=x+1;
printf("y=%f\n",y);
}
方法2:
main()
{ float x,y;
}
例:请输入n值,编写程序输出下列图形(例如n=5).
1 2 3 4 5
1 1 2 3 4
1 1 1 2 3
1 1 1 1 2百度文库
1 1 1 1 1
对于图形打印题目,我们应该这样来考虑。图形由若干行组成,也就是我们要重复打印行的操作若干次,用循环实现。这样程序的基本结构为:
scanf(“%d”,&n);
int k=0;
do
{ b[k]=x%2;
x/=2;
k++;
}while(x);
这样,完整的函数为:
void dtob(int x,int b[ ])
{
int k=0;
do
{ b[k]=x%2;
x/=2;
k++;
}while(x);
}
例:将10个整数按小到大排列。
数据排序有多种方法,我们这里介绍选择排序法。