C语言代码总结

C语言核心代码总结

🏙️基础

题目1 输出名字

字符串变量的定义关系char str[] = ""

#include <stdio.h>
int main()



    /*需求:键盘录入,名字,并按照以下格式打印出来
格式:我的名字为:J

字符串变量的定义方式:
    数据类型  变量名[大小]=字符串;
    char str[内存占用大小] = "aaa";
    内存大小的计算方式:
    英文:1个字母,符号,数字占用一个字节
    中文:在vs或者vc中,默认情况下,一个中文占用2个字节
    结束标记:1个字节
*/

{

    //1.定义变量
    char  str[6] = "aaa你";    printf("%s\n", str);
    printf("%zu\n", sizeof(str));
    printf("%zu\n", sizeof("aaa你"));


    return 0;

}

题目2 定义变量

#include <stdio.h>
int main()
{
    //1.定义变量
    int age;
    printf("请输入你的年龄:\n");
    scanf("%d", &age);
    printf("我的年龄为:%d岁",age);
    return 0;
}

题目3 求长宽高

#include <stdio.h>

int main()
{

    /*键盘录入3个小数,分别表示长方体的长,宽,高
                分别求:A面,B面,C面的面积以及长方体的体积,结果保留2位小数*/

    //1.定义变量表示长,宽,高
    double length;
    double width;
    double heigth;


    //键盘录入3个小数,分别给长,宽,高赋值
    printf("请输入3个小数,表示长、宽、高");
    scanf("%lf %lf %lf", &length, &width, &heigth);


    //3.求A面,B面,C面的面积
    double areaA = length * width;
    double areaB = heigth * width;
    double areaC = length * heigth;

    printf("A面的面积为:%.2lf", areaA);
    printf("B面的面积为:%.2lf", areaB);
    printf("C面的面积为:%.2lf", areaC);

    double bulk = length * width * heigth;
    printf("长方体的面积为:%.2lf\n", bulk);

    return 0;



    }

🏙️数值拆分

题目1

//需求1:
#include <stdio.h>
int main()
{
    int number;
    printf("请输入一个2位整数:\n");
    scanf("%d", &number);
    printf("%d\n", number);


    int ge = number % 10;
    int shi = number / 10 % 10;

    printf("%d\n", ge != 7 && shi != 7);

    return 0;
}
#include<stdio.h>
int main(){
	int num;
	printf("请输入一个2位数的整数:");
	scanf("%d",&num);
	
	if(num<0 || num>99){
		printf("这个数字不是两位整数");
	}
	
	int ge = num %10;
	int shi = num/10;
	
	if(ge != 7 && shi !=7){
		printf("0");
	}else{
		printf("1");
	}
	
	return 0;
}

题目2 数值拆分

#include <stdio.h>
int main()
{
    /*

        需求:键盘录入一个3位数,将其拆分为个位,十位,百位后,打印在控制台
        输出结果:
                  个位数是:3
                  十位数是:2
                  百位数是:1

           123

           123除以 10  商12  余3
           12 除以 10  商1   余2
        */

    //1.键盘录入一个三位数
    printf("请输入一个三位数:\n");
    int num;
    scanf("%d", &num);

    //2.拆分
    int ge = num % 10;
    int shi = num / 10 % 10;
    int bai = num / 100;
    printf("个位是:%d\n", ge);
    printf("十位是:%d\n", shi);
    printf("百位是:%d\n", bai);
    return 0;

}

#include <stdio.h>
int main(){
	int num;
	printf("输入一个三位数:");
	scanf("%d",&num);
	if(num<0 || num>999){
		printf("这不是三位数");
	}
	
	int ge = num%100%10;
	int shi =num%100/10;
	int bai = num/100;
	
		printf("%d\n",bai);
		printf("%d\n",shi);
		printf("%d\n",ge);


	return 0;
}

🏙️流程控制语句

题目1 if语句

#include <stdio.h>
int main()
{
    int money;
    printf("请输入你在游戏中的氪金总额度\n");
    scanf_s("%d", &money);

    if (money == 0)
    {
        printf("0冲玩家\n");

    }
    else if (money >= 1 && money <= 99)
    {
        printf("尊贵的VIP1\n");
    }
    else if (money >= 100 && money <= 499)
    {
        printf("VIP2\n");
    }
    else if (money >= 500 && money <= 999)
    {
        printf("VIP3\n");
    }
    else if (money >= 1000 && money <= 1999)
    {
        printf("VIP4\n");
    }

    else
    {
        printf("VIP5\n");
    }
    return 0;
}

第一种做法:

#include <stdio.h>
int main()
{
    int score = 110;

    if (score >= 0 && score <= 100)
    {

        //正常数据
        if (score >= 95 && score <= 100)
        {
            printf("自行车一辆");
        }
        else if(score >= 90  &&  score  <=  94)
        {
            printf("游乐场玩一天");
        }
        else if (score >= 80 && score <= 89)
        {
            printf("变形金刚一个");

        }

        else 
        {
            printf("胖揍一顿");
        }
    }
    else
    {

        //异常数据
        printf("该分数超出范围");
    }







}

