🌟菜鸟主页:@晨非辰的主页
👀学习专栏:《C语言刷题合集》
💪学习阶段:C语言方向初学者
⏳名言欣赏:"编译器不会骗人,骗人的永远是你写的逻辑。"
前言:刷题博客主要记录在学习编程语言时,练习的一系列题目,比较适合C语言的初学者用来巩固提高编程能力,其余可见专栏。
1. 数组练习——多个字符从两端移动,向中间汇聚
解题思路——
--核心逻辑
- 目标:
- 实现:将初始数组1内容全为“*”逐步换成数组2“welcome to bit!!!!!!
- 替换形式:要求从左侧和右侧同时替换,一回算一次;
- 输出展示:每替换一次,在屏幕上打印;
--定义变量与初始化
- 定义数组:
初始数组:char arr1[] = {"********..."}; 最终数组:char arr2[] = {"welcome ..."};
- 确定范围:
--定义出左右两个变量,将二者置于最大范围,即左为0、右为数组最右侧下标;
--对于数组长度的计算——可以选择sizeof/strlen;
--循环实现:
while循环,循环条件----当左值小于等于右值;将两个数组内容进行对应赋值。
-- 优化调整:
为了更清楚看到代码的变化,使用睡眠函数--Sleep(包含头文件 windows.h)延长代码出现时间。
//想达到动画效果(每次清屏),使用指令----system(cls)
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
char arr1[] = "********************";//初始数组
char arr2[] = "welcome to bit!!!!!!";//最终目标数组
//求数组长度,利用下标进行替换
int left = 0;//定义左右变量,用来当下标
int right = strlen(arr1) - 1;//求数组长度,要使用下标,结果-1/也可以用sizeof;
//实现左侧和右侧同时替换,利用循环进行
while (left <= right)//循环条件,当l>r代表全部替换完成
{
arr1[left] = arr2[left];
arr1[right] = arr2[right];
left++;
right--;
printf("%s\n", arr1);//最后打印
//实现打印速度降低,使用睡眠函数
Sleep(500);//单位ms
//实现只留下一部的操作,使用清屏的函数/指令
system("cls");//cls——clean screen
}
printf("%s\n", arr1);
return 0;
}
🍀注意:对于求数组长度strlen还是sizeof的使用,会在后续文章出现。
2. 数组练习——二分查找
解题思路——
--核心逻辑
- 目标:在升序数组中查找数值num,找到则返回下标,否则提示未找到;
- 核心思路:
--确定边界——l、r(数组长度,使用下标);
--计算中间值——mid;比较arr[mid]与num,对边界进行调整;
--定义变量与初始化
升序数组:arr[] = {...};
边界:int left = 0; int right = sizeof(arr) / sizeof(arr[0]) -1//下标
中间值:int mid = (left + right)/2
数值:num 自行输入
--语句实现
while循环条件——left<=right。
在折半过程中,范围缩小,if else语句 讨论中间值与num大小确定左变还是右变。
--优化与调整
数组不是升序数组/长度为0,直接返回没找到。
int main()
{
int arr[] = {1,2,3,4,4,7,6,5,8,9};
// int arr[] = { 1,2,3,4,5,6,7,8,9 };//定义简单的升序数组;包括非严格升序:有相等数值;
//折半查找数字n,要确定中间值、要确定范围;与num进行比较。用到下标
int num = 10;
//scanf("%d", &num);//数值n由输入确定
int left = 0;//下标0开始
int right = sizeof(arr) / sizeof(arr[0]) - 1;//将最右下标确定为数组最右数值
bool found = false;//布尔类型,定义初始没找到
int i = 0;
if ((right == -1) || (arr[i] > arr[i++]))//数组长度为0,直接输出:没找到!||非升序数组直接返回没找到
{
printf("没找到!\n");
}
//循环实现num与mid比较
while (left <= right)
{
int mid = (left + right) / 2;//中间值
if (arr[mid] < num)
{
left = mid + 1;//r不变
}
else if (arr[mid] > num)
{
right = mid - 1;//l不变
}
else
{
printf("找到了!下标是: %d\n", mid);
found = true;
break;//找到,跳出循环
}
}
if (found == false)//bool不变,输出没找到
{
printf("没找到!\n");
}
return 0;
}
结语:本章主要是对数组部分习题的练习,后续还会有其他练习;如果对你有帮助,那就一起来刷题吧!