黑马程序员-[C语言] 第二篇:数组、排序方法总结

本文详细介绍了C语言中的数组概念、存储方式及数组作为参数的使用方法,并深入探讨了指针变量的定义与应用,包括一维数组指针、二维数组指针和字符串指针等内容。
 
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
 C语言第七天知识点:

1. 获取变量地址的方法

1)输出地址用%p 

例如 int=b;

Printf(“%p”,&b);

2)注意:计算机分配内寻到额时候,从高地址向低地止分配,先定义的变量,分配的是高地址,后定义的变量是低地址。

地址分配的时候 不一定是连续的。

3)变量存储细节:低字节存储在低地址高字节存储在高地址

4)变量的地址:变量的首地址(变量在内存中占用的存储单元最小的地址),具体如下图:


 C语言第八天知识点:

1.Char 型常量的存储问题

Sizeof(‘ a ’);

-------->先找到‘a ’的ascii码值 97

-------->把97按照int类型进行存储

-------->把四个字节存储到内存中

Char=‘a’

---------->97

-----------?把97转换为2进制以字符进行存储

----------->把一个字 节存储到内存中

 

2. 数组:一组具有相同数据类型的数据的有序的集合。

1)数组元素:构成数组的数据。

2)数组的下标:是数组元素的位置的一个索引指示。

3)按存储类型分类:

数值数组:用来存放数值

字符数组:用来存放字符

指针数组:用来存放数据的指针

结构数组:用来存放结构类型的数据


4)按维度分类:

一维数组、二维数组、三维数组

 

5)数组作为参数

1.数组元素作为实参使用

2.数组名作为函数的形参或实参使用

一维数组定义:数组的每个元素都不是一个数组

一维数组格式:类型说明符  数组名 [数组长度];

例:int a[3]


6) Int 表示的是数组用来存放int类型的数据 不要理解成a是int类型

注意:

1)数组的长度可以是一个常量,也可以是常量表达式

2)数组名的命名规则严格按照标识符的命名规范

3)数组名不能和其他变量同名

4)数组的长度不可以是一个变量

5)数组的长度可以使用宏定义 例 #define m 3  int a[m]

7)数组的初始化方法:

1)定义的同时进行初始化

  (1)定义的同时进行全部初始化

(2)定义的同时进行部分的初始化未初始化部分被系统初始化为零

2)先定义,后初始化

注意:如果使用先定义后初始化的方式,如果部分数组元素被初始化,系统不会对没有定义的数组元素进行赋值为零。

 

3. 数组的存储方式

1)计算机会给数组分配一块连续的存储空间

2)数组名代表数组的首地址,从首地址位置,依次存入数组的第一个,第二个。——

3)每个元素占用相同的字节数

4)元素间的地址是连续的且从低到高存储

5)数组之间的地址不一定连续且先定义的数组分配在高地址

6)数组名是一个常量代表数组的首地址

 

4. 数组长度的计算

Int a[5];

Int len;

Len=sizeof(a);  表示数组a所占用的总字节数。

则len=5*sizeof(a[0]);

Sizeof(a[0])表示每个int类型的数组元素所占用的字节数。

 

5. 数组名做参数

1)数组名做实参时,形参也必须是相同类型的数组。

2)数组名做实参传递到形参时。实参与形参之间不是值传递而是地址传递。实参数组名将该数组的起始地址传递到形参数组。切实参与形参数组地址指向同一地址空间。

3)数组元素作实参传递到形参时,实参与形参之间是值传递。


C语言第九天知识点总结:

1.冒泡排序:

实现:双层循环:外层循环 表示循环的趟数  i<len-1;里层循环表示比较的次数j<len-1-i。实现代码如下:

<pre name="code" class="vb">
#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a[10];
    printf("请输入10个数字:\n");
    for (int i=0;i<10;i++) {
        scanf("%d",&a[i]);
        printf("\n");
              }
    for (int j=0;j<9;j++) {
        for (int i=0; i<9-j; i++) {
            if (a[i]>a[i+1]){
                int temp =a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
            }
        }
    }
    printf("排序后的10个数字为:\n");
    for (int i=0; i<10; i++) {
        printf("%d\t",a[i]);
       
         }
    return 0;
}

