实验2
以下实验都在Visual Studio 2019 Preview平台完成
———————————————————————————————————————————————————————————————————————————————————————————
实验2-1
#include<stdio.h> #include<stdlib.h> int main() { int a = 5, b = 7, c = 100, d, e, f; d = a / b * c; e = a * c / b; f = c / b * a; printf("d=%d\ne=%d\nf=%d", d, e, f); return 0; }

理论分析:
1.由于都是整型,a/b=0.....5,所以值取0,再乘100结果还是0。
2.a*c得500,500/7=71.....3,所以值取71。
3.100/7=14.....2,取值14,14*5得70。
由于整型的运算中没有小数(只取两数的商的整数部分),所以在运算过程中运算的位序改变以后会对之后的运算产生影响。
———————————————————————————————————————————————————————————————————————————————————————————
实验2-2
#include <stdio.h> #include<stdlib.h> int main() { system("color 2"); int x=1234; float f=123.456; double m=123.456; char ch='a'; char a[]="Hello, world!"; int y=3, z=4; printf("%d %d\n", y, z); printf("y=%d, z=%d\n", y,z); printf("%8d,%2d\n", x,x); printf("%f, %8f, %8.1f, %0.2f, %.2e\n",f,f,f,f,f); printf("%lf\n",m); printf("%3c\n", ch); printf("%s\n%15s\n%10.5s\n%2.5s\n%.3s\n",a,a,a,a,a); return 0; }

line12/13:%d即输出整型。
line14:%xd指在输出整型时占位宽x位,多余位宽会空出,而位宽少了也会补上,使输出的值不改变。
line15:%a.bf指在输出浮点型时占位宽a位,保留b位小数(遵循四舍五入),而%e指以指数形式输出。
line16:%lf指输出双精度型。
line17:%xc指在输出字符型时占位宽x位。
line18:%a.bs指在输出字符串时占位宽a位,多余位宽会空出,而位宽少了也会补上,使输出的字符串不改变。.b指保留b个字符。
————————————————————————————————————————————————————————————————————————————————————————————
实验2-3
#include <stdio.h> #include<stdlib.h> int main() { double x, y; char c1, c2, c3; int a1, a2, a3; scanf_s("%d %d %d ", &a1, &a2, &a3); printf("a1=%d,a2=%d,a3=%d,",a1, a2, a3); scanf_s("%c %c %c ", &c1,1, &c2,1, &c3,1); printf("c1='%c',c2='%c',c3='%c',", c1, c2, c3); scanf_s("%lf %lf", &x, &y); printf("x=%.1lf,y=%.1lf\n", x, y); return 0; }
实验中会犯的错误:没有在输入行末尾“%d %d %d”和“%c %c %c"后加空格,导致输入时回车占了一个字符的位置,使输出结果出错。
————————————————————————————————————————————————————————————————————————————————————————————、
实验2-4
#include<stdio.h> #include<stdlib.h> int main() { char x; while (printf("请输入一个字符:"), scanf_s(" %c", &x, 1) != 0) if (x >= '1' && x <= '9') printf("%c是数字字符\n", x); else if ((x >= 'a' && x <= 'z')||(x>='A'&&x<='Z')) printf("%c是英文字母\n", x); else printf("%c是其它字符\n", x); return 0; }

———————————————————————————————————————————————————————————————————————————————————————————
实验2-5
#include <stdio.h> #include<stdlib.h> int main() { char ans1,ans2; printf("复习了没? (输入y或Y表示复习了,输入n或N表示没复习) : "); ans1 = getchar(); getchar(); printf("\n动手敲代码了没? (输入y或Y表示敲了,输入n或N表示木有敲) : "); ans2 = getchar(); if((ans1=='y'||ans1=='Y')&&(ans2=='y'||ans2=='Y')) printf("\n罗马不是一天建成的:)\n"); else printf("\n罗马不是一天毁灭的。。。\n"); return 0; }



思考:在删去第八行的getchar()后,结果如图

无论第一个输入的字符是Y(y)或N(n),输出的结果都是”罗马不是一天毁灭的。。。“,
应该是在输入第一个字符后按回车,程序将回车赋给了ans2,而第八行的getchar()消除的回车产生的影响。
———————————————————————————————————————————————————————————————————————————————————————————
实验2-6
#include<stdio.h> #include<stdlib.h> #include<math.h> int main() { int n, q, sum; q = 2; while(printf("请输入一个数(数字在1-10之间):"), scanf_s("%d", &n), sum = pow(q,n)-1, printf("n = %d时,sum = %d\n", n, sum)!=0);
return 0; }

———————————————————————————————————————————————————————————————————————————————————————————
实验2-7
#include<stdio.h> #include<stdlib.h> int main() { printf(" O \n<H>\n1 1"); return 0; }

