##笔记day07-C语言基础:随机数、一维、二维数组、字符数组

day07笔记

1)rand 生成随机数

1rand()随机函数
头文件:
    #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;
} 
  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值