2.选择排序:是一种简单直观的排序算法。原理:首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,在从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。依次类推,直到所有元素均排序完毕。实现:双层循环:外层循8环 表示循环的趟数 i<len-1 里层循环 找出最小数 j=i+1 ;j<len。实现代码如下:

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a[10];
    int i,j;
    printf("请输入10个数字:\n");
    for (int i=0;i<10;i++) {
        scanf("%d",&a[i]);
        printf("\n");
    }
    for (j=0; j<9; j++) {
        for (i=0;i<9; i++) {
            if(a[j]>a[i+1])
                a[j]=a[i+1];
        }
        printf("排序后的10个数字为:\n");
        for (int j=0; j<10; j++) {
            printf("%d\t",a[j]);
        }
    }
    return 0;
}

3. 折半查找:在有序的的表中,取中间元素作为比较对象,若给定值数与中间元素相等,则查找成功;若给定值小于中间元素的数,在中间元素的左半区继续查找。否则在右半区查找。实现代码如下:

<pre name="code" class="vb">#include <stdio.h>

int serchscore(int a[],int key,int len){
    int low=0,high=len-1,mid;
    mid=(low+high)/2;
    while (low<high) {
        {
            if(key>a[mid]){
                low=mid+1;
            }else if(key<a[mid]){
                high=mid-1;
            }else
                return mid;
        }
        return -1;
    }
int main(int argc, const char * argv[]){
    int a[10] = {12,23,32,34,38,45,52,55,60,128};
     int low = serchscore(a,34,10);
    printf("low=%d",low);
    return 0;
}

4. 二维数组:可以看做一个特殊的一位数组,这个一维数组的每个元素又是一个一维数组。

1. 二维数组的定义:二维数组定义与一位数组定义类似,初始化注意事项:   1)  第一位长度可以省略,但是第二维的长度不可以省略;   2)  二维数组的存储方式  :数组的首地址==数组名=&[0]==&[0][0]

   3) 格式:类型说明符 数组名[常量表达式1][常量表达式2];

2. 二维数组的存储

 二维数组是按行存储的,在地址中的分配空间是连续的。

3. 注意:

1)数组名不能和变量名同名

2)数组的长度可以是常量表达式

3)Xcode特有:int m=2,n=2;

               Int [n][m];  //其他编译器可能没有

4)二维数组中第一维可以省略

C语言第十天知识点总结:

1  %s从给定地址开始,一直输出字符,直到遇到\0就停止了;  注意:  如果以%s 输出的话,注意空格问题,如果输入的字符串有空格,则空格之后的字符无法别接收。

2. 输入的字符串长度要小于数组长度。

3. C语言中字符串处理函数有:  puts  gets   strlen  strcpy strcmp  strcat

4. 指针变量的注意事项:      1   1)必须有*   2)指针变量,归根结底还是变量,3) 指针变量不能存放数值或字符。      2   “ * ”的两种用法   1)用于定义,一个指针变量; 2)给指针变量指向的内存空间的内容。 3) 存储指针变量指向的存储空间内容。

C语言第十一天知识点总结:

1.一维数组指针                                                                                                                   注意:(1)数组名不代表整个数组,只代表数组的首元素的地址(是一个常量,若数组名++,是不对的)。(2) “P=a”,的作用是“把a 数组的首元素地址付给指针变量 P”,而不是把数组a各个元素的值付给P。2. 一维指针数组:一个数组元素值为指针则为指针数组,    格式为:类型说明符 *数组名[数组长度];应用:数组的逆序:

