目录 eg5.4输入一个字符,判断是否是大写字母,若是转换为小写字母,输出,若不是,直接输出 eg5.7运输货物,不同距离价钱不同 switch case |
eg5.1输入两个实数,按代数值由小到大的顺序输出这两个数
double类型的数据用scanf输入时要用%lf的形式输入
|
//eg5.1输入两个实数,按代数值由小到大的顺序输出这两个数
#include<stdio.h>
void main(void){
double a,b;
printf("请输入两个实数:");
scanf("%lf%lf", &a, &b);
printf("这两个实数为:%.2f, %.2f\n", a, b);
if(a > b){
printf("代数值由小到大的顺序为:%.2f, %.2f\n", b, a);
}else{
printf("代数值由小到大的顺序为:%.2f, %.2f\n", a, b);
}
}
eg5.2输入3个数,按由小到大的顺序输出
//eg5.2输入3个数,按由小到大的顺序输出
/*
//自己
#include<stdio.h>
void main(void){
double a,b,c;
double max, medium, min;
printf("请输入三个实数:");
scanf("%lf%lf%lf", &a, &b, &c);
printf("这三个实数为:%.2f, %.2f, %.2f\n", a, b, c);
if(a > b && a > c){ //a是最大的
max = a;
if(b > c){
medium = b;
min = c;
}
else{
medium = c;
min = b;
}
}else if(b > c){ //a不是最大的,b是最大的
max = b;
if(a > c){
medium = a;
min = c;
}else{
medium = c;
min = a;
}
}else{ //c是最大的
max = c;
if(a > b){
medium = a;
min = b;
}else{
medium = b;
min = c;
}
}
printf("由小到大的顺序为:%.2f, %.2f, %.2f\n", min, medium, max);
}
*/
//(课本)思想:通过比较赋值,让a成为这三个数中最小的一个,b次之,c为最大的,然后依次输出abc
#include<stdio.h>
void swap(double *a, double *b){
double tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
void main(void){
double a,b,c;
printf("请输入三个实数:");
scanf("%lf%lf%lf", &a, &b, &c);
printf("这三个实数为:%.2f, %.2f, %.2f\n", a, b, c);
if(a > b){
swap(&a, &b); //让a成为a,b中较小的一个
printf("%.2f, %.2f\n", a, b);
}
if(a > c){ //让a成为a,c中较小的一个
swap(&a, &c);
}
//此时,a是三者中最小的一个
if(b > c){
swap(&b, &c); //让b成为b,c中较小的一个
}
//此时,b是三者中次小的一个
printf("由小到大的顺序为:%.2f, %.2f, %.2f\n", a,b, c);
}
eg5.3编程实现符号函数,输入一个x,输出y值
double型的数据不能用%d的形式输出
//eg.5.3编程实现符号函数,输入一个x,输出y值
#include<stdio.h>
//符号函数signum
double signum(double x){
double y;
if(x > 0){
y = 1;
}else if(x = 0){
y = 0;
}else{
y = -1;
}
//printf("y的值为:%f\n", y);
return y;
}
void main(void){
double x, y;
printf("请输入一个实数:");
scanf("%lf", &x);
printf("输入的值为:%lf\n", x);
y = signum(x);
printf("y的值为:%.1f\n", y);
}
eg5.4输入一个字符,判断是否是大写字母,若是转换为小写字母,输出,若不是,直接输出
char c;
(c >= 65 && c <= 97) ? c += 32 : c; //(c >= 65 && c <= 97) ? c += 32; : c; wrong form
(c >= 'A' && c <= 'Z') ? c += 32 : c;
可以直接写成上述的样子条件运算符 https://blog.csdn.net/weixin_42072280/article/details/85006449
//eg5.4输入一个字符,判断是否是大写字母,若是转换为小写字母,输出,若不是,直接输出
#include<stdio.h>
void main(void){
char c;
printf("Please input a character: ");
scanf("%c", &c);
printf("This character is: %c\n", c);
/*
//myself
if(c >= 65 && c <= 97){
printf("This character is a capital character.\n");
c += 32;
}else{
printf("This character isn't a capital character.\n");
}
*/
//textbook
// (c >= 65 && c <= 97) ? c += 32 : c; //(c >= 65 && c <= 97) ? c += 32; : c; wrong form
(c >= 'A' && c <= 'Z') ? c += 32 : c;
printf("Now this character is: %c\n", c);
}
eg5.5.判断某一年是否闰年 leap year
if((year % 4 == 0 && year % 100) || (year % 400 == 0)){
leap = 1;
}
//eg5.5.判断某一年是否闰年 leap year
//闰年是公历中的名词。闰年分为普通闰年和世纪闰年。
//普通闰年:能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年,1999年不是闰年);
//世纪闰年:能被400整除的为世纪闰年。(如2000年是闰年,1900年不是闰年);
//测试 是 2004 2000
// 不是 1989 1999 1900
#include<stdio.h>
void main(void){
int year;
int leap = 0; //leap为1表示是闰年
printf("请输入一个年份:");
scanf("%d", &year);
printf("此年份为:%d\n", year);
/* 写错了 对闰年的理解有误
if(year % 4 == 0){
leap = 1;
}else if(year % 100 == 0){
if(year % 400 == 0){
leap = 1;
}
*/
/* 方法1
if(year % 4 == 0){ //能被4整除
if(year % 100){ //不能被100整除
leap = 1;
}else if(year % 400 == 0){ //不能被100整除 能被400整除
leap = 1;
}
}
*/
//方法2 将所有的条件写成一个表达式
if((year % 4 == 0 && year % 100) || (year % 400 == 0)){
leap = 1;
}
(leap == 1) ? printf("%d年是闰年", year) : printf("%d年不是闰年", year);
}
eg5.6求ax^2+bx+c=0方程的解
double a; //a为一个实数
if(a == 0)... if(fabs(a) <= 1e-6)...
//对于判断a是否等于0时,要注意:由于a是实数,而实数在计算和存储时会有一些微小的误差,因此不能直接进行如下判断:if(a == 0)...,因为这样可能会出现本来是零的量,由于上述误差而被判别为不等于0而导致结果错误。所以,采取的方法就是判别a的绝对值(fabs(a))是否小于一个很小的数(例如10^(-6)),如果小于此数,就认为a等于0.
//eg5.6求ax^2+bx+c=0方程的解
#include<stdio.h>
#include<math.h>
void main(void){
double a, b, c;
double m, n;
double x1, x2;
double diata;
printf("请输入二元一次方程的三个系数:");
scanf("%lf%lf%lf", &a, &b, &c);
printf("三个系数为:%f %f %f\n", a, b, c);
/* 自己 将diata=0解释为无根
diata = pow(b,2) - 4*a*c;
if(diata < 0){
printf("该方程无根\n");
}else{
m = -b * 1.0 / (2 * a);
n = sqrt(diata) * 1.0 / (2 * a);
x1 = m + n;
x2 = m - n;
printf("方程的根为:%lf, %lf\n", x1, x2);
}
*/
/*
// 课本+自己
//若是a=0,则不是二次方程
//将diata=0解释为有两个共轭复根 x=[-b±i√(4ac-b^2)]/(2a)
if(a == 0){
printf("该方程不是一元二次方程\n");
}
diata = pow(b,2) - 4*a*c;
m = -b * 1.0 / (2 * a);
if(diata < 0){
n = sqrt((-1)*diata) * 1.0 / (2 * a);
printf("该方程有两个共轭复根: %lf + i%lf, %lf - i%lf\n", m, n, m, n);
}else{
n = sqrt(diata) * 1.0 / (2 * a);
x1 = m + n;
x2 = m - n;
(diata == 0) ? printf("该方程有一对相等的实根:%lf, %lf\n", x1, x2) : printf("该方程有一对不相等的实根:%lf, %lf\n", x1, x2);
}
*/
// 课本
//对于判断b^2-4ac是否等于0时,要注意:由于 b^2-4ac 是实数,而实数在计算和存储时会有一些微小的误差,因此不能直接进行如下判断:
//if(diata == 0)...,因为这样可能会出现本来是零的量,由于上述误差而被判别为不等于0而导致结果错误。
//所以,采取的方法就是判别diata的绝对值(fabs(diata))是否小于一个很小的数(例如10^(-6)),如果小于次数,就认为diata等于0.
if(fabs(a) <= 1e-6){//if(a == 0){
printf("该方程不是一元二次方程\n");
}
diata = pow(b,2) - 4*a*c;
m = -b * 1.0 / (2 * a);
if(diata < 0){
n = sqrt((-1)*diata) * 1.0 / (2 * a);
printf("该方程有两个共轭复根: %lf + i%lf, %lf - i%lf\n", m, n, m, n);
}else{
n = sqrt(diata) * 1.0 / (2 * a);
x1 = m + n;
x2 = m - n;
(fabs(diata) <= 1e-6) ? printf("该方程有一对相等的实根:%lf, %lf\n", x1, x2) : printf("该方程有一对不相等的实根:%lf, %lf\n", x1, x2);
//(diata == 0) ? printf("该方程有一对相等的实根:%lf, %lf\n", x1, x2) : printf("该方程有一对不相等的实根:%lf, %lf\n", x1, x2);
}
}
eg5.7运输货物,不同距离价钱不同 switch case
(1)在case子句后如果没有break;会一直往后执行一直到遇到break;才会跳出switch语句。
运行结果: 学英语学C语言好好休息
(2)多个case可以共用一组执行语句
switch(c){ //记得一定要加break,否则就会一直运行直到遇到break,才会跳出switch语句
case 0: d = 0; break;
case 1: d = 2; break;
case 2:
case 3: d = 5;
case 4:
case 5:
case 6:
case 7: d = 8;
case 8:
case 9:
case 10:
case 11: d = 10;
case 12: d = 15;
}
//eg5.7运输货物,不同距离价钱不同
//测试: 输入100 20 300 输出588000(此处只写出一般结果,具体格式根据输出判定)
#include<stdio.h>
void main(void){
double p; //每吨每千米货物的基本运费
double w; //货物的重量
double s; //距离
double d; //折扣
double f; //总运费
int c;
scanf("%lf%lf%lf", &p, &w, &s);
printf("%f %f %f\n", p, w, s);
//switch(表达式) 表达式的值可以是整型、字符型
//课本
if(s >= 3000){
c = 12;
}else{
c = s/250;
}
switch(c){ //记得一定要加break,否则就会一直运行直到遇到break,才会跳出switch语句
case 0: d = 0; break;
case 1: d = 2; break;
case 2:
case 3: d = 5;
case 4:
case 5:
case 6:
case 7: d = 8;
case 8:
case 9:
case 10:
case 11: d = 10;
case 12: d = 15;
}
printf("d=%f\n", d); //若每条语句下面不加break,则d的值为15
f = p*w*s*(1-d*0.01);
printf("总运费为%f:\n", f);
}
5.4有三个整数abc,由键盘输入,输出其中最大的数
//5.4有三个整数abc,由键盘输入,输出其中最大的数
#include<stdio.h>
void main(void){
int a, b, c;
int max;
printf("请输入三个整数:");
scanf("%d%d%d", &a, &b, &c);
printf("输入的三个整数为:%d %d %d\n", a, b, c);
//max = (a > b) ? a : b; //此处最好还是不要用max来接,可以用一个tmp,自己偷懒了哈哈
//max = (max > c) ? max : c;
max = ((a > b) ? a : b) > c ? ((a > b) ? a : b) : c;
printf("这三个数中最大的数为:%d\n", max);
}
5.5有一个分段函数,输入x,输出y值
//5.5有一个分段函数,输入x,输出y值
#include<stdio.h>
double fun(double x){
double y;
if(x < 1){
y = x;
}else if(x >= 10){
y = 3*x-11;
}else{
y = 2*x-1;
}
return y;
}
void main(void){
double x;
double y;
printf("请输入实数x的值:");
scanf("%lf", &x);
printf("输入的值为:%f\n", x);
y = fun(x);
printf("对应的函数值为:%f\n", y);
}
5.6按照成绩输出成绩等级
switch 语句根据控制表达式的值,可以把程序流跳转到多个语句中的一个执行:
switch (表达式) 语句
括号里的表达式具有整数类型,并且这里的语句就是该 switch 主体,它包括了多个 case 标签,以及最多一个 default 标签。
括号里的表达式会被计算一次,并和 case 标签中的常量表达式做比较。如果表达式的值匹配其中的某个 case 常量,程序流就会跳转到该 case 标签后面的语句。如果没有匹配的 case 常量,程序流就会跳转到 default 标签后的语句(如果存在 default 标签)。
https://blog.csdn.net/YHxiaohao/article/details/79861154
//5.6按照成绩输出成绩等级
/*百分制
90分以上为A
80-89分为B
70-79分为C
60-69分为D
60分一下为E
*/
/*
switch 语句根据控制表达式的值,可以把程序流跳转到多个语句中的一个执行:
switch (表达式) 语句
括号里的表达式具有整数类型,并且这里的语句就是该 switch 主体,它包括了多个 case 标签,以及最多一个 default 标签。
括号里的表达式会被计算一次,并和 case 标签中的常量表达式做比较。
如果表达式的值匹配其中的某个 case 常量,程序流就会跳转到该 case 标签后面的语句。
如果没有匹配的 case 常量,程序流就会跳转到 default 标签后的语句(如果存在 default 标签)。
*/
/*
//自己 有两个失误的地方
//(1)没有处理100分的情况 按照自己的程序输出的话 100分的等级为E
//(2)对用户的输入进行判别的时候用的是if语句,应该要用 while语句,因为要多次判别,不是只判别一次
#include<stdio.h>
char scoreRank(double score);
char scoreRank(double score){
int s;
char c;
s = score/10;
switch(s){
case 9: c = 'A'; break;
case 8: c = 'B'; break;
case 7: c = 'C'; break;
case 6: c = 'D'; break;
default : c = 'E'; break;
}
return c;
}
void main(void){
double score;
char c;
printf("请输入成绩(0-100):");
scanf("%lf", &score);
if(score > 100 || score < 0){
printf("您输入的成绩有误,请重新输入:");
scanf("%lf", &score);
}
printf("您输入的成绩为:%f\n", score);
c = scoreRank(score);
printf("此学生的成绩等级为:%c", c);
}
*/
//课本
#include<stdio.h>
char scoreRank(double score);
char scoreRank(double score){
int s;
char c;
s = score/10;
switch(s){
case 10: //自己失误的地方
case 9: c = 'A'; break;
case 8: c = 'B'; break;
case 7: c = 'C'; break;
case 6: c = 'D'; break;
default : c = 'E'; break;
}
return c;
}
void main(void){
double score;
char c;
printf("请输入成绩(0-100):");
scanf("%lf", &score);
while(score > 100 || score < 0){ //if(score > 100 || score < 0){
printf("您输入的成绩有误,请重新输入:");
scanf("%lf", &score);
}
printf("您输入的成绩为:%f\n", score);
c = scoreRank(score);
printf("此学生的成绩等级为:%c", c);
}
5.7给一个不多于五位的正整数,求出是几位数,分别输出每一位,逆序输出
//5.7给一个不多于五位的正整数,求出是几位数,分别输出每一位,逆序输出
#include<stdio.h>
void main(void){
unsigned int num;
unsigned int number;
int n = 0; //记录位数
int diverse = 0; //diverse 自己起的名字
int eachValue;
printf("请输入一个正整数(不多于五位):");
scanf("%d", &num);
while(num >= 100000 || num < 0){
printf("输入有误,请重新输入:");
scanf("%d", &num);
}
printf("输入的正整数为:%d\n", num);
number = num;
printf("%d每一位(由低到高)分别为:", number);
while(num%10){
n++;
eachValue = num % 10;
printf("%d ", eachValue);
diverse = diverse*10 + eachValue;
num/=10;
}
printf("\n");
printf("%d的位数为:%d\n", number, n);
printf("%d的逆序表示为:%d\n", number, diverse);
}
5.8(缺)switch case的一个例子,太繁琐了
5.9输入4个整数,按有小到大的顺序输出
//5.9输入4个整数,按有小到大的顺序输出
#include<stdio.h>
void swap(int *a, int *b); //又一次掉在了函数调用的经典坑中,此处要修改a和b的值,故要传址
void swap(int *a, int *b){
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
printf("%d %d \n", *a, *b);
}
void main(void){
int a, b, c, d;
printf("请输入四个整数:");
scanf("%d%d%d%d", &a, &b, &c, &d);
printf("输入的四个整数为:%d %d %d %d\n", a, b, c, d);
/* 错误
if(a > b){
swap(a, b); //让a成为a、b中较小的一个
if(a > c){
swap(a, c); //让a成为a、c中较小的一个
if(a > d){
swap(a, d); //让a成为a、d中较小的一个 所以,至此,a是最小的一个
}
}
}
*/
/*错误
if(a > b){
swap(&a, &b); //让a成为a、b中较小的一个
}else if(a > c){
swap(&a, &c); //让a成为a、c中较小的一个
}else if(a > d){
swap(&a, &d); //让a成为a、d中较小的一个 所以,至此,a是最小的一个
}
if(b > c){
swap(&b, &c); //让b成为b、c中较小的一个
}else if(b > d){
swap(&b, &d); //让b成为b、d中较小的一个 所以,至此,b是次小的一个
}
if(c > d){
swap(&c, &d);
}
*/
//正确 仔细分析,其实这种写法类似于将数据放在数组中进行排序,和最基本的排序算法原理是一样的
if(a > b){
swap(&a, &b); //让a成为a、b中较小的一个
}
if(a > c){
swap(&a, &c); //让a成为a、c中较小的一个
}
if(a > d){
swap(&a, &d); //让a成为a、d中较小的一个 所以,至此,a是最小的一个
}
if(b > c){
swap(&b, &c); //让b成为b、c中较小的一个
}
if(b > d){
swap(&b, &d); //让b成为b、d中较小的一个 所以,至此,b是次小的一个
}
if(c > d){
swap(&c, &d);
}
printf("这四个整数按照从小到大的顺序输出为:%d %d %d %d\n", a, b, c, d);
}
5.10有4个灯塔,位于灯塔区域的高度为10m,其余地方为0
//5.10有4个灯塔,位于灯塔区域的高度为10m,其余地方为0
//输入:点的坐标x, y
//输出:高度h
//测试:0.5 0.7 0
// 2.1 2.3 10
#include<stdio.h>
#include<math.h>
void main(void){
double x;
double y;
double dist;
int h = 0;
printf("请输入点的坐标(x, y):");
scanf("%lf,%lf", &x, &y);
printf("输入的点坐标为为:(%f, %f)\n", x, y);
if(y > 0){
if(x > 0){
dist = pow((x-2), 2) + pow((x-2), 2);
}else{
dist = pow((x+2), 2) + pow((x-2), 2);
}
}else{
if(x > 0){
dist = pow((x-2), 2) + pow((x+2), 2);
}else{
dist = pow((x+2), 2) + pow((x+2), 2);
}
}
if(dist <= 1){
h = 10;
}
printf("此位置的高度为:%d\n", h);
}