鸡兔同笼
已知鸡和兔的总数量为n,总腿数为m。输入n和m,依次输出鸡的数目和兔的数目。如果无解,则输出“No answer”(不要引号)。
#include <stdio.h>
int main() {
int n, m; //总数量和总腿数
int x, y; //鸡、兔
printf("请输入总数量和总腿数:\n");
scanf("%d %d", &n, &m);
if (m % 2 != 0 || m < 2 * n || m>4 * n) {
printf("No answer\n");
return 0;
}
x = (4 * n - m) / 2;
y = n - x;
printf("%d %d\n", x, y);
return 0;
}
分析
程序首先提示用户输入总数量和总腿数,然后通过scanf
函数读取输入。接着,程序检查总腿数是否满足“鸡兔同笼”问题的条件,即总腿数m必须为偶数,且大于等于2倍的总数量n,小于等于4倍的总数量n。如果不满足条件,则输出“No answer”。
如果满足条件,则计算鸡和兔的数量。鸡的数量x通过(4 * n - m) / 2
计算得出,兔的数量y通过n - x
计算得出。最后,程序输出鸡和兔的数量。
思路
“鸡兔同笼”问题可以用以下两个方程来表示:
- 鸡的数量乘以2(因为每只鸡有2只脚)加上兔的数量乘以4(因为每只兔有4只脚)等于总脚数m。
- 鸡和兔的总数量等于总头数n。
根据这两个方程,我们可以推导出:
x(鸡的数量)= (4 * n - m) / 2
这是因为:
- 兔的数量y = n - x(因为总数量是鸡和兔的数量之和)。
- 兔的脚数 = 4 * y。
- 所以,鸡的脚数 = m - 4 * y。
- 因为每只鸡有2只脚,所以鸡的数量x = (m - 4 * y) / 2。
- 将y = n - x代入上式,得到x = (4 * n - m) / 2。
身高预测
每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后身高的因素有遗传、饮食习惯与坚持体育锻炼等。小孩成人后身高与其父母身高和自身性别密切相关。
设faHeight为其父身高,moHeight为其母身高,身高预测公式为:
男性成人时身高 = (faHeight + moHeight) * 0.54(cm)
女性成人时身高 = (faHeight * 0.923 + moHeight) / 2(cm)
此外,如果喜爱体育锻炼,那么可增加身高2%,如果有良好的卫生饮食习惯,那么可增加身高1.5%。
编程从键盘输入小孩的性别(用字符型变量sex存储,输入字符F表示女性,输入字符M表示男性)、父母身高(用实型变量存储,faHeight为其父身高,moHeight为其母身高)、是否喜爱体育锻炼(用字符型变量sports存储,输入字符Y表示喜爱,输入字符N表示不喜爱)、是否有良好的饮食习惯等条件(用字符型变量diet存储,输入字符Y表示喜爱,输入字符N表示不喜爱),利用给定公式和身高预测方法对小孩的身高进行预测。
#include <stdio.h>
int main() {
char sex; //性别
float faHeight, moHeight; //父亲,母亲身高
char sports, diet; //运动,饮食
float predictedHeight; //孩子身高
printf("请输入小孩的性别(F/M):");
scanf("%c", &sex);
//检查性别是否输入准确
if (sex != 'M' && sex != 'F') {
printf("输入性别无效,请重新输入!\n");
return 1;
}
printf("请输入小孩父母的身高(cm):");
scanf("%f %f", &faHeight, &moHeight);
printf("请输入小孩是否喜爱体育锻炼(Y/N):");
scanf(" %c", &sports);
if (sports != 'Y' && sports != 'N') {
printf("输入的体育爱好无效,请重新输入。\n");
return 1;
}
printf("请输入小孩是否有良好的饮食习惯(Y/N):");
scanf(" %c", &diet);
if (diet != 'Y' && diet != 'N') {
printf("输入的饮食习惯无效,请重新输入!\n");
return 1;
}
if (sex == 'F') {
predictedHeight = (faHeight * 0.923 + moHeight) / 2;
}
else {
predictedHeight = (faHeight + moHeight) * 0.54;
}
if (sports == 'Y') {//喜欢运动
predictedHeight += predictedHeight * 0.02;
}
if (diet == 'Y') {//饮食良好
predictedHeight += predictedHeight * 0.015;
}
printf("预测小孩的身高为:%.2f\n", predictedHeight);
return 0;
}
注意事项
scanf
是一个在 C 语言中常用的函数,用于从标准输入(通常是键盘)读取并解析数据。
scanf
函数的语法如下:
int scanf(const char *format, ...); |
其中,format
参数是一个格式字符串,它可以包含一种或多种类型的转换说明符(如 %d
代表整数,%f
代表浮点数,%c
代表字符等)。这些说明符告诉 scanf
函数应该如何解析输入的数据。...
是可变参数列表,表示要接收输入数据的变量的地址。
下面是一些 scanf
函数的示例用法:
-
读取一个整数:
int num; | |
scanf("%d", &num); |
-
读取一个浮点数:
float floatNum; | |
scanf("%f", &floatNum); |
-
读取一个字符:
char charVal; | |
scanf("%c", &charVal); |
-
读取一个字符串(注意,不需要使用
&
操作符):
char str[100]; | |
scanf("%s", str); |
在使用
scanf
函数时,需要注意以下几点:
- 确保提供的变量地址能够正确存储解析的数据。对于字符和字符串,可以直接传递变量名(不需要使用
&
)。对于其他类型的数据,需要使用&
操作符来传递变量的地址。- 格式字符串中的说明符必须与要读取的数据类型匹配。例如,不能用
%d
来读取字符,也不能用%c
来读取整数。- 如果输入的数据与期望的格式不匹配,
scanf
函数可能会陷入无法预测的行为。例如,如果输入一个字母而不是数字,可能会导致程序崩溃或产生不可预料的结果。因此,在使用scanf
时,最好使用scanf
的返回值来检查是否成功读取了数据。
用switch实现下面程序 (学生两门课成绩)
输入一个学生的两门课成绩(百分制),计算该生的总分并要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。总分在180分以上为‘A’,160~179分为‘B’,140~159分为‘C’,120~139分为‘D’,120分以下为‘E’。
具体要求:
①学生的两门课成绩通过键盘输入,成绩应该都为整数,输入之前要有提示信息。
②若输入的成绩不是百分制成绩,则给出错误提示信息,并且不再进行下面的等级评价;若输入的成绩是百分制成绩,则计算总分,并根据要求评价等级。
③按下面形式输出结果:
总分----〉等级
如: 186----〉A
#include<stdio.h>
int main() {
int score1, score2; //存储两门课的成绩
printf("请输入第一门课的成绩(百分制):");
scanf("%d", &score1);
if (score1 < 0 || score1>100) {
printf("输入成绩无效,请重新输入!\n");
return 1;
}
printf("请输入第二门课的成绩(百分之):");
scanf("%d", &score2);
if (score2 < 0 || score2>100) {
printf("输入成绩无效,请重新输入!\n");
return 1;
}
int totalScore = score1 + score2; //存储两门课的总成绩
int grade = totalScore / 10; //计算成绩的等级
switch (grade) {
case 19:
case 18:
printf("总分--->A\n"); //如果等级为19或18,输出A
break;
case 17:
case 16:
printf("总分--->B\n");
break;
case 15:
case 14:
printf("总分--->C\n");
break;
case 13:
case 12:
printf("总分--->D\n");
break;
default:
printf("总分--->E\n");
break;
}
return 0;
}
switch语句的用法:
switch
语句后必须跟括号,且括号内为表达式。case
后面必须是常量,或者常量表达式,且多个case
后面的值不能相同。default
子句是可选的,它的作用是对不正确的情况给出提示。break
语句用来执行完一个case
分支后使程序跳出switch
语句块。
switch语句的注意事项:
case
后面只能是常量,或者常量表达式,且整型或者可以转成整型(可以自动类型提升为整型的)。default
可以省略,但是不建议,因为它的作用是对不正确的情况给出提示。default
不一定在最后,可以在任意位置,但是建议放在最后。break
可以省略,但是最好不要省略,否则会出现一个现象:case穿透。switch
语句的结束条件是遇到break
就结束,或者执行到switch
的有大括号 } 就结束。