1.6
计分系统
张三老师在计分时, 希望大家尽量不挂科, 于是想出了一套绝妙的计分方式
试卷一共有40道题目
正确数量在0~10时, 每题有6分
正确数量在11~20时, 第11~20题 每题2分
正确数量在21~40时, 第21~40题 每题1分
设计一个持续, 输入学生做对题目的数量, 输出分数
输入: 整数n(0<=n<=40), 表示张三回答正确的题目数量
输出: 一个整数, 表示张三获得的分数
样例输入:
40
样例输出
100
样例输入:
10
样例输出:
60
#include <stdio.h>
#include <stdlib.h>
int main(){
int z=0,k=0;
int i=0,num=0;
//输入大于0的整数
while(scanf("%d",&z)>0){
//当z大于40时终止循环
if(z>40) break;
//正确题数大于20时
if(z>20){
k=z-20;
num=80+k;
printf("%d\n",num);
printf("\n");
}
//正确题数不大于20且大于10时
else if(z>10){
k=z-10;
num=60+k*2;
printf("%d\n",num);
printf("\n");
}
//正确题数不大于10时
else{
num=6*z;
printf("%d\n",num);
printf("\n");
}
}
}
1.7
- 简述一下switch的语法, switch支持哪些类型的值
- 什么是switch的穿透
- 实际开发中 通常哪些判断使用if 哪些判断使用switch
1.switch语句是一种多路判断语句,它测试表达式是否与一些常量整数值中的某一个值匹配,并执行相应的分支动作。switch后面的表达式语句只能是整型或者字符类型。
2.穿透性:在switch中,如果匹配上一个case的值,一直向后运行,直到遇到break;
特性:
先判断是否有值和case 相同,相同就一直执行下去,直到遇到break;退出,或者执行到底部
如果没有值与case相同,则执行default,再执行下去,直到遇到break;或者执行到底部
3.判断表达式内容,为真就执行语句用if。
有多个条件分支的判断,方便对大量的值进行判断。
(感觉switch和else if用法差不多,都是多路判断,相比之下,switch只是多了break语句,可以强制控制循环退出。不知道我这个看法对不对,,
)就是感觉if用的随意一些,switch用的省事一些。
1.8
设计一个程序, 给定一个整数n(0<n<100000)和一个选择, 输出对应的结果
选择1: 求n是几位数
选择2: 分别输出n的每一位数字
选择3: 将n反转后输出
样例输入:
123
1
样例输出:
3
样例输入:
123
2
样例输出
1, 2, 3
样例输入:
123
3
样例输出:
321
#include <stdio.h>
#include <stdlib.h>
//设计一个程序, 给定一个整数n(0<n<100000)和一个选择, 输出对应的结果
int main(){
int z=0,n=0;
int i=0;
printf("请输入一个整数n(0<n<100000)\n");
scanf("%d",&z);
int a,b,c,d,e,f,g;
a=z/10000; //万位
b=z%10000/1000; //千位
c=z%1000/100; //百位
d=z%100/10; //十位
e=z%10; //个位
printf(" case 1:求n是几位数 \n");
printf(" case 2:分别输出n的每一位数字\n ");
printf(" case 3:将n反转后输出\n ");
printf(" case 0:结束 \n");
n=1;
while( n!=0){
scanf("%d",&n);
switch(n)
{
//求n是几位数
case 1:
i=(int)log10(z)+1;
printf("%d\n",i);
printf("\n");
break;
//分别输出n的每一位数字
case 2:
f=a*10000+b*1000+c*100+d*10+e*1;
printf("%d\n",f);
printf("\n");
break;
//将n反转后输出
case 3:
if(a!=0)
{ printf("%d%d%d%d%d\n",e,d,c,b,a);
printf("\n");
}
else if(b!=0)
{ printf("%d%d%d%d\n",e,d,c,b);
printf("\n");
}
else if(c!=0)
{ printf("%d%d%d\n",e,d,c);
printf("\n");
}
else if(d!=0)
{ printf("%d%d\n",e,d);
printf("\n");
}
else if(e!=0)
{
printf("%d\n",e);
printf("\n");
}
break;
case 0: break;
default:
printf("请重新输入选择case n(0<n<4)!\n");
printf("\n");
break;
}
}
return 0;
}
1.11
张三上班
张三在上班途中, 可以选择走路和汽车两种方式
但他不清楚哪种方式比较快, 因为骑车需要找车, 开锁, 停车 需要耽搁很多时间.
设找到自行车, 开锁, 骑上自行车需要花27秒, 停车需要花23秒
步行每秒1.2米, 骑车每秒3.0米
给出张三距离公司的距离, 请问是骑车快还是走路快.
输入:
一个整数, 表示到公司的距离
输出:
如果骑车快, 输出"建议骑车"
如果走路快, 输出"建议走路"
如果一样快, 输出"骑车或走路都行"
#include <stdio.h>
#include <stdlib.h>
int main(){
int n=0;
double a,b;
printf("请输入一个整数,表示到公司的距离:\n");
scanf("%d",&n);
//骑车
a=(150+n)/3.0;
//步行
b=n/1.2;
printf("骑车用时:%lf\n",a);
printf("步行用时:%lf\n",b);
if((a-b)<0.1&&-0.1<(a-b)){
a=b;
}
if(a>b){
printf("建议步行\n");
}else if(a<b)
{
printf("建议骑车\n");
}else if(a==b){
printf("骑车或走路都行\n");
}
return 0;
}
1.12
简述一下for; while; do while;的语法,
它们有什么区别, 条件和代码块的执行顺序分别是怎样的.
实际开发中, 这三种循环分别适用哪种情况
break和continue有什么作用,
怎么使用break跳出嵌套循环
一、for语句是一种循环语句,是对while语句的推广,for语句的操作更加直观一些。for语句比较适合初始化和增长步长都是单条语句并且逻辑相关的情形,因为它将循环语句放在一起,且比while语句更紧凑。
for表达式1是赋值,表达式2是关系表达式,表达式3函数调用
先表达式1后表达式2然后运行for循环语句,最后表达式3
若语句中需要执行简单的初始化或变量递增,用for更合适一些,for将循环控制语句集中放在循环的开头,结构更紧凑清晰。
二、while语句首先测试圆括号内的条件,若为真,则执行循环体,再重新测试圆括号内的条件,为真则继续执行循环体;当圆括号内条件测试结果为假,循环结束。并继续执行while语句之后的下一条语句。若没有初始化或重新初始化的操作,用while更自然些。
三、do-while语句先执行循环体语句,然后再判断,与while语句相比,前者不论条件是否成立,总会先运行一次,然后再判断是否继续循环。
比如计算某道题结果,根据结果再判断是否运行,这时候就用dowhile。
四、break可用于从for、while、dowhile等循环语句中提前退出,如同跳出switch一样,可以立刻跳出该层循环。break无法跳出嵌套循环,只能跳出一层循环。或者每一层都用一个break可以跳出,优点是内存安全不泄露。
continue可使for、while、dowhile语句开始下一次循环的执行。在while和dowhile中,continue意味着立刻执行测试部分。在for循环中,则意味使控制转移到递增循环变量部分。continue只用于循环语句,不用于switch语句。某个循环包含的switch语句中的continue语句,将导致进入下一次循环。
1.13
求平均年龄
老九学堂有老师若干名, 给出每个老师的年龄, 求老九学堂所有老师的平均年龄, 保留小数点后两位
输入:
第一行: 整数n(1<n<100), 表示老师人数
之后n行: 每行一个整数a(15<a<55), 表示第n个老师的年龄
输出:
一个浮点数, 保留两位小数. 表示全体老师的平均年龄
样例输入:
3
18
18
17
样例输出:
17.67
#include <stdio.h>
#include <stdlib.h>
int main(){
int n,i;
int num=0;//老师年龄之和
int a;
float age;//老师年龄平均值
while(1){
printf("请输入老九学堂的老师人数:");
scanf("%d",&n);//n为老师人数
if(n< 2){
printf("老九学堂老师不小于2个哦!\n");
}
else if(n > 100)
{
printf("老九学堂老师不超过100个哦!\n");
}else{
for(i=0;i<n;i++){
printf("请输入第%d个老师的年龄:",i+1);
scanf("%d",&a);
while(a<15||a>55)
{
printf("老九学堂老师年龄在15~55哦!\n");
printf("请输入第%d个老师的年龄:",i+1);
scanf("%d",&a);
}
num=num+a;
}
//continue;
}
break;
}
age=1.0*num/n;
printf("老师们的平均年龄为:%.2f",age);
return 0;
}
1.14
有一口深度为h的井, 井底有一只小青蛙 它白天可以向上爬u米, 而晚上会下滑d米
设计一个程序输入高度, 白天向上爬的距离, 晚上下滑的距离 计算出小青蛙需要多少天才能从井底爬出来
样例输入:
12 3 2
样例输出:
10
#include <stdio.h>
#include <stdlib.h>
main() {
int h, u, d;
int i;
do{
printf("输入井高度, 青蛙白天向上爬的距离, 晚上下滑的距离 ");
scanf_s("%d %d %d",&h,&u,&d);
for (i = 1;; i++)
{
if (u<d)
{
if(u>h)
{
printf("青蛙今天就可以爬出去啦\n");
break;
}else{
printf("哇,青蛙永远都爬不上去了!\n");
break;
}
}
if (h == u)
{
printf("青蛙%d天就可以爬出去啦\n", i);
break;
}
else
h = h - u + d;
}
}while(h>u);
return 0;
}
1.19
求最大值
张三有一堆数字, 他想知道这些数字中哪个数最大
输入:
第一行: n(0<n<100, 表示有n个整数)
第二行~第n+1行: 每行一个整数An(-1000<=An<=1000) 表示张三的数字
输出: 这些数字中最大的那个数
样例输入:
8
32
45
564
78
123
73
-47
3
样例输出:
564
#include <stdio.h>
#include <stdlib.h>
int main() {
int a,b=0,max=0;
int i,n;
do{
printf("请输入n(0<n<100), 表示有n个整数:");
scanf("%d",&n);
if(n<=0||n>=100){
printf("请输入n(0<n<100)哦!\n");
continue;
}
for(i=0;i<n;i++){
printf("请输入第%d行:",i+1);
scanf("%d",&a);
if(a>-1000&&a<1000)
{ b= max-a;
if(b<0){
max=a;
}
}
else{
printf("请注意每行一个整数范围是(-1000<=An<=1000)哦!\n");
continue;
}
}
printf("这些数字中最大的那个数是:%d",max);
break;
}while(-1);
return 0;
}
1.25
开小差的张三
张三上课时走神, 在作业上写了很多222222222222222 结果被老师发现了
张三连忙掩饰说自己在算2+22+222+2222+22222的和,
老师很欣慰, 问他算出来没有
张三很困扰, 因为草稿纸写满了2 已经不够用了
大家快帮帮张三吧
设计一个程序, 输入n和a 求Sn
Sn = a + aa + aaa + … + aaaaa(n个a)
输入: 两个整数n, a
(1<n<9), (1<=a<=9)
输出:
Sn的值
样例输入:
5 2
样例输出:
24690
样例解析: Sn = 2 + 22 + 222 + 2222 + 22222 = 24690
样例输入:
4 5
样例输出:
6170
(解析: Sn = 5 + 55 + 555 + 5555)
#include <stdio.h>
#include <math.h>
int main ()
{
int n,a,i,m;
int b=0,sum=0;
do{
hui:
printf("请输入两个整数n(1<n<9)和a(1<=a<=9):\n");
scanf_s("%d %d",&n,&a);
if(n<=1||n>=9)
{
printf("输入错误,请重新输入 !!!\n(注意n的范围是1<n<9哦!)\n");
goto hui;
}
if(a<1||a>9)
{
printf("输入错误,请重新输入 !!!\n(注意a的范围是1<=a<=9哦!)\n");
goto hui;
}
for(i=0;i<n;i++)
{
b=b+a*(int)(pow(10,i)+0.5);
sum=sum+b;
}
printf("%d\n",sum);
lai:
printf("(是否继续,继续请按1,退出请按0)\n");
scanf_s("%d",&m);
if(m==1)
goto hui;
else if(m==0)
break;
else{
printf("输入错误,请重新输入0或1 !!!\n");
goto lai;
}
}while(-1);
return 0;
}
1.26
水仙花数
某个三位数 其各位数字的立方和等于该数字本身, 这个数字便是水仙花数
例如153 = 1^3 + 5^3 + 3^3
样例输入: 无
样例输出:
153
370
…
#include <stdio.h>
#include <math.h>
int main ()
{
printf("输出水仙花数:\n");
int i;
int a,b,c;
for( i=100 ; i<1000; i++){
a = i%10;
b= i/10%10;
c = i/10/10%10;
if(i==(pow(a,3)+pow(b,3)+pow(c,3)))
printf("%d\n", i);
}
return 0;
}
1.27
公因数与公倍数
设计一个程序, 输入两个整数n,m.
输出它们的最大公因数和最小公倍数
样例输入:
10, 15
样例输出:
5, 30
#include <stdio.h>
#include <math.h>
/*
公因数与公倍数
设计一个程序, 输入两个整数n,m.
输出它们的最大公因数和最小公倍数
样例输入:
10, 15
样例输出:
5, 30
*/
int main ()
{
int m, n, a, b;
printf("使用相减法求算\n");
printf("请输入两个整数:\n"); // a, b不相等,大数减小数,直到相等为止
scanf("%d%d", &a, &b);
m = a;
n = b;
if (a <= 0 || b <= 0)
{
printf("输入有误,请重新输入:\n");
scanf("%d%d", &a, &b);
m = a;
n = b;
}
while (a != b)
{
if (a > b)
a = a - b;
else
b = b - a;
}
printf("最大公约数为:%d\n", a);
printf("最小公倍数为:%d\n", m*n / a);
return 0;
}
1.28
高空抛物
爱学习的好孩子张三为了探究神秘的物理现象, 从高楼抛下一个弹球. 但由于高空抛物被警察抓了, 请各位小伙伴完成他未实现的心愿.
小球从某一高度落下,每次落地后反跳回原来高度的一半,再落下。
输入弹球的初始高度M, 输出弹球第N次回弹时的高度 和所经过的距离(保留两位小数)
样例输入
1000 5
样例输出
31.25
2906.25
#include <stdio.h>
int main ()
{
int i,n,b=0;
double a=0,sum=0,c=0;
double m;
/*备注:开始scanf输入m用的是%f结果总是无法正确显示,一气之下新建个double型c用来计算,,
后来发现用%lf就行,float为%f,double为%lf,平时输出用long float 就是double习惯了(%f)(也可已用)
,,,,记个教训,敲代码不要图省事,要严谨*/
printf("输入弹球的初始高度M, 输出弹球第N次回弹:\n");
scanf_s("%lf %d",&m,&n);
c=1.0*m;
for(i=0;i<n;i++)//计算
{
a=c/2;
sum=sum+c+a;
c=a;
b++;
printf("第%d次弹跳高度为:%.2f\t所经过的距离为:%.2f\n",i+1,a,sum);
}
printf("弹球第%d次回弹时的高度为:%.2f\n\t 所经过的距离为:%.2f\n",b,a,sum);
return 0;
}
1.29
长寿的兔子
张三家里养了一对刚出生的兔子, 兔子出生第3个月起每月都会生一对小兔子. 小兔子出生后第三个月起也会每月生一对兔子
张三想知道 如果兔子不死 n月后家里会有多少对兔子
样例输入: 7
样例输出:13
样例输入: 12
样例输出: 144
#include <stdio.h>
#include <math.h>
main()
{
int i,n;
//声明递归函数
int func();
do{
printf("请输入第n(大于2)个月,以便求兔子对数:\n");
scanf_s("%d",&n);
printf("第%d个月的兔子对数:%d\n", n, func(n));
printf("(退出请输入0)\n");
if(n == 0){
break;
}
}while(-1);
return 0;
}
// 定义递归函数
int func(int x) {
if (x - 2 == 0) return 1;//月数为2时,第二个数为1
else if(x - 1 == 0) return 1;//月数为1时,第一个数为1
else if(x > 2)//从第三个数开始,每一个数是前两个数的和
{
return func(x - 1) + func(x - 2);//尾递归调用函数
}
}