前言
鹏哥C语言刷题训练营第六课代码来咯,大家可以参考一下:
代码链接(有需要请自行复制链接进入牛客网练习)
- 计算单位阶跃函数 题号:BC70 链接:https://www.nowcoder.com/
practice/0b23793ae48a4e6cb7dfff042c959a04?tpId=290&tqId=39858&ru=/exam/oj - 三⻆形判断 题号:BC71 链接:https://www.nowcoder.com/practic
e/689ec1e742394e09b1059556fc167b65?tpId=290&tqId=39859&ru=/exam/oj - 衡量⼈体胖瘦程度 题号:(⽆) 链接:https://www.nowcoder.com/
questionTerminal/4d604603fae94a26b59b7bc18f363bc0 - 计算⼀元⼆次⽅程 题号:BC73 链接:https://www.nowcoder.com/
practice/7da524bb452441b2af7e64545c38dc26?tpId=290&tqId=39861&ru=/exam/oj - 获得⽉份天数 题号:BC74 链接:https://www.nowcoder.com/practi
ce/13aeae34f8ed4697960f7cfc80f9f7f6?tpId=290&tqId=39862&ru=/exam/oj - 简单计算器 题号:BC77 链接:https://www.nowcoder.com/practic
e/b8f770674ba7468bb0a0efcc2aa3a239?tpId=290&tqId=39865&ru=/exam/oj - 线段图案 题号:BC98 链接:https://www.nowcoder.com/practice/
a95744270f274a14a8a0dafe10421589?tpId=290&tqId=39886&ru=/exam/oj - 正⽅形图案 题号:BC99 链接:https://www.nowcoder.com/practic
e/1304bb23c2e344989d5c7a578d263e4c?tpId=290&tqId=39887&ru=/exam/oj - 直⻆三⻆形图案 题号:BC100 链接:https://www.nowcoder.com/pr
actice/00dd93f7c7074754b7511bf56d1f15ac?tpId=290&tqId=39888&ru=/exam/oj
T1:
这个题就是咱们数学的学的那种分段函数,而且y值就仨,很简单,用if控制x的变化就行了其实。
思路1:
直接用if控制x,然后构造分段函数的逻辑
void T1_way1(void) { int t = 0; while (~scanf("%d", &t)) { if (t > 0) printf("1\n"); else if (t < 0) printf("0\n"); else printf("0.5\n"); } }
然后就是这个题目没啥好说的,下一个题目吧
T2:
这里可以简单写一下逻辑哈,看下面图吧:
思路1:
按照上面逻辑用if写出来就行了
代码:
void T2_way1(void) { int a = 0; int b = 0; int c = 0; while (~scanf("%d %d %d", &a, &b, &c)) { //确保他是一个三角形 if (a + b > c && a + c > b && b + c > a) { //三个边都相等,是等边三角形 if (a == b && a == c) printf("Equilateral triangle!\n"); //有两个边一样,另一个不一样是等腰三角形 else if ((a == b && a != c) || (a == c && a != b) || (b == c && b != a)) { printf("Isosceles triangle!\n"); } //一般的三角形 else printf("Ordinary triangle!\n"); } //他不是一个三角形 else { printf("Not a triangle!\n"); } } }
T3:
这个感觉也是一个类型的代码,跟前面俩一样都是锻炼将简单的数学公式转换成代码的这种类型
思路1:
void T3_way1(void) { int w = 0;//input kg int h = 0;//input cm while (~scanf("%d %d", &w, &h)) { //求BMI的公式是:体重(kg)/升高的平方(m) double BMI = w / ((h / 100.0) * (h / 100.0)); if (BMI < 18.5) { printf("Underweight\n"); } else if (BMI >= 18.5 && BMI <= 23.9) { printf("Normal\n"); } else if (BMI > 23.9 && BMI <= 27.9) { printf("Overweight\n"); } else printf("Obese\n"); } }
T4:
思路,这个题目可能稍微繁琐一点,分的条件可能比较多…慢慢来吧,问题不大
思路1:
void T4_way1(void) { double a = 0.0; double b = 0.0; double c = 0.0; while (scanf("%lf%lf%lf", &a, &b, &c) != EOF) { //a == 0,这种不属于一元二次方程 if (a == 0) { printf("Not quadratic equation\n"); } //a != 0,这种情况下就属于一元二次方程了,接下来对disc进行分类就好了 else { //因为接下来是以disc为依据进行分类的,所以需要先求一下disc是多少? double disc = b * b - 4 * a * c; //disc==0,这种情况,x1==x2 if (disc == 0) { if ((-b + sqrt(disc)) / (2 * a) == 0) printf("x1=x2=0.00\n"); else printf("x1=x2=%.2lf\n", (-b + sqrt(disc)) / (2 * a)); } //disc>0这种情况的话这种情况x1,x2有两个值 else if (disc > 0) { printf("x1=%.2lf;x2=%.2lf\n", (-b - sqrt(disc)) / (2 * a), (-b + sqrt(disc)) / (2 * a)); } else { double real = (-b) / (2 * a); double image = sqrt(-disc) / (2 * a); printf("x1=%.2lf-%.2lfi;x2=%.2lf+%.2lfi\n", real, image, real, image); } } } }
这里细节还是比较多的哈,建议自己写完代码要放在OJ题目上去试一试能不能通过。
T5:
题目大概意思就是输入年月份,输出这个月多少天,这里需要注意的是有闰年,闰年大部分月份跟正常月份一个天数,就是二月的时候需要多加1天,这里需要注意一下哈。
思路1:
这里就是用数组就行,结合if语句
void T5_way1(void) { //先创建变量,初始化值 int y = 0; int m = 0; int days[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 }; //循环判断 while (scanf("%d %d", &y, &m) != EOF) { int day = days[m - 1]; //看看是不是闰年的2月份 if ((((y % 4 == 0 && y % 400 != 0) || y % 400 == 0)) && m == 2) { day++; } printf("%d", day); } }
思路2:
其实这里还有一种比较奇妙的思路,大家知道就行,就是数组第一个元素可以给0,这样就是可以咱们输入几,就可以调用数组中第几个元素了。
void T5_way2(void) { //先创建变量,初始化值 int y = 0; int m = 0; int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; //循环判断 while (scanf("%d %d", &y, &m) != EOF) { int day = days[m]; //看看是不是闰年的2月份 if ((((y % 4 == 0 && y % 400 != 0) || y % 400 == 0)) && m == 2) { day++; } printf("%d", day); } }
T6:
这个题目就是一个简单的计算器,其实也没啥好说的,后面有机会可以说一下转移表。
思路1:
首先用比较简单的思路吧:
void T6_way1(void) { double n1 = 0; double n2 = 0; char op = 0; while (~scanf("%lf%c%lf", &n1,&op, &n2)) { switch (op) { case '+': printf("%.4lf+%.4lf=%.4lf\n", n1, n2, n1 + n2); break; case '-': printf("%.4lf-%.4lf=%.4lf\n", n1, n2, n1 - n2); break; case '*': printf("%.4lf*%.4lf=%.4lf\n", n1, n2, n1 * n2); break; case '/': if (n2 == 0) printf("Wrong!Division by zero!\n"); else printf("%.4lf/%.4lf=%.4lf\n", n1, n2, n1 / n2); break; default: printf("Invalid operation!\n"); } } }
思路2:
其实这种方法就属于自定义函数的方法了。
double add(double n1,double n2) { return n1 + n2; } double sub(double n1, double n2) { return n1 - n2; } double mul(double n1, double n2) { return n1 * n2; } double div(double n1, double n2) { return n1 / n2; } void T6_way2(void) { double n1 = 0; double n2 = 0; char op = 0; while (~scanf("%lf%c%lf", &n1, &op, &n2)) { switch (op) { case '+': printf("%.4lf+%.4lf=%.4lf\n", n1, n2, add(n1, n2)); break; case '-': printf("%.4lf-%.4lf=%.4lf\n", n1, n2, sub(n1,n2)); break; case '*': printf("%.4lf*%.4lf=%.4lf\n", n1, n2, mul(n1,n2)); break; case '/': if (n2 == 0) printf("Wrong!Division by zero!\n"); else printf("%.4lf/%.4lf=%.4lf\n", n1, n2, div(n1,n2)); break; default: printf("Invalid operation!\n"); } } }
思路3
下面咱们用指针结合转移表来做一下哈,转移表就是函数指针数组,跟题目稍微有点不符合,可以自己稍微改改哈,知道有这么一种方法就行,不用太拘泥在那个题里面。
double add(double n1,double n2) { return n1 + n2; } double sub(double n1, double n2) { return n1 - n2; } double mul(double n1, double n2) { return n1 * n2; } double div(double n1, double n2) { return n1 / n2; } menu() { printf("1:'+'\n"); printf("2:'-'\n"); printf("3:'*'\n"); printf("4:'/'\n"); } void T6_way3(void) { double n1 = 0; double n2 = 0; int op = 0; //转移表(函数指针数组) double (*p[5])(double n1, double n2) = { 0,add,sub,mul,div }; menu(); while (~scanf("%lf%d%lf",&n1,&op,&n2)&&op) { if (op > 0 && op < 5) { printf("%.4lf\n", (*p[op])(n1, n2)); } else if (op == 0) printf("退出计算器\n"); else printf("输入有误,重新输入\n"); } }
T7:
这个题目简单,用循环就行了,三种循环都行。
思路1:
这里就只说这么一种循环了,其他都差不多。
void T7_way1(void) { int n = 0; while (~scanf("%d", &n)) { for (int i = 0; i < n; i++) { printf("*"); } printf("\n"); } }
T8:
就是一个双层嵌套循环。
这个题也很简单,直接看代码吧。
思路1:
void T8_way1(void) { int n = 0; while (~scanf("%d", &n)) { int i = 0; for (i = 0; i < n; i++) { int j = 0; for (j = 0; j < n; j++) { printf("* "); } printf("\n"); } } }
T9:
双层嵌套,这个的话把循环的判断条件一改就行。
思路1:
void T9_way1(void) { int n = 0; scanf("%d", &n); for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) { printf("* "); } printf("\n"); } }
结语:
以上就是本节的所有内容了,因为这些代码都是在vs上随手敲的,难免有一些错误哈,测试用例基本都用了1个就过去了,有错误评论区提醒一下,这些题目虽然说很简单,我觉得一些思路还是比较好的,大家借鉴哈~