从零开始学编程---第一步-C语言(十七)
下面来点轻松的吧,我们做一个猜数字(摇骰子)的程序
随机生成1-6的数字,我们来猜是几
猜小了就提示数字小了,请再猜
猜大了就提示数字大了,请再猜
猜对了就提示恭喜,并提示是否继续再玩
怎么进行随机?
这我们就需要rand()这个函数了 它可以随机0到32767数字
这个函数要添加stdlib.h这个头文件
它的用法
#include <stdio.h>
#include <stdlib.h>
main()
{
int a;
a=rand();
printf("%d\n",a);
}
变量a被随机赋值了一个数字
但是你会发现它每次一开始老随机同一个值,怎么让它每次一开始随机不同的值
可以用srand()来设置随机数产生器的种子,每次运行程序时,srand()的括号里的数字必须不相同
有一个技巧可以在每次运行时都srand()一个不同的数字,就是在srand()的括号里写上准确的时间。
如下
time_t t;
srand(time(&t));
a=rand();
这里你暂不需要知道它为什么要这样,你只要知道这样可以每次一开始随机不同的数
像这样用时间作为随机数产生器的种子之前,又必须用time.h头文件
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
main()
{
int a;
time_t t;
srand(time(&t));
a=rand();
printf("%d\n",a);
}
这样能每次一开始随机不同的数
在看下面的程序
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
main()
{
int a;
char ans;
time_t t;
do{
srand(time(&t));
a=rand();
printf("%d\n",a);
puts("继续随机一个数吗?(Y/y)否则按任意键结束");
ans=getch();
}while(ans=='y'||ans=='Y');
}
ans是我们定义个一个变量,用来存放y Y
程序先随机一个数字,如果按Y或y继续随机一个,否则不继续
这里要用循环,并且是先执行一次,看你的选择在进行循环,就是先执行后循环
要用do-while语句
getch();的作用大家还记得吧 不经过缓冲区就把值传给变量
就是当我们按Y或y 不需要按回车 就直接传给ans,然后进行循环判断
需要头文件conio.h
注意:这里的随机数是按时间来的,所以是有顺序的,从小到大
while(ans=='y'||ans=='Y');
这里有点麻烦,又要大写小写的
我们可以用大小写转换函数
toupper()把小写转换成大写
tolower() 把大写转换成小写
怎么转换
char a='a';
a=toupper(a);
printf("%c",a);
这样就会输出A
tolower()的用法一样
但我们只要用一个就可以了
while(toupper(ans)=='Y')
这样输入小写的y也会自动转换大写的Y
现在开始做这个程序吧
首先,怎么去随机1-6的数字
一个数除以5产生的余数就只有0-5的余数
所以
a=(rand()%5)+1 加个一就可以让有机会产生6 反正随机一个数都加1,不会超过6
程序如下
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
main()
{
int a;
char ans;
time_t t;
do{
srand(time(&t));
a=(rand()%5)+1;
printf("%d\n",a);
puts("继续随机一个数吗?(输入y继续)否则按任意键结束");
ans=getch();
}while(toupper(ans)=='Y');
}
整个程序如下,虽然不完美,但足够你们理解了
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
main()
{
int a,n;
char ans;
time_t t;
puts("猜数字游戏,请猜1-6中的数字");
do{
srand(time(&t));
a=(rand()%5)+1;
puts("随机数已产生,请猜");
do{
scanf("%d",&n);
if(n>a)
{
puts("数字大了,再猜猜");
}
else if(n<a)
{
puts("数字小了,再猜猜");
}
else if(a==n)
{
puts("恭喜你!猜对了");
break;
}
}while(n!=a);
puts("继续游戏吗?(Y/N)");
ans=getch();
if(toupper(ans)!='Y')
{
puts("游戏结束");
break;
}
}while(toupper(ans)=='Y');
}
定义一个n变量用来接收我们输入的数
注意这里有两个do-while,一个在外,一个在内,就是嵌套
在外的先执行一次,产生一个随机数
然后进入里面的do-while循环
里面的do-while循环是比较n和a的大小,只有两个不相等,就会一直让你输入n来进行比较,直到a和n相等就退出循环,然后回到外面的do-while循环余下部分
输入Y 到了while语句 如果条件成立 就重新循环再产生随机数,反之不循环
如果两个do-while在一起一个可能循环一个可能不循环
两个可能都不循环
两个可能都循环
两个do-while嵌套 其实和for,while嵌套是差不多的
以外层为入口,里层先执行
但要记住一点,do-while是先把循环主体执行一次,再来判断条件是否进行循环
下面我们重新回顾一下数组
数组我想你们应该不再陌生了,因为之前讲过字符(字符串)数组
如你所知,字符组成的数组不过是一个有名字的字符列表,类似地,整数组成的数组不过是一个有名字的整数列表,而浮点数组成的数组不过是一个有名字的浮点数列表。不需要用不同的名字来访问数组中的每一个元素,只需要用数组名加上带下标的方括号即可。
int a[5]; 这就是定义的一个整数数组
char b[5]; 这就是定义的一个字符数组
值得一提的是
char b[5]={'a','b','c','d','e'} 这是纯粹的字符数组
它不可以写成这样char b[5]="abcde"
而char b[5]={'a','b','c','d','\0'} 这就是字符串数组,因为它后面有个NULL零,NULL零也占一个长度
它就可以写成这样char b[5]="abcd" null零就不用写了,C语言会默认存在的
关于数值数组,定义有几种方法
一种是不赋值 int a[5]
还有一种是赋值 int a[5]={1,2,3,4,5}
还可以不标明长度(空间) int a[]={1,2,3,4,5}
但是以后想再从这个数组存入东西,它的长度就是5了
数值数组不像字符串数组那样,后面没有null零,你不需要多预留一个空间
数组是有下标的 a[5]={1,2,3,4,5}
就相当于a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5
下标都是从0开始,绝不可能等于数组名,数组名不是变量
a[0],a[1],a[2],a[3],a[4] 这些都是变量,和我们经常定义的,a,b,c没有区别,只不过它们的名字已经按次序规定好了
大家知道怎么在字符串数组里存入值
scanf("%s",c)或gets(c) 都可以
但是数值数组我们该怎么往里面手动存入值?
这样?
#include <stdio.h>
main()
{
int a[5];
scanf("%d",&a[0]);
scanf("%d",&a[1]);
scanf("%d",&a[2]);
scanf("%d",&a[3]);
scanf("%d",&a[4]);
printf("%d ",a[0]);
printf("%d ",a[1]);
printf("%d ",a[2]);
printf("%d ",a[3]);
printf("%d ",a[4]);
}
太麻烦了
我们可以用循环来完成
#include <stdio.h>
main()
{
int a[5];
for(int i=0;i<=4;i++)
scanf("%d",&a[i]);
for(i=0;i<=4;i++)
printf("%d ",a[i]);
}
for(int i=0;i<=4;i++)
a[5] 下标是0开始,4结束
所以 a[n] 下标都是0开始,n-1结束
用循环存入字符也是一样
#include <stdio.h>
main()
{
char a[5];
for(int i=0;i<=4;i++)
{ scanf("%c",&a[i]);
getchar();
}
for(i=0;i<=4;i++)
printf("%c ",a[i]);
}
这里getchar()是用来吸收空格和回车的
下面看这个程序
#include <stdio.h>
#include <string.h>
main()
{
char a[]="hello world";
for(int i=0;i<strlen(a);i++)
putchar(a[i]);
putchar('\n');
}
这个程序是用循环打印数组里的字符串
这里有个新函数strlen() ,是用来确保for循环的输出不会超过字符串的末尾
需要用头文件#include <string.h>
这里你也可以直接定义长度
char a[12]="hello world"; 空格和‘\0’各占一个空间
这样我们可以清晰的看到那个‘\0’在哪里
#include <stdio.h>
#include <string.h>
main()
{
char a[12]="hello world";
for(int i=0;i<=11;i++)
putchar(a[i]);
putchar('\n');
printf("a[0]为%c\n",a[0]);
printf("a[1]为%c\n",a[1]);
printf("a[2]为%c\n",a[2]);
printf("a[3]为%c\n",a[3]);
printf("a[4]为%c\n",a[4]);
printf("a[5]为%d\n",a[5]);
printf("a[6]为%c\n",a[6]);
printf("a[7]为%c\n",a[7]);
printf("a[8]为%c\n",a[8]);
printf("a[9]为%c\n",a[9]);
printf("a[10]为%c\n",a[10]);
printf("a[11]为%d\n",a[11]);
}
你会看到a[5]打印32 a[11]打印0
asc的编码32就是空格,编码0就是'\0' (NULL零)
而这个
#include <stdio.h>
#include <string.h>
main()
{
char a[11]={'h','e','l','l','o',' ','w','o','r','l','d'};
puts(a);
printf("a[0]为%c\n",a[0]);
printf("a[1]为%c\n",a[1]);
printf("a[2]为%c\n",a[2]);
printf("a[3]为%c\n",a[3]);
printf("a[4]为%c\n",a[4]);
printf("a[5]为%d\n",a[5]);
printf("a[6]为%c\n",a[6]);
printf("a[7]为%c\n",a[7]);
printf("a[8]为%c\n",a[8]);
printf("a[9]为%c\n",a[9]);
printf("a[10]为%c\n",a[10]);
}
a数组是字符数组,puts打印会有乱码
输入一组字符 ,然后反过来打印
程序如下
#include <stdio.h>
#include <string.h>
main()
{
int a[10];
puts("请输入9个以下字符");
for(int i=0;i<=9;i++)
{
a[i]=getchar();
if(a[i]=='\n')
{
i--;
break;
}
}
putchar('\n');
puts("反过来打印的结果");
for(;i>=0;i--)
putchar(a[i]);
putchar('\n');
}
请注意,这里的字符数组定义是int类型
getchar()函数的输入字符一般定义为int型,在c语言数据类型中,只有整型和字符型不需要强制转换就能相互使用,在一些高级应用中,getchar()可能会返回一个char数据类型无法使用的值,因此用int就安全
之前说过int和char类型可以转换的
比如
int a
可以
a=getchar();
putchar(a);
甚至可以putchar(65) 输出的是‘A’
当然这个程序你用char也可以
还有注意第2个for循环没有初始化i的值,实际上它是接着第一个for留下的i值开始的
比如我们输入abc 回车
遇到回车循环就结束
此时 a[0]='a',[1]='b',[2]='c',[3]='\n'.
i此时是3 再i-- 变成2 (为了不打印最后那个回车)
然后倒这循环打印
a[2],a[1],a[0]
打印出来就是cba了
下面我们来做个程序
输入一组字符,再输入另一组字符,然后把两组字符连接起来,用循环做这题
首先要定义3组字符数组
a[10],b[10],c[20] c数组要大点,因为要存放两组字符
然后开始输入第一组字符
puts("请输入第一组字符,不超过9个");
for(int i=0;i<=9;i++)
{
a[i]=getchar();
if(a[i]=='\n')
{
i--;
break;
}
}
只要遇到回车就退出循环,退出循环前i--次
例如输入abc 回车
数组下标到3就停止了 然后i-- 数组下标到了2 因为我们不要那个回车
接着输入第二组字符,假如输入xyz
puts("请输入第二组字符,不超过9个");
for(int j=0;j<=9;j++)
{
b[j]=getchar();
if(b[j]=='\n')
{
j--;
break;
}
}
两组字符输入完了,开始连接了
我们首先把第一组字符存放到第3个数组里
for(int x=0;x<=i;x++)
{
c[x]=a[x];
}
x是数组下标 不超过a数组的下标 比如2
c[0]=a[0]
c[1]=a[1]
c[2]=a[2]
这样a数组的字符就一一存放到c数组里
abc就到了c数组里面
然后要把第二组字符存放到c数组里
c数组下标要从接着开始,不能从0开始
for(int y=0;y<=j;x++,y++)
{
c[x]=b[y];
}
c[3]=b[1]
c[4]=b[2]
c[5]=b[3]
这样xyz就接着c数组的数组下标存放到里面了
怎么打印?因为你还不知道c数组打印到下标多少就停止
abcxyz一共6个字符 即0-5下标
i和j的下标都是2 我们只需加1就可以了(不管多少都加1)
for(int z=0;z<=i+j+1;z++)
{
putchar(c[z]);
}
程序我想你们也知道怎么写了
#include <stdio.h>
main()
{
int a[10],b[10],c[20];
puts("请输入第一组字符,不超过9个");
for(int i=0;i<=9;i++)
{
a[i]=getchar();
if(a[i]=='\n')
{
i--;
break;
}
}
puts("请输入第二组字符,不超过9个");
for(int j=0;j<=9;j++)
{
b[j]=getchar();
if(b[j]=='\n')
{
j--;
break;
}
}
for(int x=0;x<=i;x++)
{
c[x]=a[x];
}
for(int y=0;y<=j;x++,y++)
{
c[x]=b[y];
}
puts("两组字符连接后的结果:");
for(int z=0;z<=i+j+1;z++)
{
putchar(c[z]);
}
putchar('\n');
}
如果你想在两组字符中间加个。或者空格,你应该也知道怎么做吧
中间加个空格
#include <stdio.h>
main()
{
int a[10],b[10],c[20];
puts("请输入第一组字符,不超过9个");
for(int i=0;i<=9;i++)
{
a[i]=getchar();
if(a[i]=='\n')
{
i--;
break;
}
}
puts("请输入第二组字符,不超过9个");
for(int j=0;j<=9;j++)
{
b[j]=getchar();
if(b[j]=='\n')
{
j--;
break;
}
}
for(int x=0;x<=i;x++)
{
c[x]=a[x];
}
c[x]=' ';
x++;
for(int y=0;y<=j;x++,y++)
{
c[x]=b[y];
}
puts("两组字符连接后的结果:");
for(int z=0;z<=i+j+2;z++)
{
putchar(c[z]);
}
putchar('\n');
}
另外其实strcat()函数就可以完成这个程序,而且很方便
最新内容
热点内容
- QQ群
- 返回首页
- 返回顶部