立志成为嵌入式高手的第八天------一维字符数组

发布时间:2024年01月25日

冒泡和选择哪个循环方法好?

通过CPU执行代码(指令)的数量=消耗时间

计算时间复杂度:O(n)计法? //大o计法

1 ?n-1? ? ? ? ? ? ? ? ? ?
2 ?n-2
3 ?n-3
...
n-1 1

1+2+3+...+n-1 //等差数列?

((n-1)(1+n-1))/2

(n-1)n ? /2

(n^2-n)/2

O(n) ?= n^2 //时间复杂度?

0 ?n-1

1 ?n-2?

2 ?n-3

插入排序

思想:(再有序的数列中)找一个合适的位置,插入;就如同军训站队

#include <stdio.h>

int main(void)
{
	int i = 0;
	int j = 0;

	int a[] = {5,1,7,2,3,8,4,6,9}; 
	int len = sizeof(a)/sizeof(a[0]);

	for (i = 0; i < len; ++i)
	{
		printf("%d ",a[i]);
	}
	putchar('\n');

	int b[10] = {0};
    for (i = 0; i < len; ++i)
	{
		int t = a[i];
		j = i;
		while (j > 0 && a[j-1] > t)
		{
			a[j] = a[j-1];
			--j;
		}
		a[j] = t;
	}
	for (i = 0; i < len; ++i)
	{
		printf("%d ",a[i]);
	}
	putchar('\n');

变长数组(可变)

? int? n;

? scanf(”%d“,&n)

? int? a[n];

如上所示,想要成立int a[n]不能被初始化。

查找

二分查找(折半查找):

前提:数据必须有序? 所以要先排序在查找

如:

10000?
5000
2500
1250
625
312?
150
75
37
18
9
4
2
1

#include <stdio.h>
	
int main(void)
 {
	
	int a[] = {5,1,7,2,3,8,4,6,9}; 

    int begin = 0;
	int end = len-1;
	int mid = 0;
	
    printf("Input a num:");
	int n = 0;
	scanf("%d",&n);

	
	while (begin <= end)
	{
		mid = (begin+end)/2;

		if (a[mid] > n)
		{
			end = mid - 1;
		}else if (a[mid] < n)
		{
			begin = mid + 1;
		}else 
		{
			break;
		}
	}

	if (begin < end)
	{
		printf("%d is found!\n",n);
	}else 
	{
		printf("%d is not found!\n",n);
	}
	
	return 0; 

一维字符型数组

字符数据:

unsigned char s[10];

unsigned char? s[10]={'h','d','x','t','g','o','v','p','w','f'};

最主要:”hello“就是字符串的表现形式,同时字符串的储存形式是按照字符数组的形式储存,对于字符串的储存最后会一 '\0' 结尾,对于字符串来说叫做结束标致。

注意:

1.字符串更关注的是字符串本身字符串整体,而不是单个单个字符

2.字符串结尾的标志比较重要,表示的是字符串结束

3.处理字符时,常常使用结束标志作为判断

int puts(const? char? *s)

功能是输出字符串

参数:

@a时字符的首地址

特点:使用这个函数输出使会自动和换行

char? *gets(char? *s)

功能:

使用这个函数是用来输入字符串

参数:

@a使存放字符串的大一块内存空间

返回值:

表示的是存储字符串的的那块空间首地址

字符串的长度是'\0'前面有效字符的个数

char *strcpy(char *dest, const char *src);

功能是实现字符串的拷贝如strcpy(char? a[i],char b[i]);就是将b[i]里的字符复制到a[i].

参数:

@dest? 目标字符串

@src? 源字符串

返回值:

成功返回的是dest的地址

失败NULL

作业:

1. 字符串拼接

#include <stdio.h>

int main(void)
{

    int i=0;   
	int j=0;   //定义三个变量对其初始化
	int n=0;
	char s1[20]="hello";  
	char s2[20]="world";  //对数组s1,s2初始化

	while (s1[i]!='\0')   //对数组中的每个字符进行遍历当遇到0的时候循环停止
	{
		++i;      //循环一次记录一次 结果为数组s1的长度也是0的位置 
	}
	while (s2[n]!='\0')   //对数组中的每个字符进行遍历当遇到0的时候循环停止
	{
		++n;      //循环一次记录一次 结果为数组s2的长度 
	}
	for (j=0;j<i+n;++j)   //j为数组s2的下标 对s2中的每一个字符进行遍历 直到小于i+n停止
	{
		s1[i+j]=s2[j];    //循环一次将s2中j所对应的字符付给s1中i+j的位置
	}
	puts(s1);    //程序结束打印数组s1中的字符


	return 0;
}

2、从终端输入一个n 将数组 int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9} 完成如下变化,并打印,操作方

n:1 9 1 2 3 4 5 6 7 8

n:2 8 9 1 2 3 4 5 6 7

n:3 7 8 9 1 2 3 4 5 6

#include <stdio.h>

int main(void)
{
#if 0
	int n=0;
	int i=0;
	int j=0;  //定义三个变量对其初始化
    int a[9]={1,2,3,4,5,6,7,8,9};  //对数组a初始化

	printf("Enter a number: \n");  
	scanf("%d",&n);                   //输入想要输入循环次数

	for (j=0;j<n;++j)   //循环次数条件 
	{
		    int i=8;  //定义i=8时就是确定的没次循环的最后一位的值
			int t = a[i];  //定义一个整型变量t将最后一位拿出来给到t
		for (i=8;i>0;--i)   //进入循环 i从下标为8的时候开始循环 当i循环到1循环结束
		{
			a[i]=a[i-1];    //以次将每一位往后偏移
		}
		a[0]=t;   //将循环结束后最后拿出来的最后那一位放到开头

	}
	for (i=0;i<9;++i)  
	{                                     
		printf("a[%d]=%d ",i,a[i]);  //用循环的方式打印出数组的每一项元素
	}
putchar('\n');   //输出一个换行符
return 0;
}

文章来源:https://blog.csdn.net/2201_75392588/article/details/135764770
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。