题目2 switch

#include <stdio.h>
int main()
{
    int week = 7;

    switch (week)
    {
        case 1:
            printf("使用1抱枕");
            break;
        case 2:
            printf("使用抱枕2");
            break;
        case 3:
            printf("使用抱枕3");
            break;
        case 4:
            printf("使用抱枕4");
            break;
        case 5:
            printf("使用抱枕5");
            break;
        case 6:
            printf("使用抱枕6");
        case 7:
            printf("使用抱枕7");
            break;


    }
}

#include <stdio.h>
int main()
{
    int  number;
    printf("请输入数字:\n");
    scanf_s("%d", &number);

    printf("%d\n", number);

    switch (number)
    {

        case 1:
            printf("机票查询\n");
            break;
        case 2:
            printf("机票预定\n");
            break;
        case 3:
            printf("机票改签\n");
            break;
        case 4:
            printf("退出服务\n");

        default:

            printf("退出服务\n");
            break;
    }



    return 0;
}

题目3 2的幂次方

题目4 折纸问题

#include <stdio.h>
int main()
{
    /*
       需求:
              世界最峰是珠穆朗玛峰(8844430mm)
                  假如我有一张足够大的纸,它的厚度是0.1mm
                  请问我折叠多少次,可以折成珠穆朗玛峰的高度

          思路:
          利用循环折叠纸张,当纸张的厚度超过珠穆朗玛峰的高度,循环就结束了

          循环的结束条件:纸张厚度>珠穆朗玛峰高度        
        */

    //1.定义变量记录珠穆朗玛峰的高度和纸张的厚度
    int height = 8844430;
    double paper = 0.1;

    int count = 0;


    //2.利用循环叠纸张
    //小括号里面的内容:什么情况下,循环可以继续执行,跟上面的结束条件是反过来的
    while (paper <= height)
    {

        //折叠纸张
        paper = paper * 2;
        count++;

    }

    //3.打印
    printf("%d/n", count);


    return 0;
}

题目5 整数反转

a

#include<stdio.h>
int main(){
	int num = 123;
	int rev = 0;
	while(num !=0){
		int ge = num % 10;
		num =num / 10;
		rev = rev * 10 + ge;
	}
	printf("%d",rev);
	return 0;
}

题目6 平方根

#include <stdio.h>
int main()
{
    /*
          需求:
          给你一个非负数X,计算并返回x的算术平方根,
          结果只保留整数部分,小数部分将被舍去
        */

    int  number = 17;
    int i = 1;
    while (i * i <= number)
    {
        i++;
    }

    printf("%d\n", i-1);
    return 0;

}

🏙️循环语句

题目1 打印矩形(循环嵌套)

