从零开始学编程---第一步-C语言(十七)

时间:2014-03-06 14:41    点击:

下面来点轻松的吧,我们做一个猜数字(摇骰子)的程序

随机生成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()函数就可以完成这个程序,而且很方便

来源:幻想编程//所属分类:站长原创/更新时间:2014-03-06 14:41
顶一下
(5)
71.4%
踩一下
(2)
28.6%
上一篇:从零开始学编程---第一步-C语言(十六)
下一篇:从零开始学编程---第一步-C语言(十八)
相关内容