</pre><pre name="code" class="objc">#include <stdio.h>
void nixu(int *p,int len){
    int *x,*i,*j,m=(len-1)/2,temp;
    i=p;j=p+len-1;x=p+m;
    for (;i<x; i++,j--) {
        temp=*i;
        *i=*j;
        *j=temp;
    }
}
int main(int argc, const char * argv[]) {
    int i=0,a[10];
    printf("请输入十个数字:以空格隔开\n");
    for (int i=0; i<10; i++) {
        scanf("%d",&a[i]);
    }
    for (int i=0; i<10; i++) {
        printf("您输入的十个数字是:%d\n",a[i]);
    }
    nixu(a,10);
    for (int i=0; i<10; i++) {
        printf("%d\t",a[i]);
    }
    return 0;
}
指针变量之间可以做减法运算,主要为了判断两个指针变量是否连续,或者判断两个指针变量之间相隔几个元素:   具体计算公式为:(地址1-地址2)/sizeof (所指向的数组)。
 关系运算:  如果p1>p  运算结果为1,表示p1在高位,为0,表示p在高位。
3. 二维数组指针: 数组指针变量说明:
    一般形式为:数据类型(*指针变量名)[二维数组列表];
二维数组的行指针和列指针:


4.字符串指针   格式为:char   *变量名=”字符串内容”,(字符串内容是常量),作用是保存一个字符串。    *str=“abc”  str 只是保存了字符串常量的首地址,是一个指针变量。字符串保存在常量区,在常量区保存的数据都只是可读的,不可以改变。
5.二维字符串数组的概念:
        一维字符数组   char  ch[10]={‘a’,’b’};或者  char  ch[]=“abc’;
         二维字符数组  char ch[3][10]={{‘a’,’b’},{‘b’},{‘c’}};  或者 char ch3[3][10]={“abc”,”def”,”erf”};
   字符串类型的指针数组  格式   char  *name[3]={“abc”,”def”};
应用例题:字符串排序:
#include <stdio.h>
#include <strings.h>

void sort(char *name[],int n){
    char  * temp;
    for (int i=0; i<n-1; i++) {
        for (int j=1; j<n; j++) {
            if (strcmp(name[i], name[j])<0) {
                temp=name[i];
                name[i]=name[j];
                name[j]=temp;
            }
        }
    }
}

int main(int argc, const char * argv[]) {
    char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Compter Design"};
    int n=5;
    sort(name, n);
    for (int i=0; i<5; i++) {
        printf("%s\n",name[i]);
    }
    return 0;
}


6. 有关二维数组a的有关指针:




