风过无痕1989 发表于 2020-7-25 00:35:39

我的开关有点失灵

// 将 4×4 的数组进行转换后输出,要求原始数组的数据随机输入,新数组以4行4列的方式输出

#include<stdio.h>
#include<stdlib.h>
int main()

{
        int i,j,k,m,q = 0,n = 0;
        int a,b;                                 /* a存放原始数组数据,b存放旋转后数组数据 */
       
        printf("系统随机输入 16 个数 \n");
        printf("\n");
        for(i = 0;i < 4;i++)
        {
                for(j = 0;j < 4;j++)
                {
                        for(k = 1;k < 1000;k++)
                        {
                                m = rand() % 100;
                               a = m;
                        }
                }
        }
        for(i = 0;i < 4;i++)                              /* 打印 a 数组 */
        {
                for(j = 0;j < 4;j++)
                {
                        printf("   %d",a);
                }
                printf("\n");
                printf("\n");
        }
loop:       
        printf("逆时针旋转90度请输入 1 ;垂直翻转请输入 2 ;水平翻转请输入 3 :\n");
        scanf("%d\n",&q);
    printf("\n");
        switch(q)
        {
               
        case 1:{
                for(i = 0;i < 4;i++)                     /* 数组开始旋转转换 */
                {
                        for(j = 0;j < 4;j++)         
                        {
                                b = a;
                        }
                }
                printf("\n");
                printf("旋转转换后的 b 数组:\n");
                printf("\n");
               
                for(i = 0;i < 4;i++)                      /* 打印旋转后的 b 数组 */
                {
                        for(j = 0;j < 4;j++)
                        {
                                printf("   %d",b);
                        }
                        printf("\n");
                        printf("\n");
                       
                }
                   }
                break;               
        case 2:{
                printf("\n");
                printf("垂直翻转后的 b 数组:\n");
                printf("\n");
                for(i = 0;i < 4;i++)                  /* 垂直翻转 b 数组 */
                {
                        for(j = 0;j < 4;j++)
                        {
                                b = a;               
                        }
                }
               
                for(i = 0;i < 4;i++)                   /* 打印垂直翻转后的 b 数组 */
                {
                        for(j = 0;j < 4;j++)
                        {
                                printf("   %d",b);
                        }
                        printf("\n");
                        printf("\n");
                }
                   }
                break;                       
        case 3:{
                             printf("\n");
                                printf("水平翻转后的 b 数组:\n");
                                printf("\n");
                               
                                for(i = 0;i < 4;i++)                /* 水平翻转 b 数组 */
                                {
                                        for(j = 0;j < 4;j++)
                                        {
                                                b = a;
                                        }
                                       
                                }
                                for(i = 0;i < 4;i++)               /* 打印水平翻转后的 b 数组 */
                                {
                                        for(j = 0;j < 4;j++)
                                        {
                                                printf("   %d",b);
                                        }
                                        printf("\n");
                                        printf("\n");
                                }
                                printf("\n");
                   }
                break;
        }
    goto loop;
}

sunrise085 发表于 2020-7-25 09:56:14

????
你的问题是什么???
什么叫开关失灵???

风过无痕1989 发表于 2020-7-25 10:26:11

本帖最后由 风过无痕1989 于 2020-7-25 10:28 编辑

sunrise085 发表于 2020-7-25 09:56
????
你的问题是什么???
什么叫开关失灵???

      printf("逆时针旋转90度请输入 1 ;垂直翻转请输入 2 ;水平翻转请输入 3 :\n");
      scanf("%d\n",&q);
    printf("\n");
      switch(q)
      {
               
      case 1:{

输入变换类型的数字时,有时输入一次不行,要输入2次。比如:输入 1加回车,没反映,再输入一次,才能切换

baige 发表于 2020-7-25 10:35:52

本帖最后由 baige 于 2020-7-25 10:40 编辑

scanf("%d\n",&q); \n去掉scanf("%d",&q); 或者再加一个\变成scanf("%d\\n",&q);

sunrise085 发表于 2020-7-25 11:00:04

本帖最后由 sunrise085 于 2020-7-25 16:22 编辑

可能是你对scanf理解不太好
scanf是按照你规定的格式从缓冲区读取字符。
它会严格按照你在引号内的格式进行读取的
一般情况下引号之间只写格式化要求,不写任何其他字符,因为一般情况下你写了什么其他字符,就需要你输入什么字符,一旦输入不对,就会出错,所以,你需要把'\n'删掉。

scanf 中的'\n'很特别。你输入一个数后,它是不会立即显示的,要等再接收到一个非(空格、制表符、回车)的输入scanf语句才结束。
但请注意的是,最后输入的那个非(空格、制表符、回车)的东西是不会被这个scanf读进来的,而是留在输入流里。
可以看看我之前关于scanf的一些回答

风过无痕1989 发表于 2020-7-25 12:02:44

sunrise085 发表于 2020-7-25 11:00
可能是你对scanf理解不太好
scanf是按照你规定的格式从缓冲区读取字符。
它会严格按照你在引号内的格式进 ...

果然,去掉那个 \n 后,开关就听话了。你回复中的链接,我也 一 一 读过了,受益匪浅,谢谢!

现在这个程序的问题就是伪随机的问题,我再参考其他的资料,好好研究研究,然后再修改完善

风过无痕1989 发表于 2020-7-25 12:04:32

baige 发表于 2020-7-25 10:35
scanf("%d\n",&q); \n去掉scanf("%d",&q); 或者再加一个\变成scanf("%d\\n",&q);

谢谢! 我再多学习、多研究、多提高

baige 发表于 2020-7-25 16:14:28

sunrise085 发表于 2020-7-25 11:00
可能是你对scanf理解不太好
scanf是按照你规定的格式从缓冲区读取字符。
它会严格按照你在引号内的格式进 ...

在scanf里\n很特别的,不是要求输入一个回车换行
引用一下别人的说法:过滤空格、制表符、回车等输入,也就是说scanf("%d\n",&q);
你输入一个数后,要再接收到一个非(空格、制表符、回车)的输入scanf语句才结束。

baige 发表于 2020-7-25 16:16:38

sunrise085 发表于 2020-7-25 11:00
可能是你对scanf理解不太好
scanf是按照你规定的格式从缓冲区读取字符。
它会严格按照你在引号内的格式进 ...

否则你输入编号之后需要两次回车,一次回车是你写在引号内的'\n',一次回车是输入结束
无论你按多少次回车,程序都会停在那里等待输入一个非(空格、制表符、回车)的输入,scanf语句才结束,你可以去试试

sunrise085 发表于 2020-7-25 16:19:14

本帖最后由 sunrise085 于 2020-7-25 16:22 编辑

baige 发表于 2020-7-25 16:16
否则你输入编号之后需要两次回车,一次回车是你写在引号内的'\n',一次回车是输入结束
无论你按多少次回 ...

哦哦,多谢指出。学习了!
页: [1]
查看完整版本: 我的开关有点失灵