实验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控制小人移动的距离

 

posted @ 2020-11-02 19:32  Crewary  阅读(82)  评论(3)    收藏  举报