<think>好的,我现在需要帮用户寻找蓝桥杯竞赛C/C++ C组的备赛资料和指导。用户提到了教程、练习题和解题技巧,所以我得覆盖这几个方面。 首先,用户提供的引用里提到了几个关键点。引用[1]提到用户有C语言基础,通过B站黑马程序员学C++,跟着y总学语法和蓝桥杯辅导课。这说明用户可能对视频教程比较感兴趣,尤其是B站资源。我应该推荐一些B站的优质课程,比如黑马程序员的C++教程和y总的辅导课,这些在引用[1]里已经提到过,可以作为重点推荐。 引用[2]和[3]都强调了真题的重要性,用户需要多练习官网题库的真题。因此,练习题部分应该包括蓝桥杯官网的真题,以及一些可靠的刷题平台,比如洛谷、LeetCode等。同时,引用[3]提到算法知识点,可能需要分阶段学习,比如基础语法、算法强化、真题模拟,这可以作为备赛路径的建议。 引用[4]详细讨论了C/C++解题的小技巧和注意事项,比如输入输出优化、调试技巧。这部分内容对用户来说非常实用,应该整理出来,比如使用快读快写函数、数组大小调整、模块化代码等。同时,引用里提到的调试方法,如断言和测试用例,也值得强调。 接下来,我需要考虑用户可能的深层需求。用户可能对如何高效安排学习时间、如何平衡语法学习和算法训练有疑问。因此,备赛路径需要分阶段,从基础到进阶,再到模拟实战,这样用户能有一个清晰的学习计划。 另外,解题技巧方面,用户可能容易在输入输出或调试上浪费时间,所以需要具体的方法,比如预处理指令、避免常见错误(如数组越界)。同时,算法模板的积累也很重要,比如排序、DFS/BFS,这些高频考点需要重点练习。 最后,生成的相关问题需要围绕用户可能进一步的需求,比如如何选择学习资料、时间规划、算法学习顺序、真题使用技巧等。这样用户如果有更多疑问,可以通过这些问题找到答案。 总结一下,回答结构应该是:备赛资源(教程、书籍、题库)、备赛路径(分阶段)、解题技巧(输入输出、调试、算法模板)、注意事项,然后相关问题。需要确保每个部分都引用提供的资料,并自然添加引用标记。同时,语言要口语化,避免使用专业术语过多,保持自然流畅。</think>### 蓝桥杯C/C++ C组备赛指南 根据你的需求,结合蓝桥杯竞赛特点和C/C++组高频考点,整理以下资源与建议: --- #### 一、**备赛资源推荐** 1. **教程与课程** - **B站黑马程序员C++教程**:适合从C语言过渡到C++的选手,覆盖基础语法和STL库(如`vector`、`string`等)[^1]。 - **y总(AcWing)蓝桥杯辅导课**:针对算法强化,包含贪心、动态规划、搜索等核心算法,附带真题解析。 - **《算法竞赛入门经典(第2版)》**:系统讲解算法设计与实现,适合打牢基础。 2. **刷题平台** - **蓝桥杯官方题库**:优先完成历年真题(如第十届至第十三届),熟悉题型和难度分布[^2][^3]。 - **洛谷/LeetCode**:专项训练高频算法(如DFS/BFS、排序、数论)。 - **AcWing蓝桥杯题单**:按知识点分类,适合针对性突破[^1]。 3. **技巧与经验** - **输入输出优化**:使用`scanf/printf`替代`cin/cout`,或添加`ios::sync_with_stdio(false)`加速[^4]。 - **调试技巧**:利用断言(`assert`)和模块化代码减少错误,编写测试用例验证边界条件。 --- #### 二、**备赛路径规划** 1. **阶段一:基础语法与算法入门(1-2个月)** - 学习C++11特性(如`auto`、`lambda`)和STL容器。 - 掌握基础算法:排序(快速排序、归并排序)、二分查找、简单动态规划。 - 推荐练习:蓝桥杯模拟题、《算法笔记》例题。 2. **阶段二:算法强化与真题模拟(2-3个月)** - 重点突破高频考点: - **数论**:最大公约数($gcd$)、质数筛法、快速幂 - **动态规划**:背包问题、最长公共子序列 - **搜索**:DFS剪枝、BFS最短路径 - 每周完成2-3套真题,限时3小时模拟考试环境。 3. **阶段三:冲刺与查漏补缺(1个月)** - 复盘错题,整理高频算法模板(如并查集、线段树)。 - 学习优化技巧:记忆化搜索、状态压缩DP。 --- #### 三、**解题技巧与注意事项** 1. **输入输出优化** - 使用快读函数处理大规模数据: ```cpp inline int read() { int x = 0; char c = getchar(); while (c < '0' || c > '9') c = getchar(); while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x; } ``` - 输出时避免频繁刷新缓冲区,用`'\n'`替代`endl`。 2. **代码调试** - 使用`#define DEBUG`预处理指令快速切换调试模式: ```cpp #ifdef DEBUG freopen("input.txt", "r", stdin); #endif ``` - 避免数组越界:全局数组大小设为$10^6+5$,局部数组谨慎使用。 3. **高频算法模板** - **快速排序**: ```cpp void quick_sort(int q[], int l, int r) { if (l >= r) return; int i = l-1, j = r+1, x = q[(l+r)>>1]; while (i < j) { do i++; while (q[i] < x); do j--; while (q[j] > x); if (i < j) swap(q[i], q[j]); } quick_sort(q, l, j), quick_sort(q, j+1, r); } ``` --- #### 四、**注意事项** 1. **比赛规则**:注意代码提交格式(如`main`函数返回值必须为0)。 2. **时间分配**:简单题优先(如填空题、编程题前3道),难题留到后期。 3. **代码规范**:变量命名清晰,添加必要注释(如复杂逻辑块)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值