【C语言】编程初学者入门训练(6)
文章目录
- 51. 计算一元二次方程
- 52. 获取月份天数
- 53. 简单计算器
- 54. 线段图案
- 55. 正方形图案
- 56. 直角三角形图案
- 57. 翻转直角三角形图案
- 58. 带空格直角三角形图案
- 59. 金字塔图案
- 60. 翻转金字塔图案
51. 计算一元二次方程
-
问题描述:从键盘输入a, b, c的值,编程计算并输出一元二次方程ax2 + bx + c = 0的根,当a = 0时,输出“Not quadratic equation”,当a ≠ 0时,根据△ = b2 - 4ac的三种情况计算并输出方程的根。
-
输入描述:多组输入,一行,包含三个浮点数a, b, c,以一个空格分隔,表示一元二次方程ax2 + bx + c = 0的系数。
-
输出描述:针对每组输入,输出一行,输出一元二次方程ax2 + bx +c = 0的根的情况。
-
如果a = 0,输出“Not quadratic equation”;
-
如果a ≠ 0,分三种情况:
-
△ = 0,则两个实根相等,输出形式为:x1=x2=…。
-
△ > 0,则两个实根不等,输出形式为:x1=…;x2=…,其中x1 <= x2。
-
△ < 0,则有两个虚根,则输出:x1=实部-虚部i;x2=实部+虚部i,即x1的虚部系数小于等于x2的虚部系数,实部为0时不可省略。实部= -b / (2a),虚部= sqrt(-△ ) / (2a)所有实数部分要求精确到小数点后2位,数字、符号之间没有空格。
-
-
-
示例1:
- 输入:2.0 7.0 1.0
- 输出:x1=-3.35;x2=-0.15
-
示例2:
- 输入:0.0 3.0 3.0
- 输出:Not quadratic equation
-
示例3:
- 输入:1 2 1
- 输出:x1=x2=-1.00
-
示例4:
- 输入:2 2 5
- 输出:x1=-0.50-1.50i;x2=-0.50+1.50i
-
示例5:
- 输入:1 0 1
- 输出:x1=0.00-1.00i;x2=0.00+1.00i
-
代码实现:
#include<stdio.h>
#include<math.h>
int main()
{double a = 0.0;double b = 0.0;double c = 0.0;while (scanf("%lf %lf %lf", &a, &b, &c) != EOF){if (a == 0){printf("Not quadratic equation\n");}else{double deta = b * b - 4 * a * c;if (deta == 0){if (a < 0){printf("x1=x2=%.2lf\n", (-b - sqrt(deta)) / (2 * a));//因为测试用例4 0 0会输出-0.00 所以加一个判断条件}else{printf("x1=x2=%.2lf\n", (-b + sqrt(deta)) / (2 * a));}}else if (deta > 0){printf("x1=%.2lf;x2=%.2lf\n", ((-b - sqrt(deta)) / (2 * a)), ((-b + sqrt(deta)) / (2 * a)));}else{double real = -b / (2 * a);double image = sqrt(-deta) / (2 * a);if (image < 0)//测试用例的 -1 5 -10 会出现 -- +- 所以加判断条件 把-号消掉{image = (-image);}printf("x1=%.2lf-%.2lfi;x2=%.2lf+%.2lfi\n", real, image, real, image);}}}return 0;
}
52. 获取月份天数
- 问题描述:KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。
- 输入描述:多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。
- 输出描述:针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。
- 示例:
- 输入:2008 2
- 输出:29
- 代码实现:
#include <stdio.h>int main()
{int year,month;while(scanf("%d %d",&year,&month) != ROF){int month1[] = {31,29,31,30,31,30,31,31,30,31,30,31};int month2[] = {31,28,31,30,31,30,31,31,30,31,30,31};if((0 == year%4 && 0 != year%100)||(0 == year%400)){printf("%d\n",month1[month - 1]);}else{printf("%d\n",month2[month - 1]);}}return 0;
}
53. 简单计算器
-
问题描述:KiKi实现一个简单计算器,实现两个数的“加减乘除”运算,用户从键盘输入算式“操作数1运算符操作数2”,计算并输出表达式的值,如果输入的运算符号不包括在(+、-、*、/)范围内,输出“Invalid operation!”。当运算符为除法运算,即“/”时。如果操作数2等于0.0,则输出“Wrong!Division by zero!”
-
数据范围:字符串长度满足 3≤n≤50 ,保证运算符是一个char类型字符。
-
输入描述:输入一行字符串,操作数1+运算符+操作数2 (其中合法的运算符包括:+、-、*、/)。
-
输出描述:输出为一行。
- 如果操作数和运算符号均合法,则输出一个表达式,操作数1运算符操作数2=运算结果,各数小数点后均保留4位,数和符号之间没有空格。
- 如果输入的运算符号不包括在(+、-、*、/)范围内,输出“Invalid operation!”。当运算符为除法运算,即“/”时。
- 如果操作数2等于0.0,则输出“Wrong!Division by zero!”。
-
示例1:
- 输入:1.0+3.0
- 输出:1.0000+3.0000=4.0000
-
示例2:
- 输入:1.0;4.0
- 输出:Invalid operation!
-
示例3:
- 输入:44.0/0.0
- 输出:Wrong!Division by zero!
-
代码实现:
#include <stdio.h>int main()
{double n1,n2;char op;while(scanf("%lf%c%lf",&n1,&op,&n2) != EOF){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(0.0 == n2){ printf("Wrong!Division by zero!\n");break;}else{printf("%.4lf/%.4lf=%.4lf\n",n1,n2,n1/n2);break;}default:printf("Invalid operation!\n");break;}}return 0;
}
54. 线段图案
-
问题描述:KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的线段图案。
-
输入描述:多组输入,一个整数(1~100),表示线段长度,即“*”的数量。
-
输出描述:针对每行输入,输出占一行,用“*”组成的对应长度的线段。
-
示例:
输入:102
输出:************
- 代码实现:
#include <stdio.h>int main()
{int n;while(scanf("%d",&n) != EOF){while(n--) printf("*");putchar('\n');}return 0;
}
55. 正方形图案
-
问题描述:KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“ * ”组成的正方形图案。
-
输入描述:多组输入,一个整数(1~20),表示正方形的长度,也表示输出行数。
-
输出描述:针对每行输入,输出用“”组成的对应边长的正方形,每个“”后面有一个空格。
-
示例1:
输入:4
输出:* * * ** * * ** * * ** * * *
- 示例2:
输入:5
输出:* * * * ** * * * ** * * * ** * * * ** * * * *
- 代码实现:
#include <stdio.h>int main()
{int n;while(scanf("%d",&n) != EOF){for(int i = 0;i < n;i++){for(int j = 0;j < n;j++){printf("* ");}printf("\n");}}return 0;
}
56. 直角三角形图案
- 问题描述:KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的直角三角形图案。
- 输入描述:多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。
- 输出描述:针对每行输入,输出用“”组成的对应长度的直角三角形,每个“”后面有一个空格。
- 示例1:
输入:4
输出:** ** * ** * * *
- 示例2:
输入:5
输出:** ** * ** * * ** * * * *
- 代码实现:
#include <stdio.h>int main()
{int n;while(scanf("%d",&n) != EOF){for(int i = 0;i < n;i++){for(int j = 0;j <= i;j++){printf("* ");}putchar('\n');}}return 0;
}
57. 翻转直角三角形图案
- 问题描述:KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“ * ”组成的翻转直角三角形图案。
- 输入描述:多组输入,一个整数(2~20),表示翻转直角三角形直角边的长度,即“*”的数量,也表示输出行数。
- 输出描述:针对每行输入,输出用“”组成的对应长度的翻转直角三角形,每个“”后面有一个空格。
- 示例1:
输入:5
输出:* * * * ** * * ** * ** **
- 示例2:
输入:6
输出:* * * * * ** * * * ** * * ** * ** **
- 代码实现:
#include <stdio.h>int main()
{int n;while(scanf("%d",&n) != EOF){for(int i = 0;i < n;i++){for(int j = n;j > i;j--){printf("* ");}putchar('\n');}}return 0;
}
58. 带空格直角三角形图案
-
问题描述:KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“ * ”组成的带空格直角三角形图案。
-
输入描述:多组输入,一个整数(2~20),表示直角三角形直角边的长度,即“*”的数量,也表示输出行数。
-
输出描述:针对每行输入,输出用“”组成的对应长度的直角三角形,每个“”后面有一个空格。
-
示例1:
输入:5
输出:* * * * * * * * * *
* * * * *
- 示例2:
输入:4
输出:* * * * * *
* * * *
- 代码实现:
#include <stdio.h>int main()
{int n;while(scanf("%d",&n) != EOF){for(int i = 0;i < n;i++){//第一行打印4对空格,第二行三对,3行两对...for(int j = 0;j < n-i-1;j++){printf(" ");//打印空格}//第1打印0+1颗*,第二行打印1+1颗*,第三行三颗*...for(int j = 0;j < i + 1 ;j++){printf("* ");}putchar('\n');}}return 0;
}
59. 金字塔图案
- 问题描述:KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“ * ”组成的金字塔图案。
- 输入描述:多组输入,一个整数(2~20),表示金字塔边的长度,即“*”的数量,,也表示输出行数。
- 输出描述:针对每行输入,输出用“”组成的金字塔,每个“”后面有一个空格。
示例1:
输入:4
输出:* * * * * *
* * * *
- 示例2:
输入:5
输出:* * * * * * * * * *
* * * * *
- 代码实现:
#include <stdio.h>int main()
{int n;while(scanf("%d",&n) != EOF){for(int i = 0;i < n;i++){for(int j = 0;j < n-i-1;j++){printf(" ");}for(int j = 0;j <= i;j++){printf("* ");}putchar('\n');}}return 0;
}
60. 翻转金字塔图案
- 问题描述:KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“ * ”组成的翻转金字塔图案。
- 输入描述:多组输入,一个整数(2~20),表示翻转金字塔边的长度,即“*”的数量,也表示输出行数。
- 输出描述:针对每行输入,输出用“”组成的金字塔,每个“”后面有一个空格。
- 示例1:
输入:5
输出:
* * * * * * * * * * * * * * *
- 示例2:
输入:6
输出:
* * * * * * * * * * * * * * * * * * * * *
- 代码实现:
#include <stdio.h>int main()
{int n;while(scanf("%d",&n) != EOF){//打印n行for(int i = 0;i < n;i++){//先根据i值来打印空格,i为0时不打印空格,i为1时打印一个空格...for(int j = 0;j < i;j++){printf(" ");}//第一行打印5组*+空格,第二行4组...for(int j = 0;j <= n-i-1;j++){printf("* ");}putchar('\n');}}return 0;
}