SDUT-程序设计基础-实验2-选择结构
在开始之前,我想要提醒一下大家,在看完答案和解析以后,一定要自己再写一遍,一味的复制粘贴没有任何效果,当然,在解析中有任何看不懂的内容都可以私信我!!
0.if的相关语法
首先,if顾名思义,是如果的意思,即如果满足,即运行,不满足,则跳过。常用的结构,有if,if, else ,if, else if,
else三种不同的用法,相关的使用场景也大不相同
1.首先来讲最简单的if语句 if(a) {
; } a若为0则跳过大括号(如果只有一条语句可以不用加大括号)内语句,若a为非零即运行语句(c中,非零为真,零为假)
2.其次是if else语句也不算太难 if(a) {
; } else {
; } a为0则运行else内语句,a为非零则运行if内语句,非真即假,两部分语句中必然运行其中之一。
3.最后则是if ,else if,else结构 if(a) {
; } else if(b) {
; } else if(c) …… (else {
; }) 这与if ,else的区别在于,可以实现非单条件的选择不再是非真即假的选择结构,同时else可以不加,只需保证在前面选择的过程中,条件能实现全覆盖(或者在题目特定情况下无需全覆盖)即可,同时,并列的结构中有且仅有一条语句能执行,按照顺序结构筛选,直到筛选出能够执行的语句,跳出这个选择结构。
1.sdut-C语言实验-求绝对值(选择结构)
题干如下
从键盘上输入任意一个整数,然后输出它的绝对值!
输入格式:
从键盘上输入任意一个整数。
输出格式:
输出它的绝对值。
输入样例:
在这里给出一组输入。例如:
-4
输出样例:
在这里给出相应的输出。例如:
4
如果在了解if相关语法之后,这个题目就显得非常简单了,我们只需要先判断是否为负数,若是,则改为正的,然后输出结果即可,下面给出两种做题方法。
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a > 0)
printf("%d", a);
else
printf("%d", -a);
return 0;
}
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d" ,&a);
if(a>0)
a = - a;
printf("%d",a);
return 0;
}
2.sdut-C语言实验——整除
题干如下
判断一个数n能否同时被3和5整除。
输入格式:
输入一个正整数n。
输出格式:
如果能够同时被3和5整除,输出Yes,否则输出No。
输入样例:
15
输出样例:
在这里给出相应的输出。例如:
Yes
对于这个题目,我们需要用到一个字符 && 为并 || 为或 典型错误 if(a % 3 = 0 && a % 5 = 0)
我们需要注意,单等于是赋值的意思,双等于是判断是否相等的意思 且对于单等于号 等号左边是变量 等号右边是常量 不可更换 对于双等于号则都可以
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
int m, n;
m = a % 3;
n = a % 5;
if (m == 0 && n == 0)
printf("Yes");
else
printf("No");
return 0;
}
3.sdut-C语言实验-时间间隔
题干如下
从键盘输入两个时间点(24小时制),输出两个时间点之间的时间间隔,时间间隔用“小时:分钟:秒”表示。
如:3点5分25秒应表示为–03:05:25.假设两个时间在同一天内,时间先后顺序与输入无关。
输入格式:
输入包括两行。
第一行为时间点1。
第二行为时间点2。
输出格式:
以“小时:分钟:秒”的格式输出时间间隔。
格式参看输入输出。
输入样例:
12:01:12
13:09:43
输出样例:
在这里给出相应的输出。例如:
01:08:31
对于此题,我们需要的是一点思路的转换,毕竟对于时间60进制的情况下,我们无法直接加减法,使用if语句来判断的话,难度较大。我们可以转换思路,将小时分钟全部换成秒,然后用秒来加减,这样之后,我们就可以把一个六十进制的题目转换成了十进制的题目,就实现了题目难度的降低
#include <stdio.h>
int main()
{
int h1, m1, s1;
int h2, m2, s2;
scanf("%d:%d:%d", &h1, &m1, &s1);
scanf("%d:%d:%d", &h2, &m2, &s2);
int t1 = h1 * 3600 + m1 * 60 + s1;
int t2 = h2 * 3600 + m2 * 60 + s2;
if (t1 > t2)
{
int tmp = t1;
t1 = t2;
t2 = tmp;
}
int delta_t = t2 - t1;
int h, m, s;
h = delta_t / 3600;
m = delta_t / 60 % 60;
s = delta_t % 60;
printf("%02d:%02d:%02d\n", h, m, s);
return 0;
}
4.sdut-C语言实验——求两个整数之中较大者
题干如下
输入两个整数,请编程求其中的较大者。
输入格式:
在一行中输入用空格隔开的两个整数,例如5 9。
输出格式:
输出两个整数之中较大者,输出形式举例:max=9。
输入样例:
在这里给出一组输入。例如:
5 9
输出样例:
在这里给出相应的输出。例如:
max=9
对于这个题目,与前两个题目相比,难度较低,只需要对于输入的两个数字进行大小判断,这里给出两种不同的方法
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
if (a > b)
printf("max=%d", a);
else
printf("max=%d", b);
return 0;
}
#include<stdio.h>
int main()
{
int a, b, max = 0;
scanf("%d %d", &a, &b);
if(a > b)
max = a;
else
max = b;
printf("max=%d",max);
return 0;
}
5.sdut-C语言实验——找中间数
题干如下
输入三个整数,找出其中的中间数。(这里的中间数指的是大小,不是位置。)
输入格式:
输入3个整数。
输出格式:
输出中间数。
输入样例:
在这里给出一组输入。例如:
1 2 3
输出样例:
在这里给出相应的输出。例如:
2
对于这个题目,我们采用的是排序法,即将三个变量的大小关系按照固定的方式排序,例如始终让c成为最大值,始终让a成为最小值,然后需要输出哪个就输出哪个
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if (a > b)
{
int t = a;
a = b;
b = t;
}
if (b > c)
{
int m = b;
b = c;
c = m;
}
if (a > b)
{
int n = a;
a = b;
b = n;
}
printf("%d",b);
return 0;
}
6.sdut-C语言实验——三个数排序
题干如下
输入三个整数x,y,z,请把这三个数由小到大输出。
输入格式:
输入数据包含3个整数x,y,z,分别用逗号隔开。
输出格式:
输出由小到大排序后的结果,用空格隔开。
输入样例:
在这里给出一组输入。例如:
2,1,3
输出样例:
在这里给出相应的输出。例如:
1 2 3
这个题目与上个题目的第二种排序法基本相同,能学会排序法,那这个题就不攻自破了
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d,%d,%d", &a, &b, &c);
if (a > b)
{
int t = a;
a = b;
b = t;
}
if (b > c)
{
int m = b;
b = c;
c = m;
}
if (a > b)
{
int n = a;
a = b;
b = n;
}
printf("%d %d %d", a, b, c);
return 0;
}
7.sdut-C语言实验-求三个整数的最大值
题干如下
请编写程序,输入三个整数,求出其中的最大值输出。
输入格式:
在一行上输入三个整数,整数间用逗号分隔。
输出格式:
输出三个数中的最大值。
输入样例:
在这里给出一组输入。例如:
5,7,9
输出样例:
在这里给出相应的输出。例如:
max=9
对于这个题目,我们给出三种不同的方法
1.对于三个数即以上的大小判断,我们介绍一种算法,打擂法,顾名思义,打擂,不断用输入的数字攻击之前的最大数,大者代替原来数。实际操作过程中,我们一般会定义一个变量max给其赋初始值(注意,此初始值一定是一个极小的数字,在后续过程中一定要有数字大于这个初始值,不然有的时候会出现最后输出初始值的情况就会存在错误),让后面的数不断攻擂,直至最后出现最大数,但打擂法存在一定局限性,只能求出最大值或最小值。
//打擂法可以求max或者min
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d,%d,%d", &a, &b, &c);
int max = -2e9; // 表示2 * 10的9次方, 为max初始化一个极小的数
if(a > max)
max = a;
if(b > max)
max = b;
if(c > max)
max = c;
printf("max=%d", max); //交换完之后c为max
return 0;
}
2.第二种方法,就是上面介绍过的排序法,最后输出最大值就可以,不过就这个题目而言,第一种方法更为简单,但不能泛用,第二种方法更为泛用。
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d,%d,%d", &a, &b, &c);
if (a > b)
{
int t = a;
a = b;
b = t;
}
if (b > c)
{
int m = b;
b = c;
c = m;
}
if (a > b)
{
int n = a;
a = b;
b = n;
}
printf("max=%d",c);
return 0;
}
8.sdut-C语言实验- 相加和最大值
题干如下
输入三个整数a,b,c。并进行两两相加,最后比较相加和的最大值。
输入格式:
输入数据包含三个整数,用空格分开。
输出格式:
输出两两相加后的最大值。
输入样例:
1 2 3
输出样例:
在这里给出相应的输出。例如:
5
对于这个题目,一般来说有两种不同的思路,第一种是比较出两个最大的值出来,然后相加的和一定是最大的和,第二种是直接将两两加和的三个和进行比较,直接比较和的大小,然后判断出最大值
#include<stdio.h>
int main()
{
int a, b, c;
scanf("%d %d %d", &a, &b ,&c);
if (a > b)
{
int t = a;
a = b;
b = t;
}
if (b > c)
{
int m = b;
b = c;
c = m;
}
if (a > b)
{
int n = a;
a = b;
b = n;
}
int max = c + b;
printf("%d", max);
return 0;
}
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
int max = -2e9;
if (a + b > max)
max = a + b;
if (b + c > max)
max = b + c;
if (c + a > max)
max = c + a;
printf("%d", max);
return 0;
}
9.sdut-C语言实验-三位数整数的各位数字
题干如下
本题要求编写程序,输入一个三位数的正整数,并输出它的个位数字、十位数字和百位数字的值。
输入格式:
请输入三位正整数,例如152。
输出格式:
按照以下格式输出:
152 = 个位数字 + 十位数字10 + 百位数字100
如不是三位数,输出“Please input a three digits number.”。
输入样例1:
125
输出样例1:
125 = 5 + 210 + 1100
对于这个题目,与实验一的第九题逆置正整数思路相同,甚至还比它简单,即先将这个三位数里面的个位,十位,百位数提取出来,然后根据题干的意思进行输出即可(详见实验一第九题,这里不再赘述)
#include <stdio.h>
int main()
{
int a , b , c, d;
scanf( "%d" , & a);
if(a>99 && a<1000)
{
b = a / 100;
c = (a % 100 ) / 10;
d = a % 10 ;
printf("%d = %d + %d*10 + %d*100", a , d , c , b);
}
else
printf("Please input a three digits number.");
return 0;
}
10.sdut-C语言实验-虎子算电费
题干如下
为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。
虎子决定编写程序计算一算家里电费。你也会编写这个程序吧?
输入格式:
输入在一行中给出虎子家的月用电量(单位:千瓦时)。
输出格式:
在一行中输出虎子家应支付的电费(元),结果保留两位小数,格式如:“cost = 应付电费值”;若用电量小于0,则输出"Invalid Value!"
对于这个题目,我们需要注意对于题干的理解,小于50的部分可以直接相乘,大于50的部分另外收费,只要理解了题干的意思,这个题就迎刃而解了,注意保留两位小数的输出格式%.2f
#include <stdio.h>
int main()
{
float cost=0.0;
scanf("%f" , & cost);
if(0<=cost && cost <=50)
printf("cost = %.2f", cost * 0.53);
else if(cost>50)
{
float cost2 =( cost - 50 )*0.58;
float cost3 = 50 * 0.53;
printf("cost = %.2f",cost3 + cost2);
}
else if(cost<0)
printf("Invalid Value!");
return 0;
}
11. 计算分段函数[1]
题干如下
本题目要求计算下列分段函数f(x)的值:
公式
y = f(x) = 1/x ,x≠0
y = f(x) = 0 , x = 0
输入格式:
输入在一行中给出实数x。
输出格式:
在一行中按“f(x) = result”的格式输出,其中x与result都保留一位小数。
输入样例1:
10
输出样例1:
f(10.0) = 0.1
输入样例2:
0
输出样例2:
f(0.0) = 0.0
对于这个题目,变量都是浮点型,然后,只需要注意函数的判断条件和输出保留位数即可。
#include <stdio.h>
int main()
{
float x = 0.0;
scanf("%f", &x);
if (x != 0)
{
float result = 1 / x;
printf("f(%.1f) = %.1f", x, result);
}
else
{
float result = 0.0;
printf("f(%.1f) = %.1f", x, result);
}
return 0;
}
12.计算分段函数[2]
题干如下
本题目要求计算下列分段函数f(x)的值:
f(x) = x^0.5,x>=0,
f(x) = (x + 1)^2 + 2x + 1/x, x<0
注:可在头文件中包含math.h,并调用sqrt函数求平方根,调用pow函数求幂。
输入格式:
输入在一行中给出实数x。
输出格式:
在一行中按“f(x) = result”的格式输出,其中x与result都保留两位小数。
输入样例1:
10
输出样例1:
f(10.00) = 3.16
输入样例2:
-0.5
输出样例2:
f(-0.50) = -2.75
这个题目唯一的难点在于math头函数下,sqrt和pow的用法
sqrt(a)–求a的平方根
pow(a,b)–求a的b次方
掌握这两个知识点之后,这个题目也就不难了
#include <stdio.h>
#include <math.h>
int main()
{
float x = 0.0;
scanf("%f" , & x);
if(x>=0)
{
double result = sqrt (x);
printf("f(%.2f) = %.2lf", x , result);
}
else
{
double result = pow( (x+1) , 2);
double result2 = result + 2*x + (1/x);
printf("f(%.2f) = %.2lf", x , result2);
}
return 0;
}
13.sdut-C语言实验-时间格式转换
题干如下
24 小时制的时间格式为 “HH:mm”,如 “05:20”,而 12 小时制的时间格式为 “h:mm AM/PM”,如 “5:20 AM”。
24 小时制到 12 小时制的对应关系如下:
0 时:12 时 (AM)
1~11 时:1~11 时 (AM)
12 时:12 时 (PM)
13~23 时:1~11 时 (PM)
例如:“00:00” 对应 “12:00 AM”,“01:20” 对应 “1:20 AM”,“12:35” 对应 “12:35 PM”,“13:17” 对应 “1:17 PM”,“23:59” 对应 “11:59 PM”。
现在给你一个 24 小时制的时间,请你编写程序将其转换为 12 小时制的时间。
输入格式:
输入只有一行,包含一个 24 小时制的时间。
输出格式:
输出一行,表示转换为 12 小时制以后的时间。其中分钟部分若不足两位需要加 0 补足两位。
输入样例:
在这里给出一组输入。例如:
00:05
输出样例:
在这里给出相应的输出。例如:
12:05 AM
对于这个题目我们首先先介绍一个新知识点,即整型的保留位数和填充 对于整型来说%nd即保留n位数%0nd即保留n位数然后用零补全
其次,这个题目考的主要是对于边界条件的使用,注意对题干的分解和对于输出的控制
#include <stdio.h>
int main()
{
int h, m;
scanf("%d:%d", &h, &m);
int h2 ;
if (h == 0 || h == 12)
h2 = 12;
else if (h <= 11)
h2 = h;
else
h2 = h - 12;
if (h < 12)
printf("%d:%02d AM", h2, m);
else
printf("%d:%02d PM", h2, m);
return 0;
}
14.sdut-C语言实验——输入数字星期,输出英文(switch语句)
题干如下
从键盘上输入数字星期,然后输出它的英文。
其对应关系是:
1 Monday
2 Tuesday
3 Wednesday
4 Thursday
5 Friday
6 Saturday
7 Sunday
如果输入1-7之外的数字,则输出:error
输入格式:
从键盘输入数字星期,输入数字在1-7之间。
输出格式:
输出该数字对应的英文星期表示。
输入样例:
3
输出样例:
在这里给出相应的输出。例如:
Wednesday
我们先来讲一下switch的语法,结构一般如下
switch(a)
{
case 1:
;
break;
case 2:
……
default:
;
}
break可以理解成仅在case语句中的return
0;即跳出这个选择结构,其次,a一定是一个变量,与case后面的数一一对应,是什么就执行那段语句,default可以理解成else,即可加可不加,就是做到对于所有数据的全覆盖,可以根据题干的意思做就可以了
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
switch(n)
{
case 1:
printf("Monday");
break;
case 2:
printf("Tuesday");
break;
case 3:
printf("Wednesday");
break;
case 4:
printf("Thursday");
break;
case 5:
printf("Friday");
break;
case 6:
printf("Saturday");
break;
case 7:
printf("Sunday");
break;
default:
printf("error");
}
return 0;
}
15.sdut-C语言实验——模拟计算器
题干如下
简单计算器模拟:输入两个整数和一个运算符,输出运算结果。
输入格式:
第一行输入两个整数,用空格分开;
第二行输入一个运算符(+、-、*、/)。
所有运算均为整数运算,保证除数不包含0。
输出格式:
输出对两个数运算后的结果。
输入样例:
30 50
*
输出样例:
1500文章来源:https://www.toymoban.com/news/detail-745141.html
这个题的难度主要在于从整型判断改成了字符型判断,其实是一样的,也是使用双等于判断,不过对于字符需要打单引号,底层逻辑是判断两个字符的ASCII值是否相同,将字符型的判断改成了整型的判断,也就不算太难了。文章来源地址https://www.toymoban.com/news/detail-745141.html
#include <stdio.h>
int main()
{
int a, b;
char c = 0;
scanf("%d %d", &a, &b);
getchar();
scanf("%c", &c);
if (c == '+')
printf("%d", a + b);
else if (c == '-')
printf("%d", a - b);
else if (c == '*')
printf("%d", a * b);
else
printf("%d", a / b);
return 0;
}
以上即为实验设计基础-实验2的所有题目题干详细解析和答案,希望同学们能多多思考,一味的复制粘贴没有任何效果,大家学业顺利!!当然,在详解中没有看懂的内容可以私信我!!
到了这里,关于SDUT-程序设计基础-实验2-选择结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!