题目一:多个字符从两端移动,向中间汇聚
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
int main()
{
char arr1[20] = "welcome to my blog.";
char arr2[20] = "###################";
int left = 0;
int right = strlen(arr2) - 1;
printf("%s\n", arr2);
while (left <= right)
{
Sleep(1000);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
}
return 0;
}
运行效果:
改进1:
上面的求right时,本质上是求arr2数组最后一个元素的下标;如果不使用strlen,还可以用sizeof:
int right = sizeof(arr2) / sizeof(arr2[0]) - 1 ;
思考:
如果要把上面"welcome to my blog."改为让用户自己输入一串字符,应该怎么办?
①arr2和 arr1的长度肯定要一样,这样对齐,展示效果会较好.那么arr1长度,那么我希望是用户输入字符串的长度,但是
a.
b.
如果不设定数组的个数,那么就会按照初始化的个数进行分配内存
所以用字符指针和c99标准中的变长数组来解决
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
int main()
{
printf("请输入一串字符:");
//用一个字符指针来存输入的字符串
char* str =NULL ;
scanf("%s", str);
//计算输入字符的长度,在用c99标准中的变长数组,创建合适大小的数组
int ret = strlen(str);
char arr1[ret] = *str;
//通过遍历,保证arr2跟arr1长度相等,arr2中全是#号
char arr2[ret] = { 0 };
for (int i = 0; i < ret; i++)
{
arr2[i] = '#';
}
int left = 0;
int right = strlen(arr2) - 1;
printf("%s\n", arr2);
while (left <= right)
{
Sleep(1000);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
}
return 0;
}
题目二:二分法排序
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
int left = 0;
int right = sizeof(arr1) / sizeof(arr1[0]) - 1;
int mid = 0;
int key = 7;
int find = 0;
while (left <= right)
{
mid = (left + right) / 2;
if (arr1[mid] < key)
{
left = mid + 1;
}
else if (arr1[mid] > key)
{
right = mid - 1;
}
else
{
find = 1;
break;
}
}
if (find == 1)
{
printf("找到了,下标为%d\n", mid);
}
else
{
printf("没找到!");
}
}
思考:为什么while条件:left<=right,有等于号?
题目三:冒泡排序
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[], int sz);
void bubble_sort(int arr[], int size1)
{
for (int i = 0; i < size1 - 1; i++)
{
for (int j = 0; j < size1 - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int ret = 0;
ret = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = ret;
}
}
}
}
int main()
{
int arr1[10] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr1) / sizeof(arr1[0]);
bubble_sort(arr1, sz);
for (int i = 0; i < sz ; i++)
{
printf("%d\n", arr1[i]);
}
return 0;
}
冒泡排序:
1.先确定需要冒多少趟,这个需要判断一下规律,结论:一个有序数组中有n个数,那么需要冒n-1趟
2.每一趟需要比较多少次呢? 总结:
3.写这种这种嵌套循环,需要搞清楚 i 和 j的关系,以防陷入无限循环
4.数组进行传参时,传的是首元素地址,所以不能再bubblesort函数内部去算sz大小,不然结果sz=1,就出现bug;故现在外面把sz算好,再传进去进行计算.