一维数组(构造类型之一,连续存放)
定义:
【存储类型】 数据类型 标识符 【下标】
初始化:
不初始化
全部初始化
部分初始化
static
元素引用:
数组名【下标】
数组名:
数组名是表示地址的常量,也是数组起始位置
数组越界:
数组越界是因为指针机制(arr[i] = *(arr + i),需要程序员自己检查)
一维数组应用:
1 fibonacci 数列(求该数列的前十项,并在数组中逆序存放)
2 数据排序
3 进制转换
4 删除法求质数
fibonacci 数列:
#include <stdio.h>
#include <stdlib.h>
static void fabonacci(void)
{
int fib[10] = {1,1};
int i,j,temp;
for(i = 2; i < sizeof(fib)/sizeof(fib[0]); i++)
fib[i] = fib[i-1] + fib[i-2];//一个数等于其前两项之和
for(i = 0 ; i < sizeof(fib)/sizeof(fib[0]) ; i++)
printf("%d\t",fib[i]);
printf("\n");
i = 0;
j = sizeof(fib)/sizeof(fib[0]) - 1;
while(i < j)//逆序存放,a[9]与a[0]互换
{
temp = fib[i];
fib[i] = fib[j];
fib[j] = temp;
i++;
j--;
}
for(i = 0;i < sizeof(fib)/sizeof(fib[0]); i++)
printf("%d\t",fib[i]);
printf("\n");
return ;
}
int main()
{
fabonacci();
exit(0);
}
冒泡排序法(把大值往前面推):
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main()
{
int i,j,temp;
int a[]= {10,7,6,54,8,9,22,1,13,99};//设定序列
for(i = 0;i < N;i++ )//打印序列
printf("%d\t",a[i]);
printf("\n");
for(i = 0;i < N-1;i++)//第一层
{
for(j = 0 ;j < N-i-1;j++)//第二层
{
if(a[j] > a[j+1])//如果当前数比后一个数大则交换位置
{
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for(i = 0; i < N;i++)
printf("%d\t",a[i]);//打印
printf("\n");
exit(0);
}
顺序排序法(把小的值往前面堆) :
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main()
{
int i,j,k,temp;
int a[]= {10,7,6,54,8,9,22,1,13,99};//设定序列
for(i = 0;i < N;i++ )//打印序列
printf("%d\t",a[i]);
printf("\n");
for(i = 0;i < N-1;i++)
{
k = i;//假设a[i]为小值
for(j = i+1;j < N;j++)
{
if(a[k] > a[j])
k = j;//
}
if(i != k)//如果值不相等,就交换
{
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
for(i = 0; i < N;i++)
printf("%d\t",a[i]);//打印
printf("\n");
exit(0);
}
进制转换:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,n[128];
int base,num;//定义要转换的进制和被转换的数字
printf("please enter the converted num : \n");
scanf("%d",&num);
printf("please enter the base num: \n");
scanf("%d",&base);
do
{
n[i] = num % base;//被转换数字除以进制获取余数
num = num /base;//被除数降级
i++;//次数递增
}while(num != 0);
for(i--;i >= 0; i--)
{
if(n[i] >= 10)
printf("%c",n[i] - 10 + 'A');//十六进制,大于十用A来表示
else
printf("%d",n[i]);
}
printf("\n");
}
删除法求质数:
#include <stdio.h>
#include <stdlib.h>
#define NUM 1001 //定义要求质数的范围
int main()
{
int i,j;
char primer[NUM] = {0};//先将所有的标记设置为0
for(i = 2; i < NUM; i++)//从2开始判断
{
if(primer[i] == 0)
{
for(j = i*2 ;j <= NUM; j+=i)//判断是否为质数
primer[j] = -1;//不是的话则将改标记置-1
}
}
for(i = 0;i < NUM; i++)
{
if(primer[i] == 0)//质数的标记为0
printf("%d\t",i);
}
printf("\n");
exit(0);
}
二维数组
1 定义、初始化
【存储类型】 数据类型 标识符 【行下标】 【列下标】
2 元素引用
数组名 【行标】 【列表】
3 存储模式
顺序存储、按行存储
4 深入理解二维数组
元素初始化:
全部元素赋值:a[M][N] = {{1,2,3},{4,5,6}};
部分元素赋值:a[M][N] = {{1,2,3}};//第二行自动补0或空值 a[M][N] = {{1,3},{4}};
按顺序赋值:a[M][N] = {1,2,3,4,5,6};
*二维数组的定义中只有行号可以省略:a[][N]
*a 的地址值为数组的起始地址
元素引用:
#include <stdio.h>
#include <stdlib.h>
#define M 2
#define N 3
int main()
{
int a[M][N];
int i,j;
for(i = 0; i < M; i++)
for(j = 0; j < N; j++)
scanf("%d",&a[i][j]);
for(i = 0;i < M; i++)
{
for(j = 0; j < N; j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
}
二维数组的应用:
1 行列互换
2 求最大值及其所在位置
3 求各行与各列的和
4 矩阵乘积
行列互换:
#include <stdio.h>
#include <stdlib.h>
#define M 2
#define N 3
static void change()
{
int i,j;
int a[M][N] = {1,2,3,4,5,6},b[N][M];
for(i = 0; i < M; i++)
{
for(j = 0;j < N; j++)
{
printf("%d\t",a[i][j]);//打印
b[j][i] = a[i][j];//互换
}
printf("\n");
}
for(i = 0; i< N; i++)
{
for(j = 0; j < M; j++)
printf("%d\t",b[i][j]);//互换后打印
printf("\n");
}
}
int main()
{
change();//在主函数中调用
}
求最大值及其所在位置:
#include <stdio.h>
#include <stdlib.h>
#define M 2
#define N 3
int main()
{
int i,j,row,colum,MAX;
int a[M][N] = {1,2,3,4,5,6};
MAX = a[0][0];//假设
for(i = 0; i < M; i++)
{
for(j = 0; j < N ; j++)
{
if(MAX < a[i][j])//比较
{
MAX = a[i][j];
row = i;
colum = j;
}
}
}
printf("MAX = %d , row = %d , colum = %d\n",MAX,i,j);
exit(0);
}
求各行各列的和:
#include <stdio.h>
#include <stdlib.h>
//求4行3列数组的总和及其各列和
#define M 4
#define N 3
int main()
{
int i,j;
int a[5][4] = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}};//拓展为5*4的数列,存储和的值
for(i = 0 ; i < M ; i++)
{ for(j = 0 ; j < N ; j++)
{
a[4][3] += a[i][j];//总和
a[4][j] += a[i][j];//行和
a[i][3] += a[i][j];//列和
}
}
for(i = 0 ; i < 5 ; i++)
{
for(j = 0 ; j < 4 ; j++)
printf("%4d",a[i][j]);//打印
printf("\n");
}
}
矩阵乘积:
#include <stdio.h>
#include <stdlib.h>
#define M 2
#define N 3
#define K 2
int main()
{
int i,j,k;
int a[M][N] = {1,2,3,4,5,6};//两行三列
int b[N][K] = {1,0,0,1,1,0};//三行两列
int c[M][K] = {0};//结果就是两行两列
for(i = 0 ; i < M ; i++)
{ for(j = 0 ; j < K ; j++)
{
for(k = 0; k < N ; k++)
{
c[i][j] += a[i][k]*b[k][j];
}
}
}
for(i = 0 ; i < M ; i++)
{
for(j = 0 ; j < K ; j++)
printf("%d\t",c[i][j]);
printf("\n");
}
}
~
深入理解二维数组:
#include <stdio.h>
#include <stdlib.h>
#define M 2
#define N 3
#define K 2
int main()
{
int i,j;
int a[M][N] = {1,2,3,4,5,6};
printf("a = %p\n",a);//a为首地址
printf("a+1 = %p\n",a+1);//a+1 为行地址+1
for(i = 0 ; i < M ; i++)
{
for(j = 0; j < N ;j++)
{
printf("a[%d][%d] = %p\n",i,j,&a[i][j]);
}
}
}
字符数组
1 定义、初始化、存储特点
【存储类型】 数据类型 标识符 【下标】
char str[N] = {};
单个字符初始化
char str[N] = {'a','b','c'};
用字符串常量初始化
char str[N] = {"a"};
2 输入输出
#include <stdio.h>
#include <stdlib.h>
int main()
{
scanf("%s",str);//%s输入注意数组越界问题,以及scanf遇到空格、换行符、制表符就会输出,造成输入内容不完整
printf("%s",str);
exit(0);
}
3 常用函数
strlen & sizeof(获取长度)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[] = "hello";
printf("%d\n",strlen(str));//strlen打印有效字符的个数(包括空格),以'\0'作为结束标记 结果为 5
printf("%d\n",sizeof(str));//sizeof打印该字符串所占空间的字节数 结果为 6
}
strcpy & strncpy(将字符串拷贝到数组中)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFSIZE 128
int main()
{
char str[BUFFSIZE] = "hello";//初始化数组
strcpy(str,"abcdefg");//将abcdefg字符串拷贝到str数组中,包括'\0',拷贝会将原先的内容完全覆盖,注意越界问题
puts(str);
strncpy(str,"abcdefg",BUFFSIZE);//strncpy与strcpy作用相同,但多了一个size的限制,用来限制输入的字符串的大小, 使用时建议size的大小与数组的大小一致,即size = BUFFSIZE
puts(str);
}
strcat & strncat(连接内容)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFSIZE 128
int main()
{
char str[BUFFSIZE] = "hello";
strcat(str," ");//将空格连接到hello后面的空字符'\0'上
strcat(str,"world!");//将world连接到空格后面
strncat(str," ",BUFFSIZE);//将空格连接到hello后面的空字符'\0'上,
strncat(str,"world!",BUFFSIZE);//将world连接到空格后面,但多了一个size的限制,用来限制输入的字符串的大小, 使用时建议size的大小与数组的大小一致,即size = BUFFSIZE
puts(str);//输出
}
strcmp & strncmp(比较两个字符串的ASCII码大小)(不太懂)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFSIZE 128
int main()
{
char str1[BUFFSIZE] = "hello";
char str2[BUFFSIZE] = "hello";
printf("%d\n",strcmp(str1,str2));//相同为1
char str3[BUFFSIZE] = "helloa";
char str4[BUFFSIZE] = "hello";
printf("%d\n",strcmp(str3,str4));//str3-str4 = 97
char str5[BUFFSIZE] = "hello";
char str6[BUFFSIZE] = "helloa"; //str5-str6 = -97
printf("%d\n",strcmp(str5,str6));
}
单词计数:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int flag = 0,count = 0;
char str[128];
gets(str);
for(i = 0 ; str[i] != '\0'; i++)
{
if(str[i] == ' ' || str[i] == '\t')
flag = 0;
else //如果有字符输入
if(flag == 0)//它上一个字符有空格,就是一个单词的开始
{
count++;
flag = 1;
}
}
printf("the number of count :%d \n",count);
exit(0);
}