本帖最后由 Mortal 于 2014-11-8 16:56 编辑 #include<time.h>
#include <windows.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
main()
{
//定义所需变量
int i, j[5], k[2], t, a, r;
char c;
/*标号*/loop: /*询问需要循环几次*/printf("你要几组号码? 请输入: ");
//输入次数
scanf("%d", &r);
//以时间设置随机数种子
srand( (unsigned)time( NULL ) );
//循环r次
for(a=1; a<=r; a++)
{
//五个普通号,循环五次
for(i=0;i<5;i++)
{
//产生1~35之间的随机数
j[i]=1+(int)(35.0*rand()/(RAND_MAX+1.0));
//从大到小输出:如果大于,就互换,最终变成从大到小
if(j[0]<j[1]){t=j[0];j[0]=j[1];j[1]=t;}
if(j[0]<j[2]){t=j[0];j[0]=j[2];j[2]=t;}
if(j[0]<j[3]){t=j[0];j[0]=j[3];j[3]=t;}
if(j[0]<j[4]){t=j[0];j[0]=j[4];j[4]=t;}
if(j[1]<j[2]){t=j[1];j[1]=j[2];j[2]=t;}
if(j[1]<j[3]){t=j[1];j[1]=j[3];j[3]=t;}
if(j[1]<j[4]){t=j[1];j[1]=j[4];j[4]=t;}
if(j[2]<j[3]){t=j[2];j[2]=j[3];j[3]=t;}
if(j[2]<j[4]){t=j[2];j[2]=j[4];j[4]=t;}
if(j[3]<j[4]){t=j[3];j[3]=j[4];j[4]=t;}
//打印
printf(" %d",j[i]);
//为了美观,如果是一位数(小于十),就打印一个空格
if(j[i]<10)
{
//打印空格
putchar(' ');
}
}
//准备打印特别号,说明一下
printf(" 特别号:");
//两个特别号,循环两次
for(i=0;i<2;i++)
{
//产生1~12之间的随机数
k[i]=1+(int)(12.0*rand()/(RAND_MAX+1.0));
//从大到小输出:如果大于,就互换,最终变成从大到小
if(k[1]<k[0]){t=k[0];k[0]=k[1];k[1]=t;}
if(k[0]<k[1]){t=k[1];k[1]=k[0];k[0]=t;}
//打印
printf(" %d",k[i]);
//为了美观,如果是一位数(小于十),就打印一个空格
if(k[i]<10)
{
//打印空格
putchar(' ');
}
}
//回车
putchar('\n');
}
//回车
putchar('\n');
//询问需不需要继续选号
printf("你还要继续选号吗,需要请按“Y”,不需要请按“N”:");
fflush(stdin); //因为第一次scanf 输入的是数字然后回车 缓冲区中存放的是数字与回车 数字给第一次的%d带走了 但是回车还在缓冲区
//输入‘y’或‘n’
scanf("%c", &c);
//如果是‘y’或‘Y’就跳转到loop标识符,反之结束程序
if(c=='y' || c=='Y')
{
//跳转到loop标识符
goto loop;
}
printf("程序结束, 请按任意键继续."); // 个人兴趣→v→
//暂停屏幕
getch();
//返回值,结束程序
return 0;
}
第一次scanf("%d", &r);
我输入5[回车]
这时缓冲区内是'5', '0x10'
然后scanf将5给了r
但是缓冲区内'0x10'的数据还在
所以保留到了第一次
scanf("%c", &c);
输入y
这时缓冲区内是'0x10', 'y'
因为'0x10' 是一个字符 所以自然被收走了
然后就因为c的值='0x10' 自然就跳过了
还有外层可以用do
{
....
fflush(stdin); //清空缓冲区
scanf("%c", &c);
}while(c == 'y' || c == 'Y');
其实你一开始调试一次就知道了 断点在第二次的scanf之后一句话 会发现c的值是回车
|