C语言总结 数组

一一.需要掌握的基本知识

  1. 数组的特征(名字和大小),数组名记录的是一个连续储存区的首地址

定义

引用(地址和元素),有时候将整个数组传入函数但是不想改变数组元素的值,那么就需要采用const 来修饰形参数组例如int f(const int a[])

  1. 初始化的方法

全部初始化,

部分初始化(剩下的元素数值都是0,意思是说如果是整数数组那么值为0,如果是字符数组那么就是‘\0’),

根据初值确定数组长度(这种写法只能在定义数组的时候写)同时可以用到sizeof来输出元素的个数,

注意,1.有时候数组也需要先初始化为0一下,不然也可能出现随机初始化

int a[10]={0};

2.后面语句的赋值只能对应某个元素进行赋值,所以如果要对整个数组进行初始化那么只能在定义的时候

补充:当数组声明有static的关键字修饰即使没有初始化系统也会初始化为0,例如static a[3]

二维数组

初始化:

1,按行全部初始化

2.按行顺序初始化

3.顺序初始化

  1. 根据初始化确定行数,即第一维的行数可以不确定,但是第二维的列数必须确定

即int a[][3]

(ps.在函数定义形参时也需要确定列数)

字符数组

字符数组的引用for(i=0;(a[i]=getchat())!=’\n’;i++)

字符数组的初始化:

1.用字符进行初始化,注意‘\0’,有时候在函数中对字符数组进行处理也需要注意在末尾再加一个数值为0的元素

2.用字符串进行初始化(用到大括号和双引号,注意,大括号可以省略)

3.根据初值确定字符串的长度

字符数组的输入输出

可以有一个

While((str[i++]=getchar())!=’\n’)来一个个输入(一定注意优先级,所以需要大括号)

注意:格式化输入的时候遇到‘ ’则结束输入,但是gets(str)函数则是遇到‘\n’的时候结束输入,

但是在VS中gets 的用法是gets(str,num)(直接这么用就可以了)注意,只能输入num-1个字符

补充一个fgets (str,字符数,*fp或者stdin)

在以%s形式输出的时候如果规定长度,那么注意是字符的个数,并且不包括‘\0’

注意:

  1. scanf 和gets还有一个区别在于前者不可以将‘\n’赋值到字符数组的元素中,但是后者可以,所以有时候会在gets前加一个getchar 来消掉上一次输入剩下的'\n',还有一点就是puts 在输入的时候自带换行符,注意fgets的话会自动添加一个空字符,所以实际上只会读取n-1个字符

  1. 如果是按照字符进行初始化则需要最后一个元素为‘\0’,不然则需要用一个循环来一个个输出字符数组的元素,否则就会出现问题

3.字符串的大小=字符串的长度=字符串所占的空间>=字符串的有效长度

常用的字符串处理函数

Strcpy(str,”HELLO”); char *strcpy(char *s1,char *s2)返回值是s1的地址

注意,字符串无论如何都不可以用=来赋值,可以这么理解:数组名表示的指针所指向的地址是确定的,不可以变化

Strlen(str);可以计算出字符数组有效字符的个数

Strcat(char *s1,char *s2),(strcpy类似)即将后面那个字符串加到前面字符串的后面,必须保证前面那个字符串足够大

Strcmp(char *s1,char *s2),如果前者大于后者那么就返回整数(注意:比较的是元素的数值)

然后我补充一下学习通上我错的题

在判断对数组初始化是否正确时不仅要判断初始化的方式还需要判断是否出现了越界的情况

注意:字符数组之间不能直接进行比较,所以必须要用到strcmp 函数

注意:puts函数自带换行功能,同时gets函数可以将一个换行符输入进对应的字符数组中,因此有时需要在gets函数前加一个getchar来消掉上一次在stdin中输入后的换行符

在计算一个字符数组的大小的时候需要注意转义字符

尤其是‘\0’,’\n’,’\t’,\\’,

容易忘记的有’\’’ ,’\”’, ‘\ddd’, ‘\xhh’

读程序题一定注意内外循环

常考的编程题目

升序冒泡排序,插入排序

