day07笔记
1)rand 生成随机数
1)rand()随机函数
头文件:
#include <stdlib.h>
函数原型:
int rand(void);
函数功能:
生成大于等于0的随机整数
参数:
void
返回值:
生成的随机整数
2)srand 更新随机数种子(srand()函数用于给rand()函数设定种子)
头文件:
#include <stdlib.h>
#include <time.h>
//使用 <time.h> 头文件中的 time() 函数即可得到当前的时间(精确到秒)
函数原型:
void srand(unsigned int seed);
//它需要一个 unsigned int 类型的参数。在实际开发中,我们可以用时间作为参数,只要每次播种的时间不同,那么生成的种子就不同,最终的随机数也就不同。
函数功能:
播种随机数种子
参数:
seed
返回值:
void
eg:
int main()
{
strand(time(NUll));//生成随机数种子,并随系统时间进行更新time(NULL)
int a = rand()%100;//rand生成随机数,并设置随机数的范围0~99
printf("%d\n",a);
return 0;
}
七、数组
存储大量同类型的数据
1.一维数组
1)数组的定义
<存储类型><数据类型>数组名[数组元素个数]
存储类型:auto register static extern
数据类型:char short int long float double 自定义类型
数组名:标识符,满足命名规则
//数组名代表首地址,为十六进制的一个常量,不能被赋值
[]:在定义数组时,[]中是数组大小
元素个数:该数组中最大存储的元素个数
int arr [10];//定义了能够存储10个整形数据的整型数组
sizeof(arr);//sizeof求数组的空间大小 40字节
2)数组的初始化
1.完全初始化
int arr[5] = {1,2,3,4,5};
2.非完全初始化
//非完全初始化,未初始化的元素值为0
//如果都未初始化,则数组中的值为任意值
//定义数组时,数组元素个数可以为变量,但是不能为元素个数为变量的数组初始化
//b)int n=10,a[n];(√)
//int a[n] = {0,1,2,3} (X)
int arr[5] = {1,2,3};//按照顺序从第一个元素开始赋值
int arr[5] = {[1] = 2,[3] = 4};//对第2个和第4个元素赋值
int arr[5] = {0};
int arr[] = {1,2,3};
3)数组元素的访问
数组名[下标]:
下标:0 ~ 最大元素个数-1
int arr[10];
//访问数组中的最后一个元素,arr[9]
eg:打印数组的元素(循环)
int arr[5]={1,2,3,4,5};
int len = sizeof(arr)/sizeof(arr[0]);//求数组元素个数
int i = 0;
while(i<len){
printf("%d\n",arr[i]);
i++;}
4)可变数组
eg1:键盘上输入数组存储的元素个数
int main(int argc, char *argv[])
{
int n = 0;
scanf("%d",&n);
int arr[n];
for(int i = 0; i < n; i++){
arr[i] = i + 1;
}
for(int i = 0; i< n; i++){
printf("%d ",arr[i]);
}
return 0;
}
eg2:从键盘上输入和打印数组元素
int main(int argc, char *argv[])
{
int n;
int arr[n];
scanf("%d",&n);
for(int i = 0; i < n; i++){
scanf("%d",&arr[i]);
}
for(int i = 0; i< n; i++){
printf("%d ",arr[i]);
}
return 0;
}
eg3:求数组元素最大值以及下标
int main(int argc, char *argv[])
{
int n;
int arr[n];
int max = 0;
int index;
scanf("%d",&n);
for(int i = 0; i < n; i++){
scanf("%d",&arr[i]);
}
for(int i = 0; i < n; i++){
if(max < arr[i]){
max = arr[i];
index = i;
}
}
printf("最大值为:%d,下标为:%d\n",max,index);
return 0;
}
5)宏定义
#define SIZE 32
int arr[SIZE] = {0};
2.二维数组
具有两个或者两个以上的下标叫做多维数组
1)一般形式
<存储类型><数据类型> 数组名[常量表达式1][常量表达式2]
存储类型:
auto register static extern
数据类型·:
short int long float double
数组名:
标识符,满足命名规则
[常量表达式1]:行数
[常量表达式2]:列数
int a[2][3];//定义一个2行3列的二维数组
元数个数:
行数*列数
2)二维数组元素访问
数组名[行下标][列下标]
行下标:0~行数-1;
列下标:0~列数-1;
注意:二维数组在内存中也是连续存储的
3)二维数组的初始化
行优先
int arr[2][3] = {1,2,3,4,5,6};
//全部元素进行初始化赋值
int arr[2][3] = {1,2,3,4}
//部分初始化赋值,未赋值默认为0
int arr[2][3] = {{1,2},{3,4}}
//对一二行前两个元素赋值
int arr[][2] = {1,2,3,4,5,6}
//可以不定义行元素个数,不能不定义列元素个数
eg1:冒泡排序
将输入的数据从小到大依次排列:
1)排序过程
a.比较第一个元素与第二个元素的值,若a[0] > a[1] (a[0] < a[1]),则交换第一个元素与第二个元素的值,若不满足条件,则不交换;继续比较第二个元素与第三个元素的值,若满足条件,则交换,以此类推;直至比较到n-1个元素与第n个元素,第一乱冒泡排序完成,此时,元素中的最大值被放在末尾(最开始)。
b.继续对n-1个数进行第二轮冒泡排序,将最大元素放在末尾。
c.执行n-1轮冒泡排序后,完成排序。
#include <stdio.h>
int main(int argc, char *argv[])
{
int n;
int a[100];
printf("请输入你要排序的数组:");
scanf("%d",&n);
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
}
for(int i = 0; i < n-1; i++)
{//第一个for循环表示冒泡排序的执行轮数为n-1次
for(int j = 0; j < n-1-i; j++)
{//每一轮冒泡排序需要比较的次数,第一轮为n-1次,且依次递减
if(a[j] > a[j+1])
{//满足条件,交换两个元素的值
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
printf("排序好的数组为:\n");
for(int i = 0; i < n; i++){
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
eg2:二维数组找最大值
给一个3x4的二维数组赋予随机值,并且打印出该二维数组,并找到二维数组中最大的元素值 及其 行下标和列下标。
随机值的范围0~50
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
int a[3][4] = {0};
srand(time(NULL));
//二维数组循环赋值
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 4; j++)
{
a[i][j] = rand()%51;
}
}
//循环遍历打印二维数组中的元素
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 4; j++)
{
printf("%-3d", a[i][j]);
}
puts(" ");
}
//循环比较,找最大值以及坐标
int max = a[0][0], x = 0, y = 0;
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 4; j++)
{
if(max < a[i][j])
{
max = a[i][j];
x = i;
y = j;
}
}
}
printf("[%d,%d] = %d\n", x,y,max);
return 0;
}
day08
3.字符数组
char str[6] = {'h','e','l','l','o'};
char str[6] = {"hello"};
char str[6] = "hello";
eg:
int main(int argc, char *argv[])
{
char str[5] = "hello";
char str1[5] = "world";
char str2[6] = "hello";
printf("str = %s\n",str);
return 0;
}
结果:helloworldhello
str数组没有预留'\0'的空间
eg2:删除字符串中的空格
int main(int argc, char *argv[])
{
char str[32] = {0};
gets(str);
//从键盘上输入要删除的字符
int i = 0,j = 0;
//i作为字符串数组的遍历,j作为赋值
while(str[i] != '\0'){
if(str[i] != ' '){
//空格也可以替换成其他字符,这样我们可以删除任意字符
str[j] = str[i];
j++;
}
i++;
}
str[j] = '\0';
//在已经删除好空格的字符串末尾添加\0
puts(str);
return 0;
}
eg3:输入一段字符串,删除字符串中被指定的字符串
例:str1:abcdefabcdef
str2:def
str1:abcabc
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char str1[32];
char str2[32];
int i = 0;
int j = 0;
gets(str1);
gets(str2);
while(i < strlen(str1))
{
int flag = 1;
for(int n = 0; n < strlen(str2) ;n++ ){
if(str1[i+n] != str2[n])
{
flag = 1;
break;
}else
flag = 0;
}
if(flag == 0)
{
i = i + strlen(str2);
}
str1[j] = str1[i];
i++;
j++;
}
str1[j] = '\0';
puts(str1);
return 0;
}
4.字符串操作函数
1)strlen
功能:
计算字符串的长度,不包括'\0';
头文件:
#include<string.h>
函数原型:
size_t strlen(const char *s);
参数:
指向字符串的地址
返回值:
字符串s的长度
eg:int main(int argc, char *argv[])
{
char str[32] = "hjdfs";
int len = strlen(str);
/**********************************
实现strlen功能
int len = 0;
for(int i = 0; str[i] != '\0'; i++)
{
len++;
}
***********************************/
printf("%d\n",len);
return 0;
}
2)strcpy
功能:
将s2字符串(包括'\0')复制到s1中
头文件:
#include<string.h>
函数原型:
char *strcpy(char *dest, const char *src);
参数:
s1:目的地
s2:待复制的字符串
返回值:
返回指向s1的地址
eg:#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
char str[32] = "hello";
char str1[32] = "world!";
strcpy(str,str1);
/* int i = 0;
while(str1[i] != '\0'){
str[i] = str1[i];
i++;
}
*/ //实现strcpy功能
str[i] ='\0';
//为被赋值完后的字符串末尾添上'\0'
//防止打印出未被覆盖的字符串
puts(str);
return 0;
}
3)strcat
功能:
将s2字符串连接在字符串s1后面,并覆盖s1末尾的'\0';
头文件:
#include<string.h>
函数原型:
char *strcpy(char *s1, const char *s2);
参数:
s1:目的地
s2:待连接的字符串
返回值:
返回指向s1的地址
eg:
int main(int argc, char *argv[])
{
char str[32] = "hello,";
char str1[32] = "world!";
int i = 0;
// strcat(str,str1);
int len = strlen(str);
int len1 = len;
while(str1[i]!= 0){
str[len] = str1[i];
//用str1[i]对str从第len个元素开始赋值
len++;
i++;}
str[len1+i] = '\0';//为str字符串的末尾附上\0;
puts(str);
return 0;
}
3)strcmp
功能:
比较两个字符串s1与s2的大小
a.从左往右逐个比较
b.如果两个字符串的第一个字符串相等,会依次向右继续比较,直到两个字符串中的字符不相同
c.当两个字符串遇到'\0'时,结束比较
d.当s1与s2同时到达'\0',且逐个比较的字符都相同,说明两个字符串相等;
头文件:
#include<string.h>
函数原型:
char *strcpy(char *s1, const char *s2);
参数:
s1:目的地
s2:待连接的字符串
返回值:
s1[i] - s2[i] 相减后的ascii码
比较结束的条件:遇到不同的字符或任意字符串遇到'\0'
eg:
int main(int argc, char *argv[])
{
char str[32] = "ae";
char str1[32] = "bel";
//int number = strcmp(str,str1);
int i = 0;
while(str[i]!= 0 || str1[i]!= 0){
if(str[i]!= str1[i]){
number = str[i]-str1[i];
break;
}
i++;
}
printf("number = %d\n",number);
return 0;
}
//结果为:number = -1('a' - 'b')
eg4:输入一串字符,统计单词个数
int main(int argc, char *argv[])
{
char str[32];
gets(str);
int i = 0;
int cnt = 0;
int len = strlen(str);
printf("%d\n",len);
for(i = 1; i <= len; i++)
{
if(str[i-1]!= ' ' && str[i]==' '){
cnt++;
}
}
printf("字符中单词的个数为:%d\n",cnt+1);
return 0;
}