文档库

最新最全的文档下载
当前位置:文档库 > 第三章 程序设计基础

第三章 程序设计基础

3.1编程序:用getchar函数读入两个字符给c1,c2,然后分别用putchar和printf函数输出这两个字符。并思考以下问题:(1)变量c1,c2应定义为字符型或整型?或两者皆可?(2)要求输出C1和C2值的ASCII 码,应如何处理?用putchar函数还是printf函数?(3)整型变量与字符型变量是否在任何情况下都可以互相替代?

1、#include

main()

{char c1,c2;

c1=getchar();

c2=getchar();

putchar(c1);

putchar(c2);

p rintf(“\n”);

p rintf(“%c,%c\n”,c1,c2);}

运行结果:

请输入两个字符C1,C2:

AB

用putchar语句输出结果为:

AB

用printf语句输出结果为:

A,B

回答思考问题:

C1和C2定义为字符型。

在printf函数中用%d格式符输出。即:printf(“%d,%d\n”,C1,C2);

字符变量在计算机内占一个字节,而整型变量占两个字节,因此整型变量在可输出字符的范围内(ASCII 码为0-255之间的字符)是可以与字符数据互相转换的。如果整数在此范围外,则不能代替。

3.2

#include "stdio.h"

main()

{

int hh,mm,ss;

int result;

printf("input the time(hh:ss:mm):");

scanf("%d:%d:%d",&hh,&mm,&ss);

result=hh*3600+mm*60+ss;

printf("%d",result);

}

3.3设某职工应发工资x元,试求各种票额钞票总张数最少的付款方案。

分析:可以从最大的票额(100元)开始,算出所需的张数,然后在剩下的部分算出较小票额的张数,直到最小票额(1元)。

解法一:

#include "stdio.h"

main()

{

int x,y;

scanf("%d",&x); /* x为实发工资数*/

y=x/100;

printf("百元:%d\n",y); /*求百元票张数并显示*/

x=x-100 * y; /*求剩余款项*/

y=x/50; /*求五十元票张数并显示*/

printf("五十元:%d\n",y);

x=x-50 * y; /*求剩余款项*/

y=x/20; /*求二十元票张数并显示*/

printf("二十元:%d\n",y);

x=x-20 * y; /*求剩余款项*/

y=x/10;

printf("十元:%d\n",y);

x=x-10 * y; /*求剩余款项*/

y=x/5;

printf("五元:%d\n",y);

x=x-5*y; /*求剩余款项*/

y=x/2 ; /*求二元票张数并显示*/

printf("二元:%d\n",y);

x=x-2*y; /*求剩余款项*/

y=x; /*求一元票张数并显示*/

printf("一元:%d\n",y);

}

解法二:

#include "stdio.h"

main()

{

int x,y;

scanf("%d",&x); /* x为实发工资数*/

y=x/100; /*求百元票张数并显示*/ printf("百元:%d\n",y);

y=x%100/50; /*求五十元票张数并显示*/ printf("五十元:%d\n",y);

y=x%50/20; /*求二十元票张数并显示*/ printf("二十元:%d\n",y);

y=x%50%20/10; /*求十元票张数并显示*/ printf("十元:%d\n",y);

y=x%10/5; /*求五元票张数并显示*/

printf("五元:%d\n",y);

y=x%5/2; /*求二元票张数并显示*/

printf("二元:%d\n",y);

y=x%5%2; /*求一元票张数并显示*/ printf("一元:%d\n",y);

}

3.6

解法一:

#include"stdio.h"

main()

{

int i=0;

long a=1;

scanf("%ld",&a);

if(a==0) i=1;

while(a!=0)

{

a/=10;

i++;

}

printf("%d\n",i);

}

解法二:

#include "stdio.h"

main()

{

int n1,n2,flag=0;

scanf("%d",&n2);

if(n2==0) flag=1;

while(n2!=0)

{

n1=n2%10;

n2=n2/10;

printf("%d",n1);

flag++;

}

printf("\nwei shu shi:%d",flag);

}

3.7

#include "stdio.h"

main()

{

float p, w;

printf("input w(kg):");

scanf("%f",&w);

if (w <= 50)

p = w * 0.25;

else if (w <= 100)

p = 50 * 0.25 + (w - 50) * 0.35;

else p = 50 * 0.25 + 50 * 0.35 + (w - 100) * 0.45;

printf("fei yong shi %.3f:",p);

}

3.8

思路:数字字符的ASCII值与此数值的关系。若设该一位十进制数为a,则数字字符a的ASCII等于48+a。

#include "stdio.h"

main()

{

int a,i;

for(i=48;i<=57;i++)

{

printf("%c\n",i);

}

}

3.9

#include "stdio.h"

main()

