鱼C论坛

 找回密码
 立即注册
查看: 740|回复: 9

[已解决]我的开关有点失灵

[复制链接]
发表于 2020-7-25 00:35:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

{
        int i,j,k,m,q = 0,n = 0;
        int a[4][4],b[4][4];                                 /* 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[i][j] = m;
                        }
                }
        }
        for(i = 0;i < 4;i++)                                /* 打印 a 数组 */
        {
                for(j = 0;j < 4;j++)
                {
                        printf("   %d",a[i][j]);
                }
                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[3-j][i] = a[i][j];
                        }
                }
                printf("\n");
                printf("  旋转转换后的 b 数组:\n");
                printf("\n");
               
                for(i = 0;i < 4;i++)                      /* 打印旋转后的 b 数组 */
                {
                        for(j = 0;j < 4;j++)
                        {
                                printf("   %d",b[i][j]);
                        }
                        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[3 - i][j] = a[i][j];               
                        }
                }
               
                for(i = 0;i < 4;i++)                   /* 打印垂直翻转后的 b 数组 */
                {
                        for(j = 0;j < 4;j++)
                        {
                                printf("   %d",b[i][j]);
                        }
                        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[i][3 - j] = a[i][j];
                                        }
                                       
                                }
                                for(i = 0;i < 4;i++)               /* 打印水平翻转后的 b 数组 */
                                {
                                        for(j = 0;j < 4;j++)
                                        {
                                                printf("   %d",b[i][j]);
                                        }
                                        printf("\n");
                                        printf("\n");
                                }
                                printf("\n");
                   }
                break;
        }
    goto loop;
}
最佳答案
2020-7-25 11:00:04
本帖最后由 sunrise085 于 2020-7-25 16:22 编辑

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

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

可以看看我之前关于scanf的一些回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-25 09:56:14 | 显示全部楼层
????
你的问题是什么???
什么叫开关失灵???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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加回车,没反映,再输入一次,才能切换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 10:35:52 | 显示全部楼层
本帖最后由 baige 于 2020-7-25 10:40 编辑

  scanf("%d\n",&q); \n去掉  scanf("%d",&q); 或者再加一个\变成scanf("%d\\n",&q);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 11:00:04 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-7-25 16:22 编辑

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

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

可以看看我之前关于scanf的一些回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

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

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

现在这个程序的问题就是伪随机的问题,我再参考其他的资料,好好研究研究,然后再修改完善
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-25 12:04:32 | 显示全部楼层
baige 发表于 2020-7-25 10:35
scanf("%d\n",&q); \n去掉  scanf("%d",&q); 或者再加一个\变成scanf("%d\\n",&q);

谢谢! 我再多学习、多研究、多提高
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

在scanf里\n很特别的,不是要求输入一个回车换行
引用一下别人的说法:过滤空格、制表符、回车等输入,也就是说scanf("%d\n",&q);
你输入一个数后,要再接收到一个非(空格、制表符、回车)的输入scanf语句才结束。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

否则你输入编号之后需要两次回车,一次回车是你写在引号内的'\n',一次回车是输入结束
无论你按多少次回车,程序都会停在那里等待输入一个非(空格、制表符、回车)的输入,scanf语句才结束,你可以去试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-25 16:19:14 | 显示全部楼层
本帖最后由 sunrise085 于 2020-7-25 16:22 编辑
baige 发表于 2020-7-25 16:16
否则你输入编号之后需要两次回车,一次回车是你写在引号内的'\n',一次回车是输入结束
无论你按多少次回 ...


哦哦,多谢指出。学习了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 10:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表