项目1 位乘大于位和
输出1至100之间每位数的乘积大于每位数的和的数
代码一:
/**
*Copyright @2018,优快云学院
*All rights reserved.
*文件名称:main.c
*作 者:袁生
*完成日期:2018年1月22日
*版 本 号:v1.0
*问题描述:输出1至100之间每位数的乘积大于每位数的和的数
*/
#include <stdio.h>
int main()
{
int a,b,m,i=0;
m=1;
while (m<100)
{
if (m>=10)
{
a=m/10;
b=m%10;
if (a*b>a+b)
{
printf("%d\t",m);
i++;
if (i%5==0)
printf("\n");
}
m++;
}
else
m++;
}
return 0;
}
代码二(参考了http://blog.youkuaiyun.com/sxhelijian/article/details/45113615)
/**
*Copyright @2018,优快云学院
*All rights reserved.
*文件名称:main.c
*作 者:袁生
*完成日期:2018年1月22日
*版 本 号:v1.1
*问题描述:输出1至100之间每位数的乘积大于每位数的和的数
*/
#include <stdio.h>
int main()
{
int i,j,k,s,count=0;
i=1;
while (i<100)
{
k=1;
s=0;
j=i;
while (j>0)
{
k*=j%10; //求各位数乘积
s+=j%10; //求各位数之和
j/=10;
}
if (k>s)
{
printf("%d\t",i);
count++;
if (count%5==0)
printf("\n");
}
i++;
}
return 0;
}
运行结果
小结
代码二比代码一灵活,代码二适用范围广,为多位数的各位数求和与求乘积提供了新思路,代码一具有专用性(改动范围则程序修改量大)
项目2 乘法口诀表
编程序,输出一个乘法口诀表,形如
代码
/**
*Copyright @2018,优快云学院
*All rights reserved.
*文件名称:main.c
*作 者:袁生
*完成日期:2018年1月22日
*版 本 号:v1.0
*问题描述:输出一个乘法口诀表
*/
#include <stdio.h>
int main()
{
int i,j;
printf("九九乘法表:\n");
for (i=1;i<=9;i++)
{
for (j=1;j<=i;j++)
{
printf("%d×%d=%d ",i,j,i*j);
if (i==j)
printf("\n");
}
}
return 0;
}
运行结果
小结
优化:内循环中的if语句可移动到循环外,大大降低运算量(内循环不再每次都判断了)。
项目3 单位转换对照表
编程序生成一张从英尺到米的转换表(1米大约等于3.28英尺),以方便工厂里工人师傅使用。输出形式如下图所示,罗列了从0英尺到99英尺对应的米数,即第i行第j列的值vij代表i*10+j英尺对应的米数。例如,通过下图所示,我们可以方便地查到17英尺相当于5.18米。只输出内容即可,不用考虑表格线。
提示:每输出10英尺的转换表后,另起一行输出。为使输出美观,可以在各项中间用’\t’分隔。
代码
/**
*Copyright @2018,优快云学院
*All rights reserved.
*文件名称:main.c
*作 者:袁生
*完成日期:2018年1月24日
*版 本 号:v1.0
*问题描述:编程序生成一张从英尺到米的转换表(1米大约等于3.28英尺)
*/
#include <stdio.h>
int main()
{
int i,j;
float vij;
printf("Inch2Meter\t");
for (j=0;j<=9;j++)
printf("%d\t",j);
printf("\n");
for (i=0;i<=9;i++)
{
printf("%d\t",i);
for(j=0;j<=9;j++)
{
vij=(10*i+j)/3.28;
printf("%.2f\t",vij);
}
printf("\n");
}
return 0;
}
运行结果
小结
关于printf应用参考printf 格式化输出符号详细说明
代码优化(对输出数据限位,右对齐,采用空格隔开数据,\t单行显示不了):
/**
*Copyright @2018,优快云学院
*All rights reserved.
*文件名称:main.c
*作 者:袁生
*完成日期:2018年1月24日
*版 本 号:v1.1
*问题描述:编程序生成一张从英尺到米的转换表(1米大约等于3.28英尺)
*/
#include <stdio.h>
int main()
{
int i,j;
float vij;
printf("Inch2Meter ");
for (j=0;j<=9;j++)
printf("%6d ",j);//%md;如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
printf("\n");
for (i=0;i<=9;i++)
{
printf("%10d ",i);//Inch2Meter占了10位,i要与之右对齐
//输出有效数字预留为5位,小数占2位,整数占3位
for(j=0;j<=9;j++)
{
vij=(10*i+j)/3.28;
printf("%6.2f ",vij);//%m.nf;输出共占m列,其中有n位小数,若数值宽度小于m左端补空格。
}
printf("\n");
}
return 0;
}
优化后输出:
项目4 大奖赛计分
(1)基本要求:在歌手大奖赛中,有10个评委为参赛的选手打分,分数为1~10分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。
(2)上面的程序只能处理一位选手的成绩,现拓展为多人版。输出当前选手的最后得分后,提示“按任意键计算下一位选手的成绩,退出请选择N:”如果输入的不是N或n,可以为下一位选手计算成绩。
代码
/**
*Copyright @2018,优快云学院
*All rights reserved.
*文件名称:main.c
*作 者:袁生
*完成日期:2018年1月24日
*版 本 号:v1.0
*问题描述:(1)基本要求:在歌手大奖赛中,有10个评委为参赛的选手打分,
*分数为1~10分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数
*的平均值。请编写一个程序实现。
*(2)上面的程序只能处理一位选手的成绩,现拓展为多人版。输出当前选手的
*最后得分后,提示“按任意键计算下一位选手的成绩,退出请选择N:”如果输入
*的不是N或n,可以为下一位选手计算成绩。
*/
#include <stdio.h>
//#include <stdlib.h> //放sys("PAUSE")的头文件
int main()
{
int i,j,n,jn;
char option;
float mark,min,max,sum,av;
while (1)
{
printf("请输入歌手数n和裁判数jn:\n");
scanf("%d%d",&n,&jn);
if (n<1||jn<3)
continue;
break;
}
fflush(stdin); //清缓存
printf("\n");
for (i=1;i<=n;i++)
{
printf("请输入第 %d 位歌手成绩:\n",i);
min=10;
max=1;
sum=0;
j=1;
while (j<=jn) //不用for循环,不然continue运行后j会加1再执行循环体
{
printf("第%d位裁判打分:",j);
scanf("%f",&mark);
if (mark<1||mark>10)
{
printf("请重新输入:\n");
continue;
}
sum+=mark;
max=(max<mark)?mark:max;
min=(min>mark)?mark:min;
j++;
}
printf("\n");
printf("去掉一个最高分:%.2f 去掉一个最低分:%.2f\n",max,min);
sum=sum-max-min;
av=sum/(jn-2);
printf("第 %d 位歌手最后得分:%.2f\n",i,av);
printf("\n");
if (i<n)
{
printf("按任意键计算下一位选手的成绩,退出请选择N:");
//不管按什么键最后都要回车
while ((option=getchar())!='\n'); //清缓存或者用fflush(stdin)
if ((option=getchar())=='n'||option=='N')
break;
fflush(stdin);//再清一次
}
}
return 0;
}
运行结果
小结
- 歌手数和裁判数输入判断容易忽略;
- 处理单个歌手成绩用for循环代替while循环,一旦分数输错会影响输出
- 在任意键继续那一部分,在输入字符前后都有清理程序,另外最后一位歌手计分完毕并不需要输出该提示。