一, 随机数生成
1.rand 函数
是可以随机生成随机数的,会返回一个伪随机数,其范围在0到RAND-MAX之间,使用时需要加上头文件 #include<stdlib.h>
原型:int rand(void); void:无,空,表示这个函数不需要参数
伪随机数是通过某种算法生成的,并不是真正的随机数。rand函数是对一个叫“种子”的基准值进行运算生成的随机数。之所以产生一样的结果,是因为rand函数生成的随机数的默认种子是1,如果要生成不同的随机数,就要让种子是变化的。
2. srand 函数
用来初始化随机数的生成器的。在调用 rand 函数之前先调用 srand 函数,通过 srand 函数的参数 seed 来设置 rand 函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。
原型:
void srand (unsigned int seed);需要一个 unsigned int 的值 ,没有返回。
3. time 函数
需加上 #include <time.h>,本质上int 类型或long long 类型,但都是整形。
timet_* 是个指针
这样就生成随机数了。srand 函数一次运行的程序只需要调用一次就可以了,不需要频繁调用。NULL是空指针的意思。
如果想设置随机数的范围
eg,rand() % 100 ;生成0到99之间的随机数,余数范围是0到99.
rand() %100+1; 生成1到100之间的随机数,
100+ rand() %(200-100+1);余数范围为0到100,再加100就是100到200
所以要生成a 到b 的随机数 a + rand()%(b-a+1)
二,猜数字游戏
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void menu ()
{
printf("1.PLAY\n");
printf("2.EXIT\n");
}
void game()
{
int guess = 0; //生成随机数字,开始猜数字
int r = rand() % 100 + 1;
while(1)
{
printf("请猜数字");
scanf("%d", &guess);
if (guess > r)
{
printf("猜大了\n");
}
else if ( guess < r)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;//菜单
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 2:
printf("退出\n");
break;
default:
printf("请选择1或2");
break;
}
} while (input);
return 0;
}
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
void menu()
{
printf("1.PLAY\n");
printf("2.EXIT\n");
}
void game()
{
int guess = 0; //生成随机数字,开始猜数字,设置猜数字的次数
int r = rand() % 100 + 1;
int count = 5;
while (count)
{
printf("你还有%d次机会\n",count);
printf("请猜数字\n");
scanf("%d", &guess);
if (guess > r)
{
printf("猜大了\n");
}
else if (guess < r)
{
printf("猜小了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
count--;
}
if (count == 0)
{
printf("YOU LOST\n");
printf("正确答案是%d\n", r);
}
}
int main()
{
int input = 0;//菜单
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 2:
printf("退出\n");
break;
default:
printf("请选择1或2\n");
break;
}
} while (input);
return 0;
}
三,数组
数组是一组相同类型元素的集合,个数不能是0,。
1.创建的语法
type arr_name[ 常量值 ];
【】内的数字既可以表示元素个数,又可指标号。
2.数组的初始化
数组的初始化一般使用{ },将数据放在大括号
如果数组初始化了省略掉数组大小,数组的大小是编译器根据初始化的内容确实的
3.数组是一种自定义类型。
4.数组的下标
数组 1 2 3 4 5
下标 0 1 2 3 4
指定数组元素的下标可以用变量,而创建数组时不能用下标。
5.数组的输入 scnaf(“%d”,&num1[ i] );
6.数组的存贮
数组再内存中是连续存放的,随着下标的增长,地址是由低到高变化的。
7. sizeof 计算数组元素个数
sizeof (数组名)计算的是数组所占内存空间的大小,单位是字节。 每个元素的大小是4个字节。元素个数应该先以[ ]给的数为准,计算公式为[ ] * 4
使用时如果后面是类型则括号不能省,如果是后面是变量或数组是可以省的。
sizeof 的计算结果是size_t 类型的,size_t 是无符号的整形。
四,二维数的创建
1. 二维数组的每个元素是一维数组,将一维数组作为一个数组的元素就是二维数组。
type arr _name[ 常量1(行) ][ 常量2(列) ]
2. 初始化: 不完全初始化 先放满一组,再接着放
完全初始化,可以选择放入
行可以省略,列不能省略
标号 列 0 1 2 3
行 arr[0] arr[1] arr[ 2]
1 | 2 | 3 | 4 |
2 | 3 | 4 | 5 |
3 | 4 | 5 | 6 |
3. 在内存中的存贮
每一行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素也是相差4个字节,所以二维数组中的每个元素都是连续存放的。
五,C99中的变长数组
int n = a+b;
int arr [ n] ;变长数组的基本特征就是数组长度只有在运行时才能确定,所以变长数组不能初始化
变长数组的意思是数组的大小是可以使用变量来指定的,程序运行根据变量的大小来指定数组的元素个数,而不是说数组的大小是可变的,它是不可变的。