day7
数组:
相同类型n个元素的有限集合
1.一维数组
1.一维整形数组
1.定义:
存储类型 数据类型 数组名[元素个数];
存储类型:
auto:(默认)
自动型变量
register:
寄存器变量
extern:
声明外部变量
static:
静态变量
数据类型:
基本数据类型
int double short long float char
构造数据类型
struct union enum
数组名:
1.可以由字母、数字、下划线构成,不能以数字开头
2.不能与C语言关键字重名
3.最好不要与库函数重名
元素个数:
1.元素个数不能省略
2.元素个数必须为常量或常量表达式,不能是变量或变量组成的表达式
2.元素访问:
int a[5];
数组名[表达式]
表达式:
1.可以是常量
2.可以是常量表达式
3.可以是变量
4.可以是变量表达式
int n = 3;
a[n+1]
a[0+0]
a[1]
a[2]
a[3]
a[4]
3.一维数组的初始化:
初始化 != 赋值
1.全部初始化:
int a[5] = {1, 2, 3, 4, 5};
2.部分初始化:
int a[5] = {1, 2, 3};
3.默认初始化:
int a[] = {1, 2, 3, 4, 5};
4.数组存储:
连续:数组空间连续
有序:数组元素在空间中存储有序
5.数组元素个数:
sizeof(a) / sizeof(a[0])
注意:
1.数组定义时,元素个数必须为常量
2.避免数组的越界访问
3.数组只能对每个元素单独操作,不能对数组整体操作
练习:
1.从终端输入5个数,放入整形数组中,计算这5个数的 平均值并完成打印
自定义输入
#include <stdio.h>
int main(int argc, const char *argv[])
{
// int a[5] = {3, 1, 2, 5, 4};
// int a[5] = {1, 2, 3};
int a[] = {
1, 2, 3, 4, 5, 6, 7, 8};
int i = 0;
#if 0
for (i = 0; i < 5; i++)
{
a[i] = i+1;
}
#endif
for (i = 0; i < 5; i++)
{
printf("a[%d] = %d\n", i, a[i]);
}
printf("sizeof a is %d\n", sizeof(a));
printf("len of a is %d\n", sizeof(a) / sizeof(a[0]));
return 0;
}
从键盘输入
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[5] = {
0};
int i = 0;
int Num = 0;
int Sum = 0;
int Len = 0;
Len = sizeof(a) / sizeof(a[0]);
for (i = 0; i < Len; i++)
{
scanf("%d", &a[i]);
}
for (i = 0; i < Len; i++)
{
Sum += a[i];
}
printf("平均值:%.2lf\n", (double)Sum / (double)Len);
return 0;
}
5.整形数组排序:
1.冒泡排序
时间复杂度:
O(n^2)
稳定排序算法
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[5] = {
0};
int i = 0;
int j = 0;
int Tmp = 0;
int Len = sizeof(a) / sizeof(a[0]);
for (i = 0; i < Len; i++)
{
scanf("%d", &a[i]);
}
for (j = 0; j < Len-1; j++)
{
for (i = 0; i < Len-1-j; i++)
{
if (a[i] > a[i+1])
{
Tmp = a[i];
a[i] = a[i+1];
a[i+1] = Tmp;
}
}
}
for (i = 0; i < Len; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
2.选择排序
时间复杂度:
O(n^2)
不稳定排序算法
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[5] = {
0};
int i = 0;
int j = 0;
int Min = 0;
int Tmp = 0;
int Len = sizeof(a) / sizeof(a[0]);
for (i = 0; i < Len; i++)
{
scanf("%d", &a[i]);
}
for (j = 0; j < Len-1; j++)
{
Min = j;
for (i = j+1; i < Len; i++)
{
if (a[i] < a[Min])
{
Min = i;
}
}
if (Min != j)
{
Tmp = a[Min];
a[Min] = a[j];
a[j] = Tmp;
}
}
for (i = 0; i < Len; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
3.插入排序
时间复杂度:
O(n^2)
稳定排序算法
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[5] = {
0};
int i = 0;
int j = 0;
int Tmp = 0;
int Len = sizeof(a) / sizeof(a[0]);
for (i = 0; i < Len; i++)
{
scanf("%d", &a[i]);
}
for (j = 1; j < Len; j++)
{
Tmp = a[j];
for (i = j; i > 0 && Tmp < a[i-1]; i--)
{
a[i] = a[i-1];
}
a[i] = Tmp;
}
for (i = 0; i < Len; i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
2.一维字符型数组
字符串的存储
1.定义:
char 数组名[元素个数];
2.数组的初始化:
初始化 != 赋值
1.全部初始化:
char Str[6] = {"hello"};
char Str[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
char Str[6] = "hello";
2.局部初始化:
char Str[6] = {'h', 'e', 'l'};
char Str[6] = {"hel"};
char Str[6] = "hel";
char Str[6] = {0};
3.默认初始化:
char Str[] = {'h', 'e', 'l', 'l', 'o', '\0'};
char Str[] = {"hello"};
char Str[] = "hello";
初始化 != 赋值
char Str[6] = {0};
#include <stdio.h>
int main(int argc, const char *argv[])
{
char Str[32] = {
"hello world"};
printf("%s\n", Str);
puts(Str);
return 0;
}
2.字符数组的输入和输出:
printf("%s\n", Str);
puts(Str);
gets
scanf("%s", Str);
#include <stdio.h>
int main(int argc, const char *argv[])
{
char Str[32] = {
0};
// scanf("%s", Str);
gets(Str);
puts(Str);
return 0;
}
作业:
1.从终端获得5个数,将这5个数完成倒置后输出
1 2 3 4 5
5 4 3 2 1
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int a[5] = {
0};
int tmp;
for(i = 0; i < 5; i++)
{
scanf("%d",&a[i]);
}
for(i = 0; i < 2; i++)
{
tmp = a[i];
a[i] = a[4-i];
a[4-i] = tmp;
}
for(i = 0; i < 5; i++)
{
printf("%d ",a[i]);
}
return 0;
}
2.从终端获得一个n,并对数组完成如下操作:
1 2 3 4 5 6 7 8 9
n:3
7 8 9 1 2 3 4 5 6
n:2
8 9 1 2 3 4 5 6 7
#include <stdio.h>
int main(int argc, const char *argv[])
{
int n = 0;
int tmp = 0;
int i = 0, j = 0;
int a[] = {
1,2,3,4,5,6,7,8,9};
int len = sizeof(a) / sizeof(a[0]);
scanf("%d",&n);
for (i = 0; i < n; i++)
{
tmp = a[len-1];
for (j = len-1; j > 0; j--)
{
a[j] = a[j-1];
}
a[0] = tmp;
}
for (i = 0; i < len; i++)
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
3.将两个5个数组a,b合并成一个有序排列的数组
int a[5] = {1, 3, 4, 5, 7};
int b[5] = {2, 4, 8, 8, 9};
#include <stdio.h>
int main(int argc, const char *argv[])
{
int i = 0;
int j = 0;
int tmp = 0;
int a[5] = {
1,3,5,7,9};
int b[5] = {
2,4,6,8,10};
int c[10] = {
0};
int k = 0;
for(i = 0; a[i] != '\0'; i++)
{
c[i] = a[i];
}
for(j = 0; b[j] != '\0'; j++)
{
c[i+j] = b[j];
}
c[i+j] = '\0';
for(i = 0; i < 10 - 1;i++ )
{
for(j = 0; j < 10 - 1 - i; j++)
{
if(c[j] > c[j+1])
{
tmp = c[j];
c[j] = c[j+1];
c[j+1] = tmp;
}
}
}
for(i = 0; i < 10; i++)
{
printf("%d ",c[i]);
}
return 0;
}
思考题:
1. 编写程序,求a+aa+aaa+…+aa…a,其中a是一个数字。
例如:3+33+333+3333+33333(此时n为5)。
要求a和n从键盘输入,输出格式为
3+33+333+3333+33333=37035
0*10 + 3
3*10 + 3
33*10 + 3
333*10 + 3
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a,i,n,s=0,k=0;
scanf("%d%d",&a,&n);
for(i = 0;i < n;i++)
{
k =k*10+a;
s+=k;
}
printf("%d\n",s);
return 0;
}
day8
字符型数组:
1.定义:
char 数组名[元素个数];
2.初始化:
1.默认初始化
2.局部初始化
3.全部初始化
3.字符型数组输入输出:
gets
scanf
puts
printf
#include <stdio.h>
int main(int argc, const char *argv[])
{
char Str[32] = {
0};
gets(Str);
Str[5] = '\0';
printf("Str = %s\n", Str);
return 0;
}
4.字符串的赋值
必须使用strcpy完成
strcpy: 字符串的拷贝
strcpy(dst, src);
必须目的空间能够存放下源字符串
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char Str1[32] = {
0};
char Str2[32] = {
0};
/*
Str = "hello world"; //错
Str[32] = "hello world"; //错
*/
strcpy(Str1, "hello world");
strcpy(Str2, Str1);
printf("Str1 = %s\n", Str1);
printf("Str2 = %s\n", Str2);
return 0;
}
5.字符串的拼接:
strcat: 字符串的拼接
strcat(Str1, Str2);
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char Str1[32] = {
"hello"};
char Str2[32] = {
"world"};
strcat(Str1, Str2);
printf("Str1 = %s\n", Str1);
printf("Str2 = %s\n", Str2);
return 0;
}
必须能够存放下拼接后的字符串,否则会内存越界
6.字符串的比较:
strcmp: 字符串比较
返回值:
0 两个字符串相等
> 0 第一个字符串 > 第二个字符串
< 0 第一个字符串 < 第二个字符串
strcmp(Str1, Str2);
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char Str1[32] = {
0};
char Str2[32] = {
0};
int Ret = 0;
printf("请输入两个字符串:\n");
gets(Str1);
gets(Str2);
Ret = strcmp(