冒泡排序
void cmp(int a[],int n)
{
    int i,j,t;(注意:如果全局变量未初始化,则结果等于0)
    for(i=0;i<n-1;i++)//每一次循环都可以做到时最大的那个数放在最后
        for(j=0;j<n-i-1;j++)
        {
            if(a[j]>a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}//交换顺序
        }
}
注意:对于j的初始值还可能是别的,但是可以知道是在冒泡排序即可,
冒泡排序的特点:1.相邻的两个元素进行比较,2.这一个函数中的i和j都代表循环的次数

选择排序(Selection sort)
void selection sort(int a[],int n)
for(i=1;i<n-1;i++)
{
    for(j=i+1;j<n;j++)
     if(a[i]>a[j]
    {
      t=a[i];
     a[i]=a[j];
     a[j]=t;
    }//这个地方是通过交换整个元素来排大小
有的地方是通过交换下标
for =(i=1;i<n;i++)
{
   k=i;
   for(j=i+1;j<n;j++)
    if(a[j]<a[k])k=j;
    if(i!=j){t=a[i];a[i]=a[k];a[k]=t}
}
//这个方法与上面那个不同的是上面那个一旦看到比i后面小的数则进行元素的交换,但是这个是先交换下标的数值,最后找到i后面最小的那个元素,然后再交换
注意:
无论如何,选择排序在于先确定一个数,然后将后面的数与其逐个比较

关于矩阵

矩阵的乘法
首先是三个整数M、N、P(1<M,N、P<10),代表矩阵A是M行N列,B是N行P列,C是M行P列。
void f(int a[][11], int b[][11], int c[][11], int m, int n, int p)//这里的11是乱写的,但是需要注意二维数组的列数不可以大于11
{
    int i, j;
    int t;
    for (i = 0;i < m;i++)//C的行数
    {
        for (j = 0;j < p;j++)//C的列数
        {
            for (t = 0;t < n;t++)//剩下的那个数
            {
                c[i][j] += a[i][t] * b[t][j];
            }
        }
    }


}

矩阵a:

1 2 3
3 2 2
2 1 2

矩阵b:

2 2
3 1
2 1

a矩阵是3 * 3(3行3列)的矩阵,b矩阵是3 * 2(3行2列)的矩阵,满足第一个矩阵的列数等于第二个矩阵的行数。那我们就可以相乘了

矩阵的输出
蛇形矩阵
例如1 2 3
    6 5 4
for (i = 1, f = 0;i <= n * n;i++)
    {
        if ((i-1) % n == 0)f++;//表示首先判断是不是重新开始了一行
        if (f % 2 != 0)
        {
            a[i - 1] = i;//如果是奇数行,那么就按照顺序赋值
        }
        if (f % 2 == 0)
        {
            a[i - 1] = f * n - ((i-1) % n);//如果是偶数行,那么就要吧把思维转一下
        }

    }
螺旋矩阵
例如
001 002 003 004 005
016 017 018 019 006
015 024 025 020 007
014 023 022 021 008
013 012 011 010 009
void fang(int a[][100], int n)
{
    int i, j, start, k, end, num = 1;
    start = 0;end = n;k = n / 2;
    while (k > 0)
    {
        for (j = start;j < end;j++)
        {
            a[start][j] = num;num++;
        }
        for (i = start + 1;i < end;i++)
        {
            a[i][end-1] = num;num++;
        }
        for (j = end - 2;j >= start;j--)
        {
            a[end-1][j] = num;num++;
        }
        for (i = end - 2;i > start;i--)
        {
            a[i][start] = num;num++;
        }
        k--;
        start++;
        end--;
    }
    if (n % 2)a[n / 2][n / 2] = n * n;
}//这个地方就真的是按照1~n*n赋值,但是对下标进行了处理

统计一个句子有几个单词

    for(i=0;(c=str[i])!=’\0’;i++)
    if(c==’ ‘)word=0;//则表示下一个字符有可能是单词
    else if((c>=’A’&&c<=’Z’||c>=’a’&&c<=’z’)&&word=0)
    //这样可以避免重复计数,意思是说现在的这个字符是字母且上一个字符是空格
    {num++,word=1};

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值