m0_64371081 2022-04-07 20:56 采纳率: 100%
浏览 19
已结题

为什么加了system(“cls")后矩阵图形会变?

问题相关代码,请勿粘贴截图

#include<stdio.h>
#include <windows.h>
char a[50][50];
void tuxing1()
{
int i,j;
//右上
for(i=6;i<=10;i++)
for(j=1;j<=5;j++)
{
if(j<=5-(i-5))
a[i][j]=' ';
else
a[i][j]='1';
}
for(i=6;i<=10;i++)
for(j=6;j<=10;j++)
a[i][j]='1';

//左上 
for(i=1;i<=5;i++)
 for(j=11;j<=10+i;j++)
   a[i][j]='2';
for(i=6;i<=10;i++)
 for(j=11;j<=15;j++)
  a[i][j]='2';

 //左下 
 for(i=16;i<=20;i++)
 for(j=6;j<=10;j++)
   {
       if(j<=(i-10))
        a[i][j]=' ';
        else a[i][j]='2';
   }
for(i=11;i<=15;i++)
 for(j=6;j<=10;j++)
  a[i][j]='2';

 //右下 
 for(i=11;i<=15;i++)
 for(j=16;j<=31-i;j++)
   {
        
         a[i][j]='1';
   }  
for(i=11;i<=15;i++)
 for(j=11;j<=15;j++)
  a[i][j]='1';
for(i=1;i<=20;i++)
 {
     for(j=1;j<=20;j++)
 {
     printf("%c",a[i][j]);
  } 
  printf("\n");
 }

}
void tuxing2()
{

int i,j;
//右上 
for(i=6;i<=10;i++)
 for(j=1;j<=5;j++)
   {
       if(j<=5-(i-5))
       a[i][j]=' ';
    else
       a[i][j]='2';
   }
for(i=6;i<=10;i++)
 for(j=6;j<=10;j++)
  a[i][j]='2';

//左上 
for(i=1;i<=5;i++)
 for(j=11;j<=10+i;j++)
   a[i][j]='1';
for(i=6;i<=10;i++)
 for(j=11;j<=15;j++)
  a[i][j]='1';

 //左下 
 for(i=16;i<=20;i++)
 for(j=6;j<=10;j++)
   {
       if(j<=(i-10))
        a[i][j]=' ';
        else a[i][j]='1';
   }
for(i=11;i<=15;i++)
 for(j=6;j<=10;j++)
  a[i][j]='1'; 
 //右下 
 for(i=11;i<=15;i++)
 for(j=16;j<=31-i;j++)
   {
        
         a[i][j]='2';
   }  
for(i=11;i<=15;i++)
 for(j=11;j<=15;j++)
  a[i][j]='2';
for(i=1;i<=20;i++)
 {
     for(j=1;j<=20;j++)
 {
     printf("%c",a[i][j]);
  } 
  printf("\n");
 }

}
int main(){ //主函数入口
int k=1;
tuxing1();
while(1){
system("cls");
if(k%2==0){
tuxing2();
Sleep(400); //控制停顿时间
}else{
tuxing1();
Sleep(400); //控制停顿时间
}
k++;
}
return 0;
}

运行结果及报错内容

img

我的解答思路和尝试过的方法

删除system(”cls“)

img

我想要达到的结果

虽然删除清屏的代码后 ,所显示的矩阵图形是对的,但是实现不了只在一个界面,会一直循环出现,本意是想让其循环但只出现一个图形而非一直循环出现图形。
有点绕

  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-04-08 09:51
    关注

    仅供参考:

    #include <windows.h>
    #include <stdio.h>
    
    void ConPrint(char *CharBuffer, int len);
    void ConPrintAt(int x, int y, char *CharBuffer, int len);
    void gotoXY(int x, int y);
    void ClearConsole(void);
    void ClearConsoleToColors(int ForgC, int BackC);
    void SetColorAndBackground(int ForgC, int BackC);
    void SetColor(int ForgC);
    void HideTheCursor(void);
    void ShowTheCursor(void);
    
    int main(int argc, char* argv[])
    {
       HideTheCursor();
       ClearConsoleToColors(15, 1);
       ClearConsole();
       gotoXY(1, 1);
       SetColor(14);
       printf("This is a test...\n");
       Sleep(5000);
       ShowTheCursor();
       SetColorAndBackground(15, 12);
       ConPrint("This is also a test...\n", 23);
       SetColorAndBackground(1, 7);
       ConPrintAt(22, 15, "This is also a test...\n", 23);
       gotoXY(0, 24);
       SetColorAndBackground(7, 1);
       return 0;
    }
    
    //This will clear the console while setting the forground and
    //background colors.
    void ClearConsoleToColors(int ForgC, int BackC)
    {
       WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
       //Get the handle to the current output buffer...
       HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
       //This is used to reset the carat/cursor to the top left.
       COORD coord = {0, 0};
       //A return value... indicating how many chars were written
       //not used but we need to capture this since it will be
       //written anyway (passing NULL causes an access violation).
       DWORD count;
    
       //This is a structure containing all of the console info
       // it is used here to find the size of the console.
       CONSOLE_SCREEN_BUFFER_INFO csbi;
       //Here we will set the current color
       SetConsoleTextAttribute(hStdOut, wColor);
       if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
       {
          //This fills the buffer with a given character (in this case 32=space).
          FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
    
          FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
          //This will set our cursor position for the next print statement.
          SetConsoleCursorPosition(hStdOut, coord);
       }
    }
    
    //This will clear the console.
    void ClearConsole()
    {
       //Get the handle to the current output buffer...
       HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
       //This is used to reset the carat/cursor to the top left.
       COORD coord = {0, 0};
       //A return value... indicating how many chars were written
       //   not used but we need to capture this since it will be
       //   written anyway (passing NULL causes an access violation).
       DWORD count;
       //This is a structure containing all of the console info
       // it is used here to find the size of the console.
       CONSOLE_SCREEN_BUFFER_INFO csbi;
       //Here we will set the current color
       if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
       {
          //This fills the buffer with a given character (in this case 32=space).
          FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
          FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
          //This will set our cursor position for the next print statement.
          SetConsoleCursorPosition(hStdOut, coord);
       }
    }
    
    //This will set the position of the cursor
    void gotoXY(int x, int y)
    {
       //Initialize the coordinates
       COORD coord = {x, y};
       //Set the position
       SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
    }
    
    //This will set the forground color for printing in a console window.
    void SetColor(int ForgC)
    {
       WORD wColor;
       //We will need this handle to get the current background attribute
       HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
       CONSOLE_SCREEN_BUFFER_INFO csbi;
    
       //We use csbi for the wAttributes word.
       if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
       {
          //Mask out all but the background attribute, and add in the forgournd color
          wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);
          SetConsoleTextAttribute(hStdOut, wColor);
       }
    }
    
    //This will set the forground and background color for printing in a console window.
    void SetColorAndBackground(int ForgC, int BackC)
    {
       WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);;
       SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);
    }
    
    //Direct console output
    void ConPrint(char *CharBuffer, int len)
    {
       DWORD count;
       WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), CharBuffer, len, &count, NULL);
    }
    
    //Direct Console output at a particular coordinate.
    void ConPrintAt(int x, int y, char *CharBuffer, int len)
    {
       DWORD count;
       COORD coord = {x, y};
       HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
       SetConsoleCursorPosition(hStdOut, coord);
       WriteConsole(hStdOut, CharBuffer, len, &count, NULL);
    }
    
    //Hides the console cursor
    void HideTheCursor()
    {
       CONSOLE_CURSOR_INFO cciCursor;
       HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    
       if(GetConsoleCursorInfo(hStdOut, &cciCursor))
       {
          cciCursor.bVisible = FALSE;
          SetConsoleCursorInfo(hStdOut,    &cciCursor);
       }
    }
    
    //Shows the console cursor
    void ShowTheCursor()
    {
       CONSOLE_CURSOR_INFO cciCursor;
       HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    
       if(GetConsoleCursorInfo(hStdOut, &cciCursor))
       {
          cciCursor.bVisible = TRUE;
          SetConsoleCursorInfo(hStdOut,    &cciCursor);
       }
    }
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月7日

悬赏问题

  • ¥15 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了