#include<stdio.h>
#include<math.h>
#define PI 3.14;
// 顺序程序设计
int main()
{
// 书p37 1. 温度的摄氏表示法和华氏表示法的转换
// 关键:转换公式: c=5/9(f-32)
// ①
float st, ht;
ht = 64;
printf("华氏度=%f\n",ht);
//scanf_s("%d", &ht); // 输入华氏度
st =(5 / 9)* (ht - 32);
printf("摄氏度=");
printf("%f",st); // 输出摄氏度
// ②
//float c, f;
//f = 64.0;
//c = (5.0 / 9) * (f - 32); //区别在于 5 和 5.0
//printf("f=%f,c=%f", f, c);
// 2.计算存款利息
// 有1000元,想存一年。有三种方法可选:
// ①活期,年利率r1;
// ②一年期定期,年利率r2;
// ③两次半年定期,年利率r3;
//int bJ = 100000000;
//float r1=0.0036, r2=0.0225, r3=0.0198;
//float p1, p2, p3;
//float p31;
//p1 = bJ * r1;
//p2 = bJ * r2; // 如果有1000万存银行,每年定期利息22万,每个月1.8万,每天600,也许这就是财务自由;( 为什么我妈没有给我留1000万存在银行?
//p31 = bJ * r3 / 2 + bJ * r3 / 2; // 这种情况是,下半年存的时候,不把上半年的利息存进去;
//p3 = bJ * r3 / 2+(bJ+ bJ * r3 / 2)* r3 / 2; // 上半年利息=本金*年利率的一半;下半年的利息=(本金+上半年的利息)*年利率的一半
////p3 = bJ * (1 + r3 / 2) * (1 + r3 / 2); //p3本息
//printf("%f\n%f\n%f\n%f\n", p1, p2, p31,p3);
// 3.检查ascii代码从128到256部分的扩展字符
//unsigned char c = 128;
//for (c; c <= 254; c++)
// printf("%d:%c\n", c, c);
// 4.强制指定常量的类型
//float a1 = 3.14159f;
//long double b1 = 1.23L;
//float a2 = 3.14159;
//long double b2 = 1.23;
//printf("%f,%f;", a1, a2);
//printf("%f,%f;", b1, b2);
// 4-1.强制类型转换
//(double)a;
//(int)(x + y);
//(float)(5 % 3);
// p54【例3.3】给定一个大写字母,要求用小写字母写出
// 观察:ascii字符集中大小写字母的规律 大写-小写=32
//char da, xiao;
//da = 'K';
//printf("please input a letter:");
//printf("%c, %d\n", da,da);
////scanf_s("%i", &da)
//xiao = da + 32;
//printf("the lowercase of %c is %c, %d\n", da, xiao,xiao);
// p58【例3.4】海伦公式:给出三角形的三边长,求三角形面积
// area=根号下s(s-a)(s-b)(s-c)
// s=(a+b+c)/2
//double a, b, c,s;
////a = 30;b = 40;c = 50;
//a = 100; b = 120; c = 130;
//s = (a + b + c) / 2;
//long double area = sqrt(s * (s - a) * (s - b) * (s - c));
//printf("a=%f\t,b=%f\t,c=%f\t,\n",a,b,c);
//printf("AREA=%f\n",area);
// 赋值过程中的类型转换
// 赋值运算符两侧类型一致
//int i;
//i = 234;
// ① 将浮点型数据赋给整型变量时,舍弃小数部分;
//float b;
//double b;
//int a;
//b=2.4324;
//a = b;
//printf("a=%d,\nb=%f\n",a,b);
//printf("由于a是整型,b是双精度浮点型,因此在输出a和b时,a时整数形式,b是浮点形式\n");
// ② 将整形数据赋给单、双精度变量时,以浮点形式存储到变量中;
//float f;
//int z=23;
//f= z;
//printf("整型=%d,\n浮点型=%f\n", z, f);
//printf("变量是什么类型,输出时就用什么类型的格式符,否则会得到无效值\n");
// ③ 将一个double型数据赋给float变量时,将双精度转换为单精度,即只取4个字节、6-7个有效数字,存储到float型变量的4个字节当中
//float f;
//double s = 123.4567;
//f = s;
//printf("%f,\n%f,\n",s, f);
// 看不出来有什么差别,输出时他们的最后一位不一样;
// ④ 字符型数据赋给整型变量
//int i;
//i = 'A'; // 相当于把对应的ASCII码赋给了变量i
//printf("%d,%c\n", i, i);
// ⑤ 将一个占字节多的整型数据赋给一个占字节少的整型变量或字符变量时,发生“截断“
// 5.1
// int i = 289;
//char c = 'a';
//c = i;
//printf("i=%d,c=%d", i, c); // ??为什么c是33?
// 因为字符变量c只有1个字节,而变量i占用2个字节;此时强行将变量i的值赋给c,会发生截断,即只有低位的字节(33)10会赋到c中,高位字节(256)10丢失;
// 5.2
//int a = 32767;
////short b; // 由于short短整型可以表达的最大值是32768,因为它只有两个字节,01111111 11111111
//unsigned short b; // 通过声明无符号变量,该字节的第一位不需要表示符号,也作为有效数字,因此可以表达的最大值增加一倍,即65535
//b = a + 1;
//printf("%d", b);
// p64 【例3.5】求ax^2+bx+c=0方程的根,abc由键盘输入
//double a, b, c, disc, x1, x2, p, q;
//scanf_s("%lf%lf%lf", &a, &b, &c);
//disc = b * b - 4 * a * c;
//p = -b / (2 * a);
//q = sqrt(disc) / (2 * a);
//x1 = p + q;
//x2 = p - q;
//printf("x1=%7.2f\nx2=%7.2f\n", x1, x2);
//printf("x1=%f\nx2=%f\n", x1, x2);
//printf("x1=%1.2f\nx2=%1.2f\n", x1, x2);
/*1.
%7.2f指的是格式化为float的浮点数格式。
2.其中的7指的是最后输出总的占位符为7位,包含小数点,小数点也占一位,不足时前面补上空格符,缺几个补几个。
3.其中的.2指的是保留最后的2位小数。
4.比如 % 7.2f的2.5输出就是:(加号代表空格符)++ + 2.50。
*/
// p69 格式符
// d 格式符
//printf("%5d,%5d\n", 12, -345); // %5d 中的5是用来指定 输出数据的域宽,指定输出数据占5列,输出数据显示在右侧;
//printf("%10d,%10d\n", 12, -345);
//printf("%10lld,%10ld\n", 11541537412, 11541537412); // 长整型和基本整形的字节数和范围一致(4),不予讨论,长长整型的字节数(8)要大一些
// c 格式符
//char ch = 'a';
//printf("%c\n", ch);
//printf("%5c\n", ch);
//short a = 121;
//printf("%c\n", a);
//int b = 377;
//printf("%c\n", b);
/* 因为字符变量只有1个字节,而int基本整型变量有4个字节,377占用了9位,
显然超过了1个字节(8位),因此发生了截断,即8位之上的字符被断开并排除,
从101111001→01111001,从十进制角度来看就是377→121,截断的部分是2的9次方,256;
*/
// s 格式符
//printf("%s", "china"); // 输出列表不加双引号行不行?
//printf("%s", china); //不行哦,字符串和双引号绑定了。
// f 格式符
//double a = 1000.0;
//printf("%f\n", a / 3); // 不管是单精度还是双精度,%f格式声明只能输出6位小数.
//// 那么,怎么指定数据宽度和小数位数呢?——用%n.mf
//printf("%3.0f\n", a / 3);
//printf("%9.0f\n", a / 3);
//printf("%3.3f\n", a / 3);
//printf("%9.29f\n", a / 7);
//printf("%9.29f\n", a / 3); //注意:一个双精度数只能保证15位有效数字
//float b = 1000.0;
//printf("%9.29f\n", b/ 3); //注意:一个单精度数只能保证5位有效数字
////那么,怎么让输出的数据向左对齐呢?——在m.n前加一个负号
//printf("%-25.15f,\n%25.15f,\n", a, a); // 右边空5列,左边空5列;
// e 格式符
// 以指数形式输出实数
//printf("%e\n", 123.456);
//printf("%e\n", 1234.567); // 小数位数6位.567000;指数部分5位e+02
//printf("%e\n", 0.0456); // 小数点前必须有且只有1位非零数字
//printf("%e\n", 123.456); // 所输出的实数共占13列宽度,哦不对,是12列
//printf("%12.2e\n", 123.456);// 指定输出数据占12位,其中小数占两位,加上指数部分4位,小数点前1位,小数点1位,实际占用8位,数的右侧空4位
//// 也可以用E来替代e
//printf("%E\n", 123.456);
// g 格式符
//double a = 12345678954321;
//printf("%f\n%e\n%g\n", a,a,a);
//printf("%f\t%e\t%g\t", a, a, a);
// p76 scanf_s输入函数
//int a;
//char b;
//float c;
//a = 34; b = 't'; c = 87.9;
//scanf_s("%d%c%f", &a, &b, &c);
//scanf_s("%d,%c,%f", &a, &b,&c);
//printf("%d,%c,%f", a,b,c);
//printf("%d,%c,%f", a, b,c);
// putchar 字符输出函数
// p76 【例3.8】先后输出BOY三个字符
//char a = 'B', b = 'O', c = 'Y';
//int a = 66, b = 79, c = 89;
//putchar(a);
//putchar(b);
//putchar(c);
//putchar('\n');
// 用putchar函数输出转义字符————什么玩意这是??
//putchar('\101');
//putchar('101');
//putchar('\");
//putchar('\');
//putchar("\");
//putchar('\015');
//putchar('015');
//putchar('016');
//putchar('017');
//putchar('032');
//putchar('056');
//putchar('089');
// getchar 字符输入函数
//char a, b, c;
//a = getchar();
//b = getchar();
//c= getchar();
//putchar(a);
//putchar(b);
//putchar(c);
//putchar('\n');
/* 若输入B + 回车 + O,再回车,会输出同样格式的BO,为什么 ?
--因为输入字符没有要求输入中间有其他字符,而enter回车是一个转义字符,
相当于b被赋值为一个转义换行字符,而输入的第O被赋给了c;
*/
// getchar函数还可以作为表达式:👇👆一致
//putchar(getchar()); // 根据优先级,先运行括号內部的函数,因此
//putchar('\n');
//putchar(getchar()); // 先输入,再输出同样的字符;
//putchar(getchar());
//putchar('\n');
//// 用printf()可以实现同样的效果
//printf("%c",getchar()); //区别在于,printf的格式声明还是得有
// 改写下面这个题,使之可以适用于任何大写字母
// 【原版】
// p54【例3.3】给定一个大写字母,要求用小写字母写出
// 观察:ascii字符集中大小写字母的规律 大写-小写=32
//char da, xiao;
//da = 'K';
//printf("please input a letter:");
//printf("%c, %d\n", da,da);
////scanf_s("%i", &da)
//xiao = da + 32;
//printf("the lowercase of %c is %c, %d\n", da, xiao,xiao);
// 【修改版】
// 【例3.3】给定一个大写字母,要求用小写字母写出
// 观察:从直接赋值到动态输入值
//printf("输入一个大写字母:");
//char da = getchar();
//printf("%c的小写是:",da);
//putchar(da+ 32);
// 规范一下写法:
//char c1, c2;
//printf("输入一个大写字母:");
//c1 = getchar();
//c2 = c1 + 32;
//putchar(c1);
//printf("的小写是:");
//putchar(c2);
//putchar('\n');
//printf("%c的小写是:%c", c1,c2); // 这一行可以取代上面的三行
//putchar('\n');
// 课后习题-见学习辅导
/* 计算10年后国民生产总值增长百分比,年增长率为7% ,计算公式为p = (1 + r) ^ n;
r为年增长率,n为年数,p为与现在相比的倍数;
*/
// ? 指数是2好说,可以a*a,指数是10,难道要a*a*a*a*a*a*a*a*a*a??----据说可以用pow()函数,这好像涉及到指针
// 写了这串代码,输入幂和指数,可以得到结果
//float p, r, n;
//r = 0.07 ;
//n = 10;
////scanf_s("%d %d", &mi, &zs);
//p=pow(mi, n);
//printf("%f", p);
//官方答案:
//float p,r,n;
//r = 0.07;
//n = 10;
//p = pow(1 + r, n);
//printf("p=%f\n", p);
/*存款利息的计算.有1000元,想存5年,可按以下5种办法存:
(1)一次存5年
(2)先存2年,到期后存3年
(3)先存3年,到期后存4年
(4)先存1年,到期后本息存1一年,连续五次
(5)存活期款,利息每季度结一次
1年定期1.5%,2年定期2.1%,3年定期2.75.五年定期3%,活期利息0.35%
r=年利率,n=存款年数
*/
//double r, r41, P1, P2, P3, P4, P5;
//int n;
//P1 = 1000 * 0.0300* 5;
//P2 = 1000 * 0.0210 * 2 + ((1000 * 0.021 * 2) + 1000) * 0.0275*3;
//P3 = 1000 * 0.0275 * 3 + ((1000 * 0.0275 * 3) + 1000) * 0.021*2;
//r41 = 1000 * 0.0150 * 1; //一年单次利息;
//P4 = 1000 * 0.0150 * 5;
////P4 = r41 + (r41+ 1000) * 0.0150+((r41 + 1000) * 0.0150)*0.015+(((r41 + 1000) * 0.0150) * 0.015)*0.015+((((r41 + 1000) * 0.0150) * 0.015) * 0.015)*0.0150;
//P5 = 1000 * 0.0035 * 5;
//printf("P1=%f\n", P1);
//printf("P2=%f\n", P2);
//printf("P3=%f\n", P3);
//printf("P4=%f\n", P4);
//printf("P5=%f\n", P5);
//
//// 答案:
//double r5, r0, r3, r2, r1, p, p1, p2, p3, p4, p5;
//p = 1000;
//r5 = 0.03;
//r3 = 0.0275;
//r2 = 0.021;
//r1 = 0.015;
//r0 = 0.0035;
//p1 = p * (r5 * 5);
////p2 = p * (1 + r2 * 2) * (1 + r3 * 3)-1000;
//p2 = p * (r2 * 2) +(p+ p * (r2 * 2))* (r3 * 3);
//p3 = p * (1+r3 * 3) * (1+r2 * 2)-1000;
//p4 =p* pow(1+r1, 5) - 1000;
//p5 =p* pow(1+r0/ 4, 20) - 1000;
//printf("P1=%f\n", p1);
//printf("P2=%f\n", p2);
//printf("P3=%f\n", p3);
//printf("P4=%f\n", p4);
//printf("P5=%f\n", p5);
// 3. 购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少越能还清。
// d=300000元;p=6000元;r=1%;对求得的月份取小数点后一位,对第2位按四舍五入处理;
//double d, p, r;
//float m;
//d = 300000;
//p = 600;
//r = 0.01;
//
//double t = p / (p - d * r);
//double f = (1 + r);
//m = log(t) / log(f);
//m = log(p / (p - d * r)) / log(1 + r);
//printf("%f", m);
//// 网上找的答案
//int d=300000,p=6000;
//double r = 0.01, m;
//m = log10(p / (p - d * r)) / log10(1 + r);
//printf("需要m=%.1f月才能还清\n", m);
//printf("保留两位后m=%.2f知,小数点第2位是四舍五入处理\n", m);
//
//// 求还款总金额
//double P, R, N, sum;
//printf("请输入贷款本金\n");
//scanf_s("%lf", &P);
//printf("请输入本次贷款月利率\n");
//scanf_s("%lf", &R);
//printf("请输入还款期数\n");
//scanf_s("%lf", &N);
//sum = (N * P * R * pow((1 + R), N)) / (pow((1 + R), N) - 1);
//printf("所求还款总额为:%lf", sum);
// 4.分析程序:
////char c1, c2;
//int c1, c2; // 如果对他们赋值在0-127,那么int或者char没有区别
//c1 = 97;
//c2 = 98;
////c1 = 197; c2 = 198;
///*为什么输出的是 - 59, - 58?这是什么?
//——这是补码形式,用char类型声明变量时,给它赋的值应该在0 - 127范围*/
//printf("c1=%c,c2=%c\n", c1, c2);
//printf("c1=%d,c2=%d\n", c1, c2);
// 5\用scanf函数输入数据,使
//int a, b;
//float x, y;
//char c1, c2;
//scanf_s("s=%d b=%d\n", &a, &b);
//scanf_s("x=%f y=%e\n", &x, &y);
//scanf_s("c1=%c c2=%c\n", &c1, &c2);
//printf("s=%d,b=%d,x=%f,y=%e,c1=%c,c2=%c", a, b,x,y,c1,c2);
// 6.将“china”译成密码;
//char c[5] = {'C','h','i','n','a'};
//char c[5] ; // 数组总量一定要事先规定好吗?感觉好麻烦
//for (int x = 0; x <= 4; x++) {
// scanf_s("%c", &c[x]);
//}
//putchar('\n');
//for (int s = 0; s <= 4; s++) {
// printf("%c", c[s]);
//}
//putchar('\n');
//for (int i = 0; i <=4 ; i++) {
// printf("%d ", c[i]);
//}
//putchar('\n');
//for (int j = 0; j <= 4; j++) {
// c[j] = c[j] + 4;
// printf("%d ", c[j]);
//}
//putchar('\n');
//for (int t = 0; t <= 4; t++) {
// printf("%c", c[t]);
//}
// 7. 求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。
// 用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字
//float r, h;
//float c, s, S, v1, v2;
//scanf_s("%f,%f", &r, &h);
//c = 2 * r* PI;
//s = r * r * PI;
//S = 4 * r * r * PI;
//v1 = 4 / 3 * r * r * r * PI;
//v2 = s * h;
//printf("圆周长=%6.2f\n",c);
//printf("圆面积=%6.2f\n", s);
//printf("圆球表面积=%6.2f\n", S);
//printf("圆球体积=%6.2f\n", v1);
//printf("圆柱体积=%6.2f\n", v2);
// 8. putchar 和 getchar, putchar & printf
//char c1, c2;
//int c1, c2;
//c1=getchar();
//c2 = getchar();
//putchar('\n');
//putchar(c1);
//putchar(',');
//putchar(c2);
//putchar('\n');
//printf("%c,%c\n", c1, c2);
//printf("%d,%d\n", c1, c2);
// 关于char和int类型的区别:
// 主要在于①取值范围;②截断现象,强行将大整数值赋给字符变量时,只保存最后一个字节的值
// 1)输入整数
// int c1, c2;
//printf("请输入两个整数 c1 c2:");
//scanf_s("%d,%d", &c1, &c2);
//printf("按字符输出结果:\n");
//printf("%c,%c\n", c1, c2);
//printf("按ASCII码输出结果为:\n");
//printf("%d,%d\n", c1, c2);
////// 2)输入字符
//char c1, c2;
////int i1, i2;
//printf("请输入两个字符 c1 c2:");
////scanf_s("%c,%c", &c1, &c2); //c6064 这他妈是什么
//scanf_s("%c,%c", &c1,20, &c2,200);
// //解释:对于scanf_s,每每写一个输出表列,后面要加上一个整数表示 最大可以获取多少个数据
////i1 = c1; //这两个可以完全不用
////i2 = c2;
//printf("按字符输出结果:\n");
////printf("%c,%c\n", i1, i2);
//printf("%c,%c\n", c1, c2); //同上重复
//printf("按ASCII码输出结果为:\n");
//printf("%d,%d\n", c1, c2);
//// 3)输入整数-截断
//char c1, c2;
//int i1, i2;
//printf("请输入两个整数 i1 i2:");
////scanf_s("%c,%c", &c1, &c2);
//scanf_s("%d,%d", &i1, &i2); // 如果输入的是整数时,则不用指定最大可输入数据
//c1 = i1;
//c2 = i2;
//printf("按字符输出结果:\n");
//printf("%5c,%c\n", c1, c2);
//printf("按ASCII码输出结果为:\n");
//printf("%5d,%d\n", c1, c2);
return 0;
}