part.1
1.
#include <stdio.h>
int main() {
double a,b,c;
scanf("%lf %lf %lf", &a, &b, &c);
if(a+b>c && a+c>b && b+c>a) {
if(a==b && a==c)
printf("构成等边三角形\n");
else if(a==b || a==c || b==c)
printf("构成等腰三角形\n");
else
printf("构成一般三角形\n");
}
else
printf("不能构成三角形\n");
return 0;
}
替换为以下代码
#include <stdio.h>
int main() {
double a,b,c;
scanf("%lf %lf %lf", &a, &b, &c);
if(a+b>c && a+c>b && b+c>a) {
if(a==b || a==c || b==c) {
if (a==b && a==c)
printf("构成等边三角形\n");
else
printf("构成等腰三角形\n");
}
else
printf("构成一般三角形\n");
}
else
printf("不能构成三角形\n");
return 0;
}
经检测,当输入含有两个相同数字但无法构成三角形的三个数字后,运行结果依然显示构成等腰三角形,因此不成立,含有逻辑错误。截图如下:
加入循环之后的程序如下
#include <stdio.h>
int main() {
double a,b,c;
while(scanf("%lf%lf%lf",&a,&b,&c)){ 或while(scanf("%ld%ld%ld",&a,&b,&c) != 0){
if(a+b>c && a+c>b && b+c>a)
{
if(a==b || a==c || b==c) {
if (a==b && a==c)
printf("构成等边三角形\n");
else
printf("构成等腰三角形\n");
}
else
printf("构成一般三角形\n");
}
else
printf("不能构成三角形\n");
}
return 0;
}
运行结果如下
改为以下写法
while(scanf("%ld", &a) && scanf("%ld", &b) && scanf("%ld", &c) ){
// ...
}
2.用switch语句改写
#include <stdio.h>
int main()
{
int score;
while(1){
printf("输入学生成绩: ");
if(scanf("%d",&score) == 0) // 如果检测到没有成绩输入,则结束整个循环
break;
if(score<0 || score > 100)
{
printf("输入成绩有误!\n");
continue;
}
switch(score/10)
{
case 9:printf("等级为:A\n");break;
case 8:printf("等级为:B\n");break;
case 7:printf("等级为:C\n");break;
case 6:printf("等级为:D\n");break;
default:printf("等级为:E\n");break;
}
}
return 0;
}
在改写过程中出现的错误与失误:
1. printf("输入学生成绩: "); 写到了循环外面。
2.
if(scanf("%d",&score) == 0) // 如果检测到没有成绩输入,则结束整个循环
break;
没有想到这一条件,以致出现死循环。
与 demo4.cpp存在一些区别,我没有定义grade来存放等级分数。
#include <stdio.h>
int main() {
int score; // 用于存放百分制分数
char grade; // 用于存放等级制分数(取值'A', 'B','C','D', 'E')
while(1) {
printf("输入学生成绩: ");
if(scanf("%d",&score) == 0) // 如果检测到没有成绩输入,则结束整个循环
break;
if(score<0 || score > 100) {
printf("输入成绩有误!\n\n");
continue; // 结束本次循环,开始下一次循环
}
switch(score/10) { // 使用switch进行分数等级判断
case 10:
case 9: grade='A'; break;
case 8: grade='B'; break;
case 7: grade='C'; break;
case 6: grade='D'; break;
default: grade='E';
}
printf("等级为: %c\n\n", grade);
}
return 0;
demo5_1.cpp
#include <stdio.h>
int main() {
int i;
// 在循环语句中使用continue
for(i=1; i<=5; i++) {
if (i%3 == 0) // 如果i是3的倍数,则结束本次循环,开始下一次循环
continue;
printf("i=%d\n",i);
}
return 0;
}
demo5_2.cpp
#include <stdio.h>
int main() {
int i;
// 在循环语句中使用break
for(i=1; i<=5; i++) {
if (i%3 == 0) // 如果i是3的倍数,则结束整个循环
break;
printf("i=%d\n",i);
}
return 0;
}
在循环中使用控制语句continue和break,其功能区别的是:
break:结束整个循环。
continue:结束本次循环,开始下一次循环。
分别运行程序demo6_1.cpp和demo6_2.cpp,结合运行结果,对比和理解在嵌套的循环中控制语句 continue和break的功能。
demo6_1.cpp
#include <stdio.h>
const int LINE=3; // 定义符号常量LINE
const int COLUME=5; // 定义符号常量COLUME
int main() {
int line; // 定义变量line, 用来控制行数
int col; // 定义变量col, 用来控制列数
// 输出LINE行信息
for(line=1; line<=LINE; line++) {
// 每一行中,利用循环,输出各列信息
for(col=1; col<=COLUME; col++) {
if(col%3 == 0) // 如果col是3的倍数,则结束本次循环,开始下一次循环
continue;
printf("%5d", col);
}
printf("\n"); // 每输出完一行,换行
}
return 0;
}
#include <stdio.h>
const int LINE=3; // 定义符号常量LINE
const int COLUME=5; // 定义符号常量COLUME
int main() {
int line; // 定义变量line, 用来控制行数
int col; // 定义变量col, 用来控制列数
// 输出LINE行信息
for(line=1; line<=LINE; line++) {
// 每一行中,利用循环,输出各列信息
for(col=1; col<=COLUME; col++) {
if(col%3 == 0) // 如果col是3的倍数,则结束内层循环体
break;
printf("%5d", col);
}
printf("\n"); // 每输出完一行,换行
}
return 0;
}
在两层嵌套循环中,内层循环中如果出现continue,是否影响外层循环? 不影响。
在两层嵌套循环中,内层循环中如果出现break,是否影响外层循环? 不影响。
part2.
编程找出5个整数中的大数和小数,并输出找出的大数和小数。
补足程序如下
#include <stdio.h>
int main() {
int number, max, min, n;
n=1;
printf("输入第%d个数: ", n);
scanf("%d", &number);
max = number;
min = number;
while(n < 5) {
n++;
printf("输入第%d个数: ", n);
scanf("%d", &number);
if(number >= max)
max = number;
else if(number < min)
min = number;
}
printf("最大数为: %d\n", max);
printf("最小数为: %d\n", min);
return 0;
}
int number, max, min, n;
n=1;
printf("输入第%d个数: ", n);
scanf("%d", &number);
max = number;
min = number;
do
{
n++;
printf("输入第%d个数: ", n);
scanf("%d", &number);
if(number>max)
max = number;
else if(number<min)
min = number;
}while(n<5);
printf("最大数为: %d\n", max);
printf("最小数为: %d\n", min);
return 0;
}
#include <stdio.h>
int main() {
int number, max, min, n;
for(n=1;n<=5;n++)
{
printf("输入第%d个数: ", n);
scanf("%d", &number);
if(number>max)
max = number;
else if(number<min)
min = number;
}
printf("最大数为: %d\n", max);
printf("最小数为: %d\n", min);
return 0;
}
part3.
编程输出101~200之间的所有素数,并输出这一区间素数的个数
#include<stdio.h>
#include<math.h>
int main(){
int n,m,a,col,COLUME;
COLUME=5;
a=0;
for(n=101;n<=200;n++){
for(m=2;m<=sqrt(n);m++){
if(n%m==0)
break;
}
if(m>sqrt(n)){
printf("%5d",n) ;
a=a+1;
if(a%5==0)
printf("\n");
}
}
printf("共有%d个素数",a);
return 0;
}
#include<stdio.h>
const int N=5;
int main()
{
int line,col;
for(line=1;line<=N;line++){
for(col=N-line;col>0;col--)
{
printf(" ");
}
for(col=1;col<=2*line-1;col++)
{
printf("*");
}
printf("\n");
}
return 0;
}