我的开关有点失灵
// 将 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;
} ????
你的问题是什么???
什么叫开关失灵??? 本帖最后由 风过无痕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:40 编辑
scanf("%d\n",&q); \n去掉scanf("%d",&q); 或者再加一个\变成scanf("%d\\n",&q); 本帖最后由 sunrise085 于 2020-7-25 16:22 编辑
可能是你对scanf理解不太好
scanf是按照你规定的格式从缓冲区读取字符。
它会严格按照你在引号内的格式进行读取的
一般情况下引号之间只写格式化要求,不写任何其他字符,因为一般情况下你写了什么其他字符,就需要你输入什么字符,一旦输入不对,就会出错,所以,你需要把'\n'删掉。
scanf 中的'\n'很特别。你输入一个数后,它是不会立即显示的,要等再接收到一个非(空格、制表符、回车)的输入scanf语句才结束。
但请注意的是,最后输入的那个非(空格、制表符、回车)的东西是不会被这个scanf读进来的,而是留在输入流里。
可以看看我之前关于scanf的一些回答 sunrise085 发表于 2020-7-25 11:00
可能是你对scanf理解不太好
scanf是按照你规定的格式从缓冲区读取字符。
它会严格按照你在引号内的格式进 ...
果然,去掉那个 \n 后,开关就听话了。你回复中的链接,我也 一 一 读过了,受益匪浅,谢谢!
现在这个程序的问题就是伪随机的问题,我再参考其他的资料,好好研究研究,然后再修改完善 baige 发表于 2020-7-25 10:35
scanf("%d\n",&q); \n去掉scanf("%d",&q); 或者再加一个\变成scanf("%d\\n",&q);
谢谢! 我再多学习、多研究、多提高 sunrise085 发表于 2020-7-25 11:00
可能是你对scanf理解不太好
scanf是按照你规定的格式从缓冲区读取字符。
它会严格按照你在引号内的格式进 ...
在scanf里\n很特别的,不是要求输入一个回车换行
引用一下别人的说法:过滤空格、制表符、回车等输入,也就是说scanf("%d\n",&q);
你输入一个数后,要再接收到一个非(空格、制表符、回车)的输入scanf语句才结束。 sunrise085 发表于 2020-7-25 11:00
可能是你对scanf理解不太好
scanf是按照你规定的格式从缓冲区读取字符。
它会严格按照你在引号内的格式进 ...
否则你输入编号之后需要两次回车,一次回车是你写在引号内的'\n',一次回车是输入结束
无论你按多少次回车,程序都会停在那里等待输入一个非(空格、制表符、回车)的输入,scanf语句才结束,你可以去试试 本帖最后由 sunrise085 于 2020-7-25 16:22 编辑
baige 发表于 2020-7-25 16:16
否则你输入编号之后需要两次回车,一次回车是你写在引号内的'\n',一次回车是输入结束
无论你按多少次回 ...
哦哦,多谢指出。学习了!
页:
[1]