#include <stdio.h>
int main(){
	for(int i=0;i<=4;i++){
		for(int j=0;j<=3;j++){
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

题目2 打印直角三角形

#include<stdio.h>
int main()
{
    /*
        打印一个5行5列的三角形
        效果如下:
                 *****            *
                 ****             **
                 ***              ***
                 **               ****
                 *                *****
                 */
    //1.先把矩形给打印出来
    //2.在矩形的基础上,进行改写

    //解释代码
    //i=1:表示我现在打印第一行的*   内循环:1~5
    //i=2: 表示我现在打印第二行的*   内循环:2~5
    //i=3: 表示我现在打印第三行的*   内循环:3~5
    //...
    //for (int i=1;i<=5;i++)
    //{
    //        for (int j = i; j <= 5; j++)//决定了每一行打印多少个
    //        {
    //                printf("*");
    //        }
    //        printf("\n");
    //}

    for (int i = 1; i <= 5; i++)
    {
        for (int j = 1; j <= i; j++)//决定了每一行打印多少个
        {
            printf("*");
        }
        printf("\n");


        return 0;


    }
#include <stdio.h>
int main(){
	for(int i=0;i<=4;i++){
		for(int j=0;j<=i;j++){
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

#include<stdio.h>
int main(){
	for (int i = 1; i <= 5; i++){
        for (int j = 5; j >= i; j--)//每次循环结束后,j的值减 1(减少一个星号的打印)。
        {
            printf("*");
        }
        printf("\n");
	}

        return 0;
}

题目3 打印九九乘法表

#include <stdio.h>
int main(){
	for(int i=1;i<=9;i++){
		for(int j=1;j<=i;j++){
			printf("%d * %d = %d\t",j,i,i*j);
		}
		printf("\n");
	}
	return 0;
}

题目4 统计质数

#include<stdio.h>
int main(){
	int number = 100;
	int count=0;
	for(int i=2;i<number;i++){
		if(number % i==0){
			count++;
		}	
	
	}
	
	if(count == 0){
		printf("1-100没有质数");
	}else{
		printf("1-100之间有%d个质数",count); 
	}
	
	return 0;
}

题目5 幂级数列

#include <stdio.h>
int main()
{
    /*
        1的1次方+2的2次方+3的3次方+。。。+10的10次方
        用long  long 类型
        */
    //定义一个变量,用于累加最终的结果
    long long res=0;
    //外循环,依次表示1——10
    for (int i = 1; i <= 10; i++)
    {
        //内循环:表示外循环的数字一共要乘几次
        //表示1的1次方+2的2次方+3的3次方+...+10的10次方式子当中,每一个选项的单独结果
        long long pow = 1;
        for (int j = 1; j <= i; j++){
            pow = pow * i;
        }
        //当内循环结束之后,就表示每一个单独的选项,已经有结果了
        //累加的的目的,就是把每一个选项的单独结果相加
        res = res + pow;
    }
    //打印
    printf("%lld\n", res);
    return 0;
}
#include<stdio.h>
int main(){
	long long res=0;
	for(int i=1;i<=10;i++){
		long long pow = 1;
		for(int j=1;j<=i;j++){
			pow= pow*i;
		}
		res =res + pow;
	}
	printf("%d",res);
	return 0;
} 

题目6 特殊 数字

#include<stdio.h>
int main(){
	int number =1000;
	int i;
	for(i=0;i<number;i++){
		int bai = i/100;
		int shi = i/10%10;
		int ge = i%10;
		if(bai+shi+ge == 15){
			printf("%d ",i);
		} 
	}
	return 0;
}

🏙️字符串

题目1键盘录入字符并遍历

#include <stdio.h>
int main()
{
    /*
                需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串
        */

    //1.键盘录入一个字符串
    //底层逻辑:
    //    程序在运行的时候,首先会创建一个长度为100的字符数组str
    //    在进行键盘录入的时候,会把每一个字符存入到上面的str数组当中,并加上结束标记
    //    在这个过程中,需要修改字符数组的内容,所以第一种方式可以,第二种方式不可以
    char str[100];

    printf("请录入一个字符串\n");
    scanf("%s", str);//str本身就是一个指针,所以不用再加&
    printf("接收到的字符串为:%s", str);

    //2.遍历字符串得到每一个字符
    char* p = str;//定义一个字符指针变量 p,并将字符数组 str 的首地址赋值给 p。
    while (1){
        //利用指针获取字符串中的每一个字符,知道遇到\0为止
        char c = *p;
        //判断当前获取到的字符是否为结束标记
        if(c == '\0'){
            //如果是结束标记,循环结束
            break;
        }
        printf("%c\n", c);
        //指针往后移动一个位置
        p++;
    }
    return 0;
}
#include <stdio.h>
int main(){
	char str[100];
	printf("输入字符串:");
	scanf("%s",str);
	printf("输出这个字符串:%s",str);
	
	char *p = str;
	while(1){
		char c = *p;
		if(c == '\0'){
			break;
		}
		printf("%c\n",c);
		p++;
	}
	return 0;
}
3.#include <stdio.h>
int main()
{
    /*
            需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串
    */

    //1.键盘录入一个字符串
    //底层逻辑:
    //    程序在运行的时候,首先会创建一个长度为100的字符数组str
    //    在进行键盘录入的时候,会把每一个字符存入到上面的str数组当中,并加上结束标记
    //    在这个过程中,需要修改字符数组的内容,所以第一种方式可以,第二种方式不可以
    char buffer[10];

    printf("请录入一个字符串\n");
    scanf_s("%s", buffer, sizeof(buffer));//str本身就是一个指针,所以不用再加&

    printf("接收到的字符串为:%s\n", buffer);

    //2.遍历字符串得到每一个字符
    //遍历字符串其实就是遍历str这个数组,但是,字符串的内容不知道,所以不能用for循环,
    // 因为不知道循环的次数,也不知道循环的范围,但是能知道每一个字符串的结尾都会有一个\0作为结束标记,
    // 所以要用whie循环






    char* p = buffer;

    while (1)
    {
        //利用指针获取字符串中的每一个字符,知道遇到\0为止
        char c = *p;//先写一个临时变量char c,用他去记录当前指针获取到的数据,
        //在下面就可以对获取到的数据c来做一个判断

        //判断当前获取到的字符是否为结束标记
        if (c == '\0')
        {
            //如果是结束标记,循环结束
            break;
        }
        //打印当前遍历到的字符
        printf("%c\n", c);
        //指针往后移动一个位置
        p++;
    }

    return 0;
}

题目2 字符串数组

#include <stdio.h>
int main()
{
    /*
               需求:定义一个数组存储5个学生的名字并进行遍历

                   字符串的底层其实就是字符数组
                   把多个字符数组,再放入到一个大的数组当中
                   二维数组
        */

    //1.定义一个二维数组,存储多个学生的名字
    //先写一个char,然后给这个数组起一个名字,比如说就叫做strArr,就表示字符串的数组,
    //既然是一个二维数组,后面要写2个[],第一个表示要存多少个一维数组,第二个表示字符串有多长,可以写大一点
    char strArr[5][100] =
    {
        "zhangsan",
        "lisi",
        "wangwu",
        "zhaoliu",
        "qianqi"
        };

    //2.遍历二维数组
    for (int i = 0; i < 5; i++) {
        //i.依次表示二维数组中的每一个索引
        char*str=strArr[i];//利用strArr和索引,就能获取到每一个一维数组,而这里的一维数组,其实就是表示每一个名字
        //然后再把他进行赋值,赋值给一个str的指针,
        printf("%s\n", str);

        //小小的细节:就在通过strArr获取每一个元素的时候,只能复制给指针,如果说再写一个数组,比如说
        //char str[100] =strArr[i],这样子是不行的
        //应该得在后面加{},即:char str[100]={}


    }

    //第二种方式
    //把第五个字符串的指针,放入到一个数组当中
    //指针数组
    char* strArr2[5] =
    {
        "zhangsan",
        "lisi",
        "wangwu",
        "zhaoliu",
        "qianqi"
        };

    //遍历指针数组
    for (int i = 0; i < 5; i++)
    {
        //i:依次表示数组中的每一个索引
        char* str = strArr2[i];
        printf("%s\n", str);
    }

    return 0;
}

题目3 用户登陆

#include <stdio.h>
#include<string.h>
int main()
{
    /*
        需求:已知正确的用户名和密码,请用程序实现模拟用户登陆
        总共给3次机会,登录之后,请给出提示
        
        
        */

    //1.定义两个变量表示正确的用户名和密码
    char* rightUsername = "zhangtao";
    char* rightPassword = "1234qwer";



    //3.比较
    for (int i = 1; i <= 3; i++)
    {

        //2.键盘录入2个字符串,表示用户输入的用户名和密码
        printf("请输入用户名\n");
        char username[100];
        scanf("%s", username);

        printf("请输入密码\n");
        char password[100];
        scanf("%s", password);


        //验证
        printf("%s\n", username);
        printf("%s\n", password);

        if (!strcmp(username, rightUsername) && !strcmp(password, rightPassword))
        {
            printf("登录成功\n");
            break;
        }

        else
        {
            if (i == 3)
            {
                printf("用户%s被锁定,请联系黑马程序员官方账号",username);
            }


            else
            {
                printf("登录失败,还剩下%d次机会\n", 3 - i);
            }
        }



    }





    return 0;



}

题目4 统计次数

#include <stdio.h>
#include<string.h>
int main()
{
    /*
             键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数
                 (不考虑其他字符)
        */

    //1.键盘录入一个字符串
    printf("请输入一个字符串\n");
    char str[100];
    scanf_s("%s", str);

    //2.统计该字符中大写字母字符,小写字母字符,数字字符出现的次数
    //遍历字符串得到了吗的每一个字符

    int bigcount = 0;
    int smallcount = 0;
    int numbercount = 0;

    for (int i = 0; i < strlen(str); i++)
    {
        char c = str[i];
        if(c>='a' && c<='z')
        {
            smallcount++;
        }
        else if (c >= 'A' && c <= 'Z')
        {
            bigcount++;
        }
        else if (c >= '0' && c <= '9')
        {
            numbercount++;
        }
    }

    printf("大写字符出现了%d次\n", bigcount);
    printf("小写字符出现了%d次\n", smallcount);
    printf("数字字符出现了%d次\n", numbercount);












    return 0;



}

题目5 统计有多少个单词

数组名不能直接赋值

输入一行字符,统计其中有多少个单词,单词之间用空格分隔开

if(c=='')//word新单词出现标志,word=0,一般出现空格就要换到另一个新单词
    word=0;
else if(word==0)
{
    word =1;//表示这是新单词
    num++;//遇到非空格就回++,而前面是空格
#include <stdio.h>
int main()
    char string[81],c;
int i,num=0;word=0;
gets(string);//不用scanf,不能录入空格
for(i;(c=string[i])!='\0';i++)
    if(c=='')
        word=0;
else if(word==0)
{word=1;
 num++;
}
printf("%d words\n",num);
return 0;

🏙️数组

题目1 len长度

#include <stdio.h>
void printArr(int arr[], int len);
int main()
{
    /*
        1.数相作为函数的参数,要注意什么
            实际上传递是数组的首地址,如果要在函数中对数组进行遍历的话,记得一定要把数组的长度一起传递过去
            定义处:arr表示的就是完整的数组
            函数中的arr:只是一个变量,用来记录数组的首地址
            2.数组的索引越界
             最小索引:0
             最大索引:长度-1

    */

    //1.定义数组
    int arr[] = { 1,2,3,4,5 };
    //printf("%zu\n", sizeof(arr));
    int len = sizeof(arr) / sizeof(int);
    //2.调用函数遍历数组
    printArr(arr, len);
    return 0;
}

void printArr(int arr[], int len)
{
    //printf("%zu\n", sizeof(arr));//在函数里面打印arr的时候,没有那个取地址运算符&直接是arr
    //8 64位的操作系统当中,是以64个二进制表示内存地址值
    //这个下面的arr,其实不是这个数组的整体  
    //所以用sizeof来测量arr,测量的并不是数组完整的大小,而是下面的这个变量的大小
    for (int i = 0; i < len; i++)
    {
        printf("%d\n", arr[i]);
    }

}

#include<stdio.h>
	void printArr (int arr[],int len){
		for(int i=0;i<len;i++){
			printf("%d ",arr[i]);
		}
	}
	int main(){
		int arr[] = {1,2,3,4,5};
		int len = sizeof(arr) / sizeof(int);
		printArr(arr,len);
		return 0;
	
}

题目2 求最值

#include <stdio.h>
int main()
{
    /*
              需求:已知数组元素为{33,5,22,44,55}
                  请找出数组中最大值并打印在控制台
              思考一:
                       循环是不是一定要从0索引开始?
                           不是的,如果max的默认值记录的是0索引的,循环就可以从1 开始,提高效率
                  思考二:
                       max的默认值是否可以写为0?
                           不可以的,如果数组里面所有的数据都是负数,循环结束之后,得到的最大值0,此时会给人产生误解
                           max的默认值:一定要是数组中已经存在的数据,一般都是把0索引当作默认值
        */

    //1.定义数组
    int arr[] = { 33,5,22,44,55 };
    //2.定义变量max,记录数组的最大值
    int max = arr[0];
    //3.遍历数组得到每一个元素,拿着遍历到的元素跟max进行比较
    //遍历到的元素<= max 里面记录的数据   不做任何处理
    //遍历到的元素>max里面记录的数据      max就要修改成新的值
    int len = sizeof(arr) / sizeof(int);

    for (int i = 0; i < len; i++){
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    //4.输出max
    printf("%d\n", max);
    return 0;
}
#include<stdio.h>
int main(){
	int arr[] = {2,5,34,6,7};
	int len = sizeof(arr) / sizeof(int);
	int max = arr[0];
	for(int i=0;i<len;i++){
		if(max < arr[i]){
			max = arr[i];
		}
		
	}
	printf("%d",max);
	return 0;
}

题目3 数组求和(基础版)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    /*
              需求:生成10个1~100之间的随机数存入数组
                  求出所有数据的和
        */
    //1.定义数组
    int arr[10] = { 0 };
    int len = sizeof(arr) / sizeof(int);
    //2.生成10个1~100之间的随机数存入数组
    //设置种子
    srand(time(NULL));
    //生成随机数
    for (int i = 0; i < len; i++){
        int num = rand() % 100 + 1;
        //把随机数存入到数组
        arr[i] = num;
    }

    //3.利用累加思想求数组中所有数据的和
    int sum = 0;
    for (int i = 0; i < len; i++)  {
        sum = sum + arr[i];
    }

    //4.输出
    printf("%d\n", sum);
    return 0;
}
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main(){
	int arr[200];
	int len =sizeof(arr)/sizeof(int);
	int sum=0;
	//设置种子
	srand(time(NULL)); 
	for(int i=0;i<len;i++){
		int num = rand() % 100 + i;
		arr[i] = num;
			printf("%d ",arr[i]);
	}
	
	printf("\n");
	for(int i=0;i<len;i++){
		sum =sum+arr[i];
	}

	printf("%d\n",sum);
	return 0;
}

题目4 数组求和(升级版)(难)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>


int contains(int arr[], int len, int num);

int main()
{

    /*
              需求:生成10个1~100之间的随机数存入数组,要求数据不能重复
                  1.求出所有数据的和
                  2.求所有数据的平均数
                  3.统计有多少个数据比平均值小
   */

    //1.定义数组
    int arr[10] = { 0 };
    int len = sizeof(arr) / sizeof(int);

    //2.生成10个1~100之间的随机数存入数组
    //设置种子
    srand(time(NULL));
    //生成随机数
    for (int i = 0; i < len; i++) {
        int num = rand() % 100 + 1;
        //存入之前先做一个判断,如果不存在,再进行添加
        int flag = contains(arr, len, num);
        if (!flag) {
            arr[i] = num;
            i++;
        }
        for (int i = 0; i < len; i++) {
            printf("%d\n", arr[i]);
        }
         arr[i] = num;
    }
    //3.利用累加思想求数组中所有数据的和
    int sum = 0;
    for (int i = 0; i < len; i++){
        sum = sum + arr[i];
    }
    //求平均数
    int avg = sum / len;
    //统计有多少个数字比平均数小、
    int count = 0;
    for (int i = 0; i < len; i++) {
        if (arr[i] < avg); {
            count++;
        }
    }
    //4.输出
    printf("%d\n", sum);
    return 0;
}
int contains(int arr[], int len, int num)
{
    for (int i = 0; i < len; i++){
        //i.依次表示数组里面的每一个索引
        //arr[i]:依次表示数组里面的每一个数据
        if (arr[i] == num) {
            return 1;
        }
    }
    return 0;
}

题目5 反转数组

#include <stdio.h>
void printArr(int arr[], int len);
int main()
{
    /*
                  需求:键盘录入5个数据并存入数组,完成一下要求
                                1.遍历数组 2.反转数组3.再次遍历
        */
    //1.定义数组
    int arr[5] = { 0 };
    int len = sizeof(arr) / sizeof(int);
    //2.键盘录入数据
    for (int i = 0; i < len; i++)
    {
        printf("请录入第%d个元素\n", i + 1);
        scanf("%d", &arr[i]);
    }
    //3.遍历数组
    printArr(arr, len);

    //4.反转数组
    int i = 0;
    int j = len - 1;
    while (i < j)
    {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] =  temp;

        i++;
        j--;
    }
    //5.遍历数组
    printArr(arr, len);
    return 0;
}
void printArr(int arr[], int len){
    for (int i = 0; i < len; i++) {
        printf("%d\n", arr[i]);
    }
}
#include<stdio.h>
void printArr(int arr[],int len);
int main(){
	int arr[5] = {0};
	int len = sizeof(arr) / sizeof(int);
	for(int i=0;i<len;i++){
			printf("请录入第%d个数据:",i+1);
			scanf("%d",&arr[i]);
	}
	printArr(arr,len);
	printf("\n");
	
	//反转数组
	int i=0;
	int j = len-1;
	while(i<j){
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
		i++;
		j--;
	} 
	printArr(arr,len);
	return 0;
}

void printArr(int arr[],int len){
	for(int i=0;i<len;i++){
		printf("%d ",arr[i]);
	}
}

题目6 打乱数组中的数据

#include <stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
    /*
        需求:定义一个数组,存入1-5,要求打乱数组中所有数据的顺序        
        */

    //1.定义数组
    int arr[] = { 1,2,3,4,5, };
    int len = sizeof(arr) / sizeof(int);

    //2.遍历数组,得到每一个元素,让这个元素跟随机索引处的元素进行交换

    //设置种子
    srand(time(NULL));
    for (int i = 0; i < len; i++){
        //获取一个随机索引
        //0~4
        int index = rand() % len;
        //拿着i指向的元素,跟index指向的元素进行交换
        int temp = arr[i];
        arr[i] = arr[index];
        arr[index] = temp;
    }


    //3.遍历数组
    for (int i = 0; i < len; i++) {
        printf("%d\n", arr[i]);
    }
}
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main(){
	int arr[5] = {1,2,3,4,5};
	int len = sizeof(arr) / sizeof(int);
	srand(time(NULL));
	for(int i=0;i<len;i++){
		int index = rand()%len;
		int temp = arr[i];
		arr[i] = arr[index];
		arr[index] = temp;
	}
	
	for(int i = 0;i<len;i++){
			printf("%d ",arr[i]);
	}

	return 0;
}

🏙️数组常见算法

题目1 基本查找/顺序查找

#include <stdio.h>
int order(int arr[], int len, int num);
int main(){
    /*
            需求:数组的基本查找
                核心思路:就是从数组的0索引开始,依次往后查找
                         如果找到了,就会返回数据对应的索引
                                 如果没有找到,就会返回-1
        */

    //1.定义数组
    int arr[] = { 11,22,55,77,44 };
    int len = sizeof(arr) / sizeof(int);
    //2.定义一个变量表示要查找的数据
    int num = 55;
    //3.调用函数查找数据
    int index =order(arr, len,num);
    //4.输出索引
    printf("%d\n", index);
    return 0;
}


//作用:查找数组中的数据
//返回值:数据所在的索引
int order(int arr[], int len, int num){
    for (int i = 0; i < len; i++) {
        if (arr[i] == num) {
            return i;
        }
    }
    return -1;
}

题目2 二分查找/折半查找

#include <stdio.h>
int binarySearch(int arr[], int len, int num);
int main(){
    /*
            需求:数组的二分查找
                在7,23,79,81,103,127,131,147 中查找数据
        */
    //1.定义数组
    int arr[] = { 7,23,79,81,103,127,131,147 };
    int len = sizeof(arr) / sizeof(int);
    //2.定义变量表示要查找的数据
    int num = 150;
    //3.调用函数查找数据
    int index = binarySearch(arr, len, num);
    //4.输出
    printf("%d\n", index);
    return 0;
}

//作用:利用二分查找法查找数据
//返回值:数据在数组中的索引
//找到了,真实的索引
//没有找到,返回-1
int binarySearch(int arr[], int len, int num){
    //1.确定查找的范围
    int min = 0;
    int max = len - 1;

    //2.利用循环不断得进行查找
    while (min <= max) {
        //确定中间位置
        int mid = (min + max) / 2;
        //比较
        //min max mid 表示索引
        //num表示要查找的元素
        //坑:arr[mid]跟num进行比较
        if (arr[mid] < num) {
            //要查找的数据在右边
            min = mid + 1;
        }else if (arr[mid] > num){
            //要查找的数据是在左边
            max = mid - 1;
        }else{
            return mid;
        }
    }
    //3.如果min大于maxl,表示数据不存在,赶回-1
    return -1;
}
#include <stdio.h>
int binarySearch(int arr[],int len,int num){
	int max = len-1;
	int min = 0;
	while(min <=max){
		int mid = (max+min) / 2;
		if(arr[mid] > num){
			max = mid-1;
	}else if(arr[mid] < num){
		min = mid + 1;
	}else{
		return mid;
	}
}
	return -1;
}

 
int main(){
	int arr[] = {7,23,79,81,103,127,131,147};
	int len = sizeof(arr) / sizeof(int);
	int num = 131;
	int index = binarySearch(arr,len,num);
	printf("索引是:%d",index);
	return 0; 
}

笔记

题目3 插值查找

int mid = min + (key - arr[min]) / (arr[max] - arr[min]) * (max - min);

题目4 分块查找

笔记

题目5 冒泡排序

笔记

小程序

#include<stdio.h>
int main()
{
    /*
               冒泡排序:
                        1.相邻的元素两两比较,大的放右边,小的放左边
                                2.第一轮比较完毕之后,最大值就已经确定,第二轮可以少循环一次,后面依次类推
                                3.如果数组中有n个数据,总共我们只要执行n-1轮的代码就可以
                        需求:
                            利用冒泡排序将下列数据按照从大到小的顺序进行排序
                                3,5,2,1,4
        */

    //1.定义数组存储数据
    int arr[] = { 3,5,2,1,4 };
    int len = sizeof(arr) / sizeof(int);
    //2.利用冒泡排序,把数组中的数据按照升序排列
    //第一轮:
    for (int i = 0; i < len; i++)  {
        //相邻的元素两两比较,小的在前面,大的后面
        if (arr[i] > arr[i + 1]) {
            int temp = arr[i];
            arr[i] = arr[i + 1];
            arr[i + 1] = temp;
        }
    }

    //遍历
    for (int i = 0; i < len; i++){
        printf("%d", arr[i]);
    }
    return 0;
}

题目6 选择排序

#include <stdio.h>
int main()
{
    /*
             选择排序:
                      1.从0索引开始,跟后面的元素一一比较
                          2.小的放前面,大的放后面
                          3.第一轮循环从0索引开始比较,结束后最小的数据已经确定
                          4.第二轮循环从1索引开始,后面依次类推
                          5.第三轮循环从2索引开始,后面依次类推
                  6.第四轮循环从3索引开始,后面依次类推
                          需求:
                             利用选择排序将下列数据按照从小到大的顺序进行排序
                                 3,5,2,1,4
        */

    //1.定义数组存储元素
    int arr[] = { 3,5,2,1,4 };
    int len = sizeof(arr) / sizeof(int);

    //2.利用选择排序,将数组中的数据按照升序进行排列
    for (int i = 0; i < len - 1; i++){
        //i.依次表示数组中的每一个索引
        //第一轮: i =0  j=1 2 3 4
        //第二轮: i=1   j=2 3 4
        //第三轮: i=2   j=3 4
        //第四轮: i=3   j=4
        for (int j = i + 1; j < len; j++){
            //j:依次表示i索引后面的每一个索引
            if (arr[i] > arr[j]) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }


    //遍历
    for (int i = 0; i < len; i++){
        printf("%d ", arr[i]);
    }
    return 0;
}
#include<stdio.h>
int main(){
	int arr[] = {5,4,3,2,1};
	int len = sizeof(arr) / sizeof(int);
	for(int i=0;i<len-1;i++){
		for(int j=i+1;j<len;j++){
			if(arr[i] > arr[j]){
				int temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
		
	}
	for(int i=0;i<len;i++){
		printf("%d ",arr[i]);
	}
	return 0;
}

笔记

🏙️指针

最好的方式是指针

#include <stdio.h>

void getMaxAndMin(int arr[], int len, int* max, int* min);
int main()
{

    /*
              指针的作用二:
                      函数返回多个值
                        练习:
                           定义一个函数,求数组的最大值和最小值,并进行返回
        */

    //1.定义数组
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int len = sizeof(arr) / sizeof(int);
    //2.调用getMaxAndMin函数求最大值和最小值
    int max = arr[0];
    int min = arr [0];
    getMaxAndMin(arr, len, &max, &min);
    printf("数组的最大值为:%d\n", max);
    printf("数组的最小值为:%d\n", min);
    return 0;
}

void getMaxAndMin(int arr[], int len,int*max,int*min){
    //求数组的最大值
    * max = arr[0];
    for (int i = 1; i < len; i++){
        if (arr[i] > *max) {
            *max = arr[i];
        }
    }

    //求数组的最小值
    * min = arr[0];
    for (int i = 1; i < len; i++){
        if (arr[i] < *min){
            *min = arr[i];
        }
    }
}
#include<stdio.h>
void getMaxAndMin (int arr[],int len ,int*max,int*min){
	*max = arr[0];
	for(int i=1;i<len;i++){
		if(*max<arr[i]){
		*max = arr[i];
		}
	}
	
	*min = arr[0];
	for(int i=1;i<len;i++){
		if(*min>arr[i]){
			*min = arr[i];
		}
	}
}
int main(){
	int arr[] = {12,44,33,65,12,77,98,45,67,43,23};
	int len = sizeof(arr) / sizeof(int);
	int max = arr[0];
	int min = arr[0];
	getMaxAndMin(arr,len,&max,&min);
	printf("%d\n",min);
	printf("%d",max);
	return 0;
}

指针的第三个作用(函数的结果和状态分开)

#include <stdio.h>
int getRemainder(int num1, int num2, int* res);
int main()
{
    /*
           作用3:函数的结果和计算状态分开
           练习:定义一个函数,将两数相除,获取他们的余数
        */

    //1.定义两个变量
    int a = 10;
    int b = 4;
    int res = 0;

    //2.调用函数获取余数
    int flag = getRemainder(a, b, &res);
    //3.对状态进行判断
    if (!flag) {
        printf("获取到的余数为:%d\n",res);
    }
    return 0;
}

//返回值:表示计算状态  0正常  1  不正常
int getRemainder(int num1, int num2, int* res){
    if(num2 == 0){
        //停止
        return 1;
    }
    *res = num1 % num2;
    return 0;
}

#include<stdio.h>
int getRemainder(int num1,int num2,int*res){
	if(num2 == 0){
		return 1;// 除数为0,返回失败状态
	}
	*res = num1 % num2;
	return 0;
}
int main(){
	int num1,num2;
	int res;
	printf("请输入2个要除的数:");
	scanf("%d %d",&num1,&num2);
	int result = getRemainder(num1,num2,&res);
	if (result == 0){
		printf("余数是:%d",res);//最后函数返回的0,用result接收,如果是0,说明程序正确允许,直接打印出res 
	}else {
		printf("计算失败");
	}

	return 0;
}

二维数组遍历(利用索引)

#include<stdio.h>
int main()
{
    //遍历:利用索引就行遍历 / 利用指针进行遍历

    //1.定义一个二维数组
    int arr[3][5] =
    {
        {1,2,3,4,5},
        { 11, 22, 33, 44, 55 },
        { 111,222,333,444,555 }
    };

    //2.利用索引的方式进行遍历
    //arr[0]:表示二维数组当中的第一个一维数组,
    //arr[1]:表示二维数组当中的第二个一维数组,
    //arr[2]:表示二维数组当中的第三个一维数组

    for (int i = 0; i < 3; i++) {
        //i:依次表示二维数组中的索引
        for (int j = 0; j < 5; j++){
            //j:依次表示一维数组中的索引
            //内循环:遍历每一个一维数组
            printf("%d ", arr[i][j]);
        }
        //当内循环结束之后,表示一位数组遍历完毕了
        printf("\n");
    }
    return 0;
}
#include <stdio.h>
int main()
{
    //1.定义三个一维数组
    int arr1[3] = { 1,2,3 };
    int arr2[5] = { 1,2,3,4,5};
    int arr3[9] = { 1,2,3,4,5,6,7,8,9 };

    //预先计算每一个数组的真实长度
    int len1 = sizeof(arr1) / sizeof(int);
    int len2 = sizeof(arr2) / sizeof(int);
    int len3 = sizeof(arr3) / sizeof(int);

    //再定义一个数组,装所有数组的长度
    int lenArr[3] = { len1,len2,len3 };


    //把三个一维数组放入到二维数组当中
    //数组的数据类型,跟内部存储的元素类型保持一致
    //arr1:使用数组名进行计算的时候,退化为指向第一个元素的指针,此时不再表示数组的那个整体了
    //指针----内存地址  64位win  8个字节
    int* arr[3] = { arr1,arr2,arr3 };

    //利用索引遍历arr
    for (int i = 0; i < 3;i++){
        //i.依次表示二维数组的索引 0 1 2
        for (int j = 0; j < lenArr[i]; j++) {
            printf("%d", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值