🏙️基础
题目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;
}
C语言核心代码总结
1万+

被折叠的 条评论
为什么被折叠?



