3. 运行程序 程序功能是求一元二次方程ax2+bx+c=0的根,完成下列要求。 #include #include void main( ) { float a,b,c,d,x1,x2; scanf("%f,%f,%f",&a,&b,&c); d=b*b-4.0*a*c; if(fabs(d)<1.0e-6) { x1=x2=-b/(2.0*a); printf("\nx1=x2=%f",x1); } else { if(d>0) { printf("\nx1=%f",(-b+sqrt(d))/(2.0*a)); printf("\nx2=%f",(-b-sqrt(d))/(2.0*a)); } else { printf("\nx1=%f+i%f",-b/(2.0*a),sqrt(-d)/(2.0*a)); printf("\nx2=%f+i%f",-b/(2.0*a),sqrt(-d)/(2.0*a)); } } } 要求: (1)输入并调试上述源程序。 (2)对源程序进行编译、连接。 (3)运行源程序并存盘。 (4)写出程序运行结果(输入数据分别求出该方程的3种根,即相等实根、不等实根和共轭复根),填入表3-3。 程序: #include int main() { system("color f3"); float a, b, c, d, x1, x2; scanf_s("%f,%f,%f", &a, &b, &c); d = b * b - 4.0 * a * c; if (fabs(d) < 1.0e-6) { x1 = x2 = -b / (2.0 * a); printf("\nx1=x2=%f", x1); } else { if (d > 0) { printf("\nx1=%f", (-b + sqrt(d)) / (2.0 * a)); printf("\nx2=%f", (-b - sqrt(d)) / (2.0 * a)); } else { printf("\nx1=%f+i%f", -b / (2.0 * a), sqrt(-d) / (2.0 * a)); printf("\nx2=%f+i%f", -b / (2.0 * a), sqrt(-d) / (2.0 * a)); } } }
思考:分析程序中分支结构的嵌套,用if-else-if结构实现该程序。说明为什么用(fabs(d)<1.0e-6)表示d等于0?
答:这是为了判断浮点数相等,由于计算机保存的浮点数是2进制的,在精度上有一定的偏差。if (disc == 0.0) 时,disc不一定精确地等于0,也许会等于0.000001。为了避免浮点数比较上的误差,就要设定一个误差范围,也就是(-1e-6, 1e-6)这个范围内,如果disc落在这个范围内,就认为其等于0了。
4.程序填空 从健盘输入5种算术运算符,+、-、*、/、%,再输入两个整数,对其进行对应的算术运算并输出结果,如果输入的字符不是算术运算符,则输出字符串“Input error!”,提示出错。 #include void main( ) { char op; int a,b; op=getchar(); scanf("%d,%d",&a,&b); switch(op) { case '+':printf("a%cb=%d",op,a+b); break; case '-':printf("a%cb=%d",op,a-b); break; case '*': break; case '/':printf("a%cb=%d",op,a/b); break; case '%':printf("a%cb=%d",op,a%b); break; default: } 要求: (1)根据要求在上述源程序的横线上填入适当内容,并输入调试。 (2)对源程序进行编译连接、运行,写出程序运行结果(要求输入5组数据,分别对应+、-、*、/、%)。填入表3-4,并对结果进行分析,理解switch case结构的语法形式和应用场合。 程序: #include int main() { system("color f3"); char op; int a, b; op = getchar(); scanf_s("%d,%d", &a, &b); switch (op) { case'+':printf("a%cb=%d", op, a + b); break; case'-':printf("a%cb=%d", op, a - b); break; case'*':printf("a%cb=%d", op, a * b); break; case'/':printf("a%cb=%d", op, a / b); break; case'%':printf("a%cb=%d", op, a % b); break; default:printf("input error!\n"); } } 5.有一分段函数: 编写程序,输入x值,输出y值 程序: #include int main() { int x, y; printf("请输入x的值"); scanf_s("%d,", &x); if (x < 0)//使用多个if对x的范围进行判断 { y = 4 * x + 5; } if (x >= 0 && x < 10)//&&是且的意思 { y = x * x - 2 * x + 5; } if (x >= 10) { y = x * x * x - 6 * x; } printf("y的值是%d\n", y); return 0; } 6.编写程序 从健盘输入年份,判断该年份是否为闰年。判断闰年的条件是:能被4整除但不能被100整除,或能被400整除。 程序: #include int main() { system("color f3"); int year, a; printf("请输人年份:\n"); scanf_s("%d", &year); if (year % 400 == 0) a = 1; else { if (year % 4 == 0 && year % 100 != 0)//"!=":不等于 a = 1; else a = 0; } if (a == 1) { printf("%d 此年是闰年\n", year); } else { printf("%d 此年非闰年\n", year); } } 7.编写程序 已经一包海鲜单价为46.5元,如果购买100~300包,则按95%优惠;如果购买300~500包,则按85%优惠;如果购买501~1000包,则按80%优惠;如果购买10000包以上,则按70%优惠。试编写一个计算顾客购买x包海鲜所需金额且打印购买数量、单价和总金额的程序。 程序: #include int main(void) { system("color f3"); double a = 46.5, c = 0;//a为单价 b为数量 c为总金额 int b = 0; printf("输入你想要购买的数量\n"); scanf_s("%d", &b); if (b < 0) { printf("check your input!(num>=0)\n"); return 0; } if (b < 100) c = b *a; if (b >= 100 && b <= 300) c = b * a * 0.95; if (b > 300 && b <= 500) c = b * a * 0.85; if (b > 500 && b <= 1000) c = b * a * 0.8; if (b > 1000) c = b *a * 0.7; printf("数量:%d 单价:%lf 总金额:%lf", b, a,c); return 0; } 8.编写程序 输入10个整数。统计其中正数、负数的个数,并求正数及负数的累加和。 程序: #include int main() { system("color f3"); int i, n, count = 0, s = 0; for (i = 0; i < 10; i++) { printf("请输入第%d个数:", i + 1); scanf_s("%d", &n); if (n >= 0) count++; s += n; } printf("正数的个数为:%d\n", count); printf("负数的个数为:%d\n", 10 - count); printf("sum=%d\n", s); 9.编写程序 要求36人一次搬36块砖,男搬4,女搬2,两个小孩抬一块,要求一次搬完。问:男、女、小孩各多少人? 程序: #include void main(void) { int i, j, k; for (i = 1; i < 9; i++) { for (j = 1; j < 18; j++) { k = 36 - i - j; if (k % 2 == 0) { if (4 * i + 2 * j + k / 2 == 36) printf("%d,%d,%d", i, j, k); } } } } 10.编写程序 有4个圆塔,圆心分别为(2,2) (-2,2) (2,-2) (-2,-2) ,圆半径为1。这4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。 算法提示: 输入某点坐标(x,y),求出(x,y)到各塔心的距离,判断输入点是否在塔外。 程序: #include int main() { int r = 1; printf("请输入任意一点的坐标:"); int a, b; int x, y; float c; scanf_s("%d %d", &a, &b); x = fabs(a); y = fabs(b);//先将a和b的坐标取绝对值 c = sqrt((x - 2) * (x - 2) + (y - 2) * (y - x));//c是点到圆心的距离 if (c > r) printf("0");//求点到圆心的距离大于半径,高度为0 else printf("10");//求点到圆心的距离小于半径,高度为10 return 0; } |