{

int n1,n2,n3,n4,min;

scanf("%d%d%d%d",&n1,&n2,&n3,&n4);

min=n1;

if(n2

if(n3

if(n4

printf("small is:%d",min);

}

3.10

/*判断已经过去的月份天数和当月的天数就可以了*/

#include "stdio.h"

main()

{

int year, month, day;

int i;

int totaldays = 0;

/*初始化年,月,日*/

int daysofmonth[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; printf("input year,month,day:");

scanf("%d%d%d",&year,&month,&day);

/*计算今年是否是闰年*/

if ((year % 100 != 0 && year % 4 == 0 ) || year % 400 == 0)

{

/*如果是闰年,则二月为29天*/

daysofmonth[2] = 29;

}

/*将每月的天数相加*/

for (i = 1; i < month; i++ )

{

totaldays += daysofmonth[i];

}

/*再加上本月的天数*/

totaldays += day;

printf("the day is:%d",totaldays); /*输出所在的天数*/

}

3.12

解法一:

/* 计算1!+2!+……+10! */

#define N 10

#include"stdio.h"

main()

{

int i;

long n=1,sum=0;

for(i=1;i<=N;i++)

{

n*=i;

sum+=n;

}

printf("%ld\n",sum);

}

解法二:

#include "stdio.h"

main()

{

int i,j;

long fac,sum=0;

for(i=1;i<=10;i++)

{

{

fac=1;

for(j=1;j<=i;j++)

fac=fac*j;

} /*计算阶成*/

sum=sum+fac; /*计算阶成之和*/

}

printf("%ld",sum);

}

3.13

#include "stdio.h"

main()

{

int a,n,i,j,temp;

long int sum=0;

printf("input a,n :");

scanf("%d%d",&a,&n);

for(i=1;i<=n;i++)

{

{ /*用于计算a的n次方*/

temp=1;

for(j=1;j<=i;j++)

temp=temp*a;

}

sum=sum+temp; /*用于计算总和*/ }

printf("result is :%ld",sum);

}

3.14

参考答案1:

#include

main()

{

float term, result = 1;

int n;

for (n = 2; n <= 100; n = n + 2)

{

term = (float)( n * n)/(( n - 1) * ( n + 1));

result = result * term;

}

printf("result = %f\n", 2*result);

}

参考答案2:

#include

main()

{

float result = 1,term;

int n;

for (n = 1; n <= 50; n++)

{

term = (float)(2*n*2*n)/((2*n-1)*(2*n+1));

result = result * term;

}

printf("result = %f\n", 2*result);

}

3.15

解法一:

#include"stdio.h"

#include "math.h"

main()

{

long t=1;

int i,n=1;

float e=1;

clrscr();

while(1.0/fabs(t)>=1e-5) //判断条件

{

t=1; //初始化阶乘变量

for(i=1;i<=n;i++) //计算阶乘

t=t*i;

e=e+1.0/t;

n++; //为计算下一个阶乘做处理}

printf("e=%f\n",e);

}

解法二:

#include "stdio.h"

#include "math.h"

/*自定义函数,计算n! */

long fact(int n)

{

int i;

long y=1;

for(i=1;i<=n;i++)

y*=i;

return y;

}

main()

{

float e=1.0,t=1.0;

int n=1,count=0;

while(fabs(t)>=1e-5)

{

e=e+t;

n=n+1;

t=1.0/fact(n);

count++; /*计数*/

}

printf("e=%f\n",e);

printf("counter:%d",count); }

3.16

#include "stdio.h"

#include "math.h"

/*定义求平方根函数*/

float fsqrt(float a)

{ float x0, x1;

x1=a/2;

do{

x0=x1;

x1=0.5*(x0+a/x0);

}while(fabs(x1-x0)>0.00001); return(x1);

}

/*主函数*/

main()

{ float a;

scanf("%f", &a);

printf("gen hao =%f\n", fsqrt(a)); }

3.17 有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

1.程序分析:请抓住分子与分母的变化规律。

2.程序源代码:

main()

{

int n,t,number=20;

float a=2,b=1,s=0;

for(n=1;n<=number;n++)

{

s=s+a/b;

t=a;a=a+b;b=t;/*这部分是程序的关键*/

}

printf("sum is %9.6f\n",s);

}

3.19

#include "stdio.h"

#include "math.h"

main()

{

int n=1;

long int t=1,sum=0;

while(sum<=10000)

{

t=pow(n,n);

sum=sum+t;

n=n+1;

}

printf("%d\n",n);

printf("%ld",t);

}

3.21

#include "stdio.h"

main()

{

int man,woman;

for(man=1;man<=16;man++)

for(woman=1;woman<=24;woman++)

if(3*man+2*woman+(30-man-woman)==50)

{

printf("man=%d ",man);

printf("woman=%d ",woman);

printf("child=%d",30-man-woman);

printf("\n");

}

}

3.22

#include

main()

{

int i,j,k;

for(i=1;i<=26;i++) /* 控制输出行数*/

{

for(j=25;j>=i;j--) /* 控制每行输出空格*/

{

printf(" ");

}

for(k=1;k<=i;k++) /* 控制每行输出的字母*/

{

printf(" %c",96+k);

}

printf("\n");

}

}

3.23

#include "stdio.h"

main()

{

int i,j,k;

for(i=1;i<=9;i++) /* 控制输出行数*/

{

for(j=9;j>=i;j--) /* 控制每行输出空格*/

{

printf(" "); /* 两个空格*/

}

for(k=1;k<=i;k++) /* 控制每行输出的数字(左半边),从第一行开始输出*/ {

printf("%d ",k);

}

for(k=i-1;k>=1;k--) /* 控制每行输出的数字(右半边),且是从第二行开始输出*/ { /* 或者用for(k=i-1;k0;k--) */

printf("%d ",k);

}

printf("\n");

}

}