习题4-8 高空坠球 (20 分)
皮球从某给定高度自由落下,触地后反弹到原高度的一半,再落下,再反弹,……,如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反弹的高度是多少?
输入格式:
输入在一行中给出两个非负整数,分别是皮球的初始高度和n,均在长整型范围内。
输出格式:
在一行中顺序输出皮球第n次落地时在空中经过的距离、以及第n次反弹的高度,其间以一个空格分隔,保留一位小数。题目保证计算结果不超过双精度范围。
输入样例:
33 5
输出样例:
94.9 1.0
程序 不解释
#include "stdio.h"
int main()
{
int i,n;
double high,dis=0.0;
scanf("%lf%d",&high,&n);
dis=high;
for(i=1;i<n;i++)
{
dis+=high;
high/=2.0;
}
printf("%.1lf %.1lf\n",dis,high/2);
return 0;
}
习题4-9 打印菱形图案 (15 分)
本题要求编写程序,打印一个高度为n的、由“*”组成的正菱形图案。
输入格式:
输入在一行中给出一个正的奇数n。
输出格式:
输出由n行星号“*”组成的菱形,如样例所示。每个星号后跟一个空格。
输入样例:
7
输出样例:
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
#include "stdio.h"
int main()
{
int i,j,k,n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
if(i<=n/2) //输出中心线及以上部分
{
for(j=n/2;j>i;j--) printf(" "); //输出空格
for(k=0;k<i*2+1;k++) printf("* ");//输出 ‘*’
printf("\n");
}
else //输出中心线以下部分
{
for(j=i;j>n/2;j--) printf(" ");//输出空格
for(k=0;k<(n-i)*2-1;k++) printf("* ");//输出 ‘*’
printf("\n");
}
}
return 0;
}
习题4-10 猴子吃桃问题 (15 分)
一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?
输入格式:
输入在一行中给出正整数N(1<N≤10)。
输出格式:
在一行中输出第一天共摘了多少个桃子。
输入样例:
3
输出样例:
10
#include "stdio.h"
int main()
{
int i,n,res=1; //res记录第N天剩下的桃子
scanf("%d",&n);
for(i=n-1;i>0;i--) //循环n-1次
res=(res+1)*2; //计算出第一天摘得桃子数量
printf("%d\n",res); //输出结果
return 0;
}
习题4-11 兔子繁衍问题 (15 分)
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
输入格式:
输入在一行中给出一个不超过10000的正整数N。
输出格式:
在一行中输出兔子总数达到N最少需要的月数。
输入样例:
30
输出样例:
9
#include "stdio.h"
int main()
{
//繁衍规律是 1 1 3 5 8 13 21...... 每天兔子的数量都是前两天数量之和
int i,n,sub1=1,sub2=1,t;
//sub1 当天兔子的数量 sub2 前一天兔子的数量 t 临时存储当天兔子的数量
scanf("%d",&n);
for(i=3;;i++) //循环
{
t=sub1;
sub1+=sub2;
sub2=t;
if(sub1>=n) break; //达到数量则停止增加,得到天数 i
}
printf("%d\n",i); //输出结果
//printf("第 %d 天兔子的数量:%d\n",i,sub1); //输出当天兔子的数量
return 0;
}
习题6-7 简单计算器 (20 分)
模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式:
输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式:
在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
输入样例:
1+2*10-10/2=
输出样例:
10
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main()
{
int x,i=0,j=0,m=0,a[100]={0};
char c[100]={0},y,b[100]={0},*p;
//获取表达式,存入b[]
p=b; //指针指向字符串数组
while((y=getchar())!='=')
*p++=y;
p=b; //指针回字符串首地址
//将数字和计算符号分开存储到 a[]数组 和 c[] 字符串
while(*p!='\0')
{
x=*p-'0'; //将输入的字符逐一转换为 ascii码 与 '0'比较,
if(x>=0&&x<=9) //连续的数字字符转化为 int 数据
{
m=m*10+x; //每获取一个 int数据 加到 m*10
p++; //指针移到下一个字符
}
else //不是数字字符 则将已经得到的数字存储在 a[] 数组中,非数字字符存储在 c[] 字符串中
{
a[j]=m; //得到的数字存储在 a[] 数组中
c[j]=*p; //得到的非数字字符存储在 c[] 字符串中
m=0; //回初始值,为下一个数据做准备
j++; //下标 +1
p++; //指针移到下一个字符
}
}
a[j]=m; //得到的最后一个数字存储到 a[] 数组中
//以下按顺序开始计算
m=a[0]; //将计算结果存储在 m 中,第一个数值 a[0] 赋给 m
for(i=0;i<=j;i++)
{
if(c[i]=='\0') //没有符号,输出计算结果
{
printf("\n%d\n",m); return 0;
}
else if(c[i]=='+') m+=a[i+1]; //加法计算
else if(c[i]=='-') m-=a[i+1]; //没减法计算
else if(c[i]=='*') m*=a[i+1]; //乘法计算
else if(c[i]=='/'&&a[i+1]!=0) m/=a[i+1]; //除数不为 ‘0’ ,除法计算
else //除数为 ‘0’ ,或者非法运算符 输出 "ERROR"
{
printf("\nERROR\n"); return 0;
}
}
}
拓展部分1:先乘除后加减(整数计算)
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/*声明函数**定义全局变量*/
void shuru(char *pb); //获取表达式
void fenzu(int *pa,char *pb,char *pc); //拆分表达式
void youxian(int *pa,char *pb,int n); //处理优先级计算
void zhcjs(int *pa,char *pb,char *pc,int n); //最终计算及输出
int count=0;//定义全局变量 count 用来记录 计算次数
menu_0() //提示信息
{
printf("\n***********简单计算器***************\n\n");
printf("\t【】任意键开始计算\n\t【】退出 e \n\n");
printf("**********计算表达式以'='结束*********\n\n");
}
int main()
{
if(count==0) //提示信息只显示 1 次
menu_0();
int a[100]={0},n;
char b[100]={0},c[100]={0},y;
//printf("exit ?\n\n") ;
y=getchar();
if(y=='e') exit(0); //获取字符,'e' 则退出
fflush(stdin); //清除缓存,准备接收表达式
shuru(b);
fenzu(a,b,c);
n=strlen(c);
youxian(a,c,n);
zhcjs(a,b,c,n);
}
/***************** 获取表达式,存入b[] **********/
void shuru(char *pb)
{
char y;
printf("表达式:");
while((y=getchar())!='=')
*pb++=y;
printf("\n\n");
}
/*****************将数字和计算符号分开存储到 a[]数组 和 c[] 字符串 **********/
void fenzu(int *pa,char *pb,char *pc)
{
int x,m=0,j=0;
while(*pb!='\0')
{
x=*pb-'0'; //将输入的字符逐一转换为 ascii码 与 '0'比较,
if(x>=0&&x<=9) //连续的数字字符转化为 int 数据
{
m=m*10+x;//每获取一个 int数据 加到 m*10
pb++; //指针移到下一个字符
}
else//不是数字字符 则将已经得到的数字存储在 a[] 数组中,非数字字符存储在 c[] 字符串中
{
*(pa+j)=m; //得到的数字存储在 a[] 数组中
*(pc+j)=*pb;//得到的非数字字符存储在 c[] 字符串中
m=0; //回初始值,为下一个数据做准备
j++; //下标 +1
pb++; //指针移到下一个字符
}
}
*(pa+j)=m; //得到的最后一个数字存储到 a[] 数组中
}
/*****************处理优先计算 '*' '/' *******************/
//将乘除运算的结果存储到运算符号之后的数值所在空间,前面的数值清零 ,符号位赋值 '+'
void youxian(int *pa,char *pc,int n)
{
int i;
for(i=0;i<=n;i++)
{
if(*(pc+i)=='*') //乘法计算
{
*(pa+i+1)=*(pa+i) * *(pa+i+1);//所得数值赋给后面可以继续参与后续乘除运算
*(pa+i)=0;
if(*(pc+i-1)=='-')
*(pc+i)='-';
else
*(pc+i)='+';
}
if(*(pc+i)=='/'&&*(pa+i+1)!=0) //除数不为 ‘0’ ,除法计算
{
*(pa+i+1)=*(pa+i) / *(pa+i+1);//所得数值赋给后面可以继续参与后续乘除运算
*(pa+i)=0;
if(*(pc+i-1)=='-')
*(pc+i)='-';
else
*(pc+i)='+';
}
}
}
/********************以下按顺序开始计算*******************************/
void zhcjs(int *pa, char *pb, char *pc, int n)
{
int i,m;
m=*(pa+0); //将计算结果存储在 m 中,第一个数值 a[0] 赋给 m
for(i=0;i<=n;i++)
{
if(*(pc+i)=='\0') //没有符号,输出计算结果
{
printf("计算结果: %d\n\n",m);
}
else if(*(pc+i)=='+') m+=*(pa+i+1); //加法计算
else if(*(pc+i)=='-') m-=*(pa+i+1); //没减法计算
else if(*(pc+i)=='*') m*=*(pa+i+1); //乘法计算
else if(*(pc+i)=='/'&&*(pa+i+1)!=0) m/=*(pa+i+1);//除数不为 ‘0’ ,除法计算
else //除数为 ‘0’ ,或者非法运算符 输出 "ERROR"
{
printf("\nERROR\n\n");break;
}
}
count++;
fflush(stdin);
main();
}
拓展部分2:先乘除后加减(实数计算,结果保留2位小数)
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/*声明函数**定义全局变量*/
void shuru(char *pb); //获取表达式
void fenzu(double *pa,char *pb,char *pc);//拆分表达式
void youxian(double *pa,char *pb,int n);//处理优先级计算
void zhcjs(double *pa,char *pb,char *pc,int n); //最终计算及输出
int count=0; //定义全局变量 count 用来记录 计算次数
menu_0()//提示信息
{
printf("\n***********简单计算器***************\n\n");
printf("\t【】任意键开始计算\n\t【】退出 e \n\n");
printf("********计算表达式以'='结束**********\n\n");
}
int main()
{
if(count==0) //提示信息只显示 1 次
menu_0();
double a[100]={0},n;
char b[100]={0},c[100]={0},y;
//printf("exit ?\n\n") ;
y=getchar();
if(y=='e') exit(0); //获取字符,'e' 则退出
fflush(stdin); //清除缓存,准备接收表达式
shuru(b);
fenzu(a,b,c);
n=strlen(c);
youxian(a,c,n);
zhcjs(a,b,c,n);
}
/***************** 获取表达式,存入b[] **********/
void shuru(char *pb)
{
char y;
printf("表达式:");
while((y=getchar())!='=')
*pb++=y;
printf("\n\n");
}
/*****************将数字和计算符号分开存储到 a[]数组 和 c[] 字符串 **********/
void fenzu(double *pa,char *pb,char *pc)
{
double x,m=0;
int j=0;
while(*pb!='\0')
{
x=*pb-'0'; //将输入的字符逐一转换为 ascii码 与 '0'比较,
if(x>=0&&x<=9) //连续的数字字符转化为 int 数据
{
m=m*10+x;//每获取一个 int数据 加到 m*10
pb++;//指针移到下一个字符
}
else//不是数字字符 则将已经得到的数字存储在 a[] 数组中,非数字字符存储在 c[] 字符串中
{
*(pa+j)=m;//得到的数字存储在 a[] 数组中
*(pc+j)=*pb;//得到的非数字字符存储在 c[] 字符串中
m=0; //回初始值,为下一个数据做准备
j++; //下标 +1
pb++; //指针移到下一个字符
}
}
*(pa+j)=m;//得到的最后一个数字存储到 a[] 数组中
}
/*****************处理优先计算 '*' '/' *******************/
//将乘除运算的结果存储到运算符号之后的数值所在空间,前面的数值清零 ,符号位赋值 '+'
void youxian(double *pa,char *pc,int n)
{
int i;
for(i=0;i<=n;i++)
{
if(*(pc+i)=='*') //乘法计算
{
*(pa+i+1)=*(pa+i) * *(pa+i+1);//所得数值赋给后面可以继续参与乘除运算
*(pa+i)=0;
if(*(pc+i-1)=='-')
*(pc+i)='-';
else
*(pc+i)='+';
}
if(*(pc+i)=='/'&&*(pa+i+1)!=0) //除数不为 ‘0’ ,除法计算
{
*(pa+i+1)=*(pa+i) / *(pa+i+1);//所得数值赋给后面可以继续参与乘除运算
*(pa+i)=0;
if(*(pc+i-1)=='-')
*(pc+i)='-';
else
*(pc+i)='+';
}
}
}
/********************以下按顺序开始计算*******************************/
void zhcjs(double *pa, char *pb, char *pc, int n)
{
int i;
double m;
m=*(pa+0); //将计算结果存储在 m 中,第一个数值 a[0] 赋给 m
for(i=0;i<=n;i++)
{
if(*(pc+i)=='\0') //没有符号,输出计算结果
{
printf("计算结果: %.2lf\n\n",m); //精度保留 2 位小数,可修改
}
else if(*(pc+i)=='+') m+=*(pa+i+1); //加法计算
else if(*(pc+i)=='-') m-=*(pa+i+1); //没减法计算
else if(*(pc+i)=='*') m*=*(pa+i+1); //乘法计算
else if(*(pc+i)=='/'&&*(pa+i+1)!=0) m/=*(pa+i+1);//除数不为 ‘0’ ,除法计算
else //除数为 ‘0’ ,或者非法运算符 输出 "ERROR"
{
printf("\nERROR\n\n");break;
}
}
count++;
fflush(stdin);
main();
}
习题6-8 统计一行文本的单词个数 (15 分)
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let's go to room 209.
输出样例:
5
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
main()
{
char a[100]={0},*p;
int count=0;
gets(a);//获取字符串
p=a;//指针指向获取字符串首地址
while(*p!='\0')//遍历字符串
{
if(*p==' ')//遇到空格
{
while(*p==' ')//遇到空格,指针下移,直到遇到非空格
{
p++;
}
}
else
{
while(*p!=' '&&*p!='\0') //遇到非空格,指针下移 ,直到遇到空格
{
p++;
}
count++;//计数 +1
}
}
printf("%d\n",count);//输出计数参量
return 0;
}