由于对小人的循环列阵输入不是很清楚,所以直接暴力输出所有小人:
#include<stdio.h> #include<stdlib.h> int main() { printf(" O O O O O O O O O \n"); printf("<H> <H> <H> <H> <H> <H> <H> <H> <H>\n"); printf("1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n"); printf(" O O O O O O O \n"); printf(" <H> <H> <H> <H> <H> <H> <H> \n"); printf(" 1 1 1 1 1 1 1 1 1 1 1 1 1 1 \n"); printf(" O O O O O \n"); printf(" <H> <H> <H> <H> <H> \n"); printf(" 1 1 1 1 1 1 1 1 1 1 \n"); printf(" O O O \n"); printf(" <H> <H> <H> \n"); printf(" 1 1 1 1 1 1 \n"); printf(" O \n"); printf(" <H> \n"); printf(" 1 1 \n"); return 0; }

通过添加while函数,可以实现颜色的循环。
#include<stdio.h> #include<stdlib.h> #include<Windows.h> int main() { int a; printf(" O O O O O O O O O \n"); printf("<H> <H> <H> <H> <H> <H> <H> <H> <H>\n"); printf("1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n"); printf(" O O O O O O O \n"); printf(" <H> <H> <H> <H> <H> <H> <H> \n"); printf(" 1 1 1 1 1 1 1 1 1 1 1 1 1 1 \n"); printf(" O O O O O \n"); printf(" <H> <H> <H> <H> <H> \n"); printf(" 1 1 1 1 1 1 1 1 1 1 \n"); printf(" O O O \n"); printf(" <H> <H> <H> \n"); printf(" 1 1 1 1 1 1 \n"); printf(" O \n"); printf(" <H> \n"); printf(" 1 1 \n"); while (1) { for (a = 0; a < 1; a++) system("color 1"), Sleep(1000); system("color 2"), Sleep(1000); system("color 3"), Sleep(1000); system("color 4"), Sleep(1000); } return 0; }
或者使用while+if函数,通过特定条件也可以实现颜色循环变化:
int a=1;
while (a <= 1000000)
{
a = a++;
{if (a % 10 == 0) system("color 1"); }
{if (a % 10 == 1) system("color 2"); }
{if (a % 10 == 2) system("color 3"); }
{if (a % 10 == 3) system("color 4"); }
{if (a % 10 == 4) system("color 5"); }
{if (a % 10 == 5) system("color 6"); }
{if (a % 10 == 6) system("color 7"); }
{if (a % 10 == 7) system("color 8"); }
{if (a % 10 == 8) system("color 9"); }
{if (a % 10 == 9) system("color a"); }
}

关于小人移动的思考:
在小人左边或右边打印字符,使字符移动,产生小人移动的效果。
——————————————————————————————————————————————————————————————————————————————————————————
存在的不足:
1.不会列阵输出小人,只能手动输入。
2.不会小人的移动(不知道该用什么代码实现),以及如何让所有小人都可以移动(而不是只有一个小人)。
3.在实验2-4和2-6中使用循环输入时使用while((xxx)!=0);或while((xxx)!=EOF);时,无法用Ctrl+E或Ctrl+D以及Ctrl+Z结束程序,特别在实验2-6中结束时会出现无限循环。

———————————————————————————————————————————————————————————————————————————————————————————————
11.5更新
实验2-7-3
通过while循环的嵌套实现了小人的列阵输出
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 9, b, c = 1;
while (a>=1)
{
b = 1;
while (b <= a)
{
while (c <= ((10 - a) / 2) * 7)
{
printf(" ");
c = c + 1;
}
printf(" O ");
b = b + 1;
}
printf("\n");
b = 1, c = 1;
while (b <= a)
{
while (c <= ((10 - a) / 2) * 7)
{
printf(" ");
c = c + 1;
}
printf("<H> ");
b = b + 1;
}
printf("\n");
b = 1, c = 1;
while (b <= a)
{
while (c <= ((10 - a) / 2) * 7)
{
printf(" ");
c = c + 1;
}
printf("1 1 ");
b = b + 1;
}
printf("\n");
b = 1, c = 1;
a = a - 2;
}
return 0;
}

实验2-7-5
按照实验2-7-2的方式,对空格进行循环增加的输出配合cls清屏实现了单个小人的移动
#include<stdio.h> #include<stdlib.h> #include<Windows.h> int main() { int a = 0, b; system("color 2"); while (a <= 50) { system("cls"); b = 1; while (b <= a) { printf(" "); b = b + 1; } printf(" O \n"); b = 1; while (b <= a) { printf(" "); b = b + 1; } printf("<H>\n"); b = 1; while (b <= a) { printf(" "); b = b + 1; } printf("1 1"); Sleep(300); a = a + 1; } return 0; }

while(a<=x)中x控制小人移动的距离
Sleep(y)中y控制小人移动的距离

浙公网安备 33010602011771号