黑马程序员C语言教程:MFC界面分屏操作

2024-07-31

黑马程序员C语言教程:MFC界面分屏操作(精选3篇)

1.黑马程序员C语言教程:MFC界面分屏操作 篇一

C语言二维数组的定义和引用

7.1.1二维数组的定义

前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的,因此C语言允许构造多维数组。多维数组元素有多个下标,以标识它在数组中的位置,所以也称为多下标变量。本小节只介绍二维数组,多维数组可由二维数组类推而得到。

二维数组定义的一般形式是:类型说明符 数组名[常量表达式1][常量表达式2]

其中常量表达式1表示第一维下标的长度,常量表达式2 表示第二维下标的长度。例如:

int a[3][4];说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3×4个,即:

a[0][0],a[0][1],a[0][2],a[0][3]

a[1][0],a[1][1],a[1][2],a[1][3]

a[2][0],a[2][1],a[2][2],a[2][3] 二维数组在概念上是二维的,即是说其下标在两个方向上变化,下标变量在数组中的位置也处于一个平面之中,而不是象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。如何在一维存储器中存放二维数组,可有两种方式:一种是按行排列,即放完一行之后顺次放入第二行。另一种是按列排列,即放完一列之后再顺次放入第二列。

在C语言中,二维数组是按行排列的。即,先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节)。

7.1.2二维数组元素的引用

二维数组的元素也称为双下标变量,其表示的形式为:

数组名[下标][下标] 其中下标应为整型常量或整型表达式。例如:

a[3][4] 表示a数组三行四列的元素。

下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。

【例7.6】一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。

可设一个二维数组a[5][3]存放五个人三门课的成绩。再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。编程如下:

main(){

int i,j,s=0,average,v[3],a[5][3];

printf(“input scoren”);

for(i=0;i<3;i++){

for(j=0;j<5;j++)

{ scanf(“%d”,&a[j][i]);

s=s+a[j][i];}

v[i]=s/5;

s=0;

}

average =(v[0]+v[1]+v[2])/3;

printf(“math:%dnc languag:%dndbase:%dn”,v[0],v[1],v[2]);

printf(“total:%dn”, average);}

程序中首先用了一个双重循环。在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内循环后再把该累加成绩除以5送入v[i]之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组之中。退出外循环之后,把v[0],v[1],v[2]相加除以3即得到各科总平均成绩。最后按题意输出各个成绩。

7.1.3二维数组的初始化

二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。例如对数组a[5][3]:

按行分段赋值可写为:

int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} };按行连续赋值可写为:

int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};

这两种赋初值的结果是完全相同的。

【例7.7】

main(){

int i,j,s=0, average,v[3];

int a[5][3]={{80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85}};

for(i=0;i<3;i++)

{ for(j=0;j<5;j++)

s=s+a[j][i];

v[i]=s/5;

s=0;

} average=(v[0]+v[1]+v[2])/3;

printf(“math:%dnc languag:%dndFoxpro:%dn”,v[0],v[1],v[2]);

printf(“total:%dn”, average);

}

对于二维数组初始化赋值还有以下说明:

可以只对部分元素赋初值,未赋初值的元素自动取0值。

例如:

int a[3][3]={{1},{2},{3}};是对每一行的第一列元素赋值,未赋值的元素取0值。赋值后各元素的值为:0 0

0 0

0 0

int a [3][3]={{0,1},{0,0,2},{3}};赋值后的元素值为:

0 1 0

0 0 2

0 0 如对全部元素赋初值,则第一维的长度可以不给出。

例如:

int a[3][3]={1,2,3,4,5,6,7,8,9};可以写为:

int a[][3]={1,2,3,4,5,6,7,8,9};

数组是一种构造类型的数据。二维数组可以看作是由一维数组的嵌套而构成的。设一维数组的每个元素都又是一个数组,就组成了二维数组。当然,前提是各元素类型必须相同。根据这样的分析,一个二维数组也可以分解为多个一维数组。C语言允许这种分解。

如二维数组a[3][4],可分解为三个一维数组,其数组名分别为:

a[0] a[1] a[2] 对这三个一维数组不需另作说明即可使用。这三个一维数组都有4个元素,例如:一维数组a[0]的元素为a[0][0],a[0][1],a[0][2],a[0][3]。必须强调的是,a[0],a[1],a[2]不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。

2.黑马程序员C语言教程:MFC界面分屏操作 篇二

16、要想共享初始化的过程,可以先定义一个共享成员函数,然后每个构造函数都调用之。

17、C++提供的默认构造函数是个无参构造函数,它仅负责创建对象,而不做任何初始化工作。只要一个类定义了一个构造函数,C++就不再提供默认的构造函数。(如果此时还想要无参构造函数,则需要自己定义)

与变量定义类似,在用默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象的位模式全为0,否则对象值是随机的。创建对象的唯一途径是调用构造函数。

静态对象只被构造一次,所有全局对象都在主函数main()之前被构造。

18、面向对象程序设计主要是两方面:面向对象应用程序设计,类库的设计。面向对象程序设计的关键是如何抽象和分类。

19、全局变量、静态变量、常量存放在全局数据区,所有类成员函数和非类成员函数代码存放在代码区,为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区,余下的空间都被作为堆区。

void* malloc(size_t);和void free(void*);在头文件malloc.h中声明。而操作符new和delete是C++的一部分,无须包含头文件,它们都是从堆中分配和释放内存块,但是具体操作上两者有很大的区别。

操作堆内存时,如果分配了内存,就有责任回收它,否则运行的程序将会造成内存泄露,这与函数中栈区分配局部变量有本质的区别。

从C++来说,不使用malloc()函数一个原因是,它在分配空间的时候不能调用构造函数。

类对象的建立是分配空间,构造结构及初始化的三位一体,它们统一由构造函数来完成。而new和delete在创建对象和删除对象时,便同时调用构造函数和析构函数。

定义对象数组,在生成对象时,依次调用构造函数(如依次生成ps[0],ps[1],ps[2]......),由于分配数组时,new的格式是类型后面跟[元素个数](student* ps=new student[10]),不能再跟构造函数参数,所以从堆上分配对象数组,只能调用默认的构造函数,不能调用其它任何构造函数,如果该类没有默认的构造函数,则分配对象数组失败。Delete[] ps告诉C++将要该指针指向的是一个数组,如果在[]中填上了长度信息,C++将忽略。20、拷贝构造函数

当构造函数的参数为自身类的引用时,这个构造函数称为拷贝构造函数。拷贝构造函数的功能是用一个已有对象初始化一个正在建立的同类对象。拷贝构造函数定义形式如下: Student(student& s)

27、C++基础笔记(一)墨涵天地

Person p1;

p2=p1;

27、C++基础笔记(一)墨涵天地

27、C++基础笔记(一)墨涵天地

在创建对象p2时,对象p1被复制给了p2,同时资源也作了复制,此时p1和p2指向不同的资源,这称为深拷贝。

27、C++基础笔记(一)墨涵天地

如果你的类需要析构函数来析构资源,则它也需要一个拷贝构造函数。C++提供的默认函

数只是对对象进行浅拷贝复制。如果对象的数据成员包括指向堆空间的指针,就不能使用这种拷贝方式,要自己定义拷贝构造函数,为创建的对象分配堆空间。

21、静态成员

这种属于类的一部分,但既不适用于普通成员函数,也不适用于全局变量表示的数据,我们用静态成员来表示。

一般情况下,我们在类的内部实现中对静态数据成员进行定义(在类的内部实现中分配空间和初始化)。

Int student::noOfstudent=0;静态数据成员一般用于:

标志一个事件的发生与否,某个特定的指针,变化的对象等。

静态成员函数定义是类的内部实现,属于类的一部分,定义位置同一般成员函数。与静态数据成员一样,静态成员函数与类相联系,不与类的对象相联系,所以访问静态成员函数时,不需要对象。如果用对象去引用静态成员函数,只是用其类型。

#include using namespace std;class Student { public: static int number(){ return noOfStudents;

} protected: char name[40];static int noOfStudents;};int Student::noOfStudents=1;int main(){ Student s;cout<

********************************* class Sc { public: void nsfn(int a);//类同声明成Sc::nsfn(Sc* this,int a)

static void sfn(int a);//无this指针 //...};void f(Sc& s){ s.nsfn(10);//C++编译成Sc::nsfn(&s,10)s.sfn(10);//C++编译成Sc::sfn(10)}

3.黑马程序员C语言教程:MFC界面分屏操作 篇三

理命令详解

作为一枚C/C++程序猿,在我们编写和查看C/C++源代码的过程中会遇到各种编译指令,这些指令称为预处理命令。预处理命令虽然不是C/C+的一部分,但却扩展了C程序的设计环境,下面传智播客C/C+培训专家将向大家介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。

ANSI标准定义的C语言所有预处理命令均以符号#开头,比如我写程序时常用的:

#define,#undef,#include,#if,#else,#elif,#endif,#ifdef,#ifndef, #error 1.#define和 #undef 宏定义命令的一般形式为:

#define[MacroName][MacroValue],示例如下: #defineITHEIMA 传智播客黑马程序员

在源程序中每次遇到ITHEIMA时,均以定义的值传智播客黑马程序员代换它。

 在使用该宏时,有以下几点注意事项:

 该语句没有分号。在标识符和串之间可以有任意个空格。 定义宏的时候,可以使用之前已经定义好的宏。

 如果串长于一行,可以在该行末尾用一反斜杠续行。

#defineLONG_STRING“good good study,day day up!”  在定义宏标识符时,字母一般需要大写。 预处理运算符的使用:

 #--该符号是“字符串化”的意思,出现在宏定义中的#是把跟在后面的参数转换成一个字符串

#define ERROR_LOG(module)

fprintf(stderr, “error: ”#module“n”)ERROR_LOG(“add”);转换为 fprintf(stderr,“error: ”add“n”);ERROR_LOG(devied =0);转换为 fprintf(stderr,“error: devied=0n”); ##--是连接符号,将多个串连接到一起。char *szStr = “传播播客_黑马程序员”;#define ITCAST(exp)cout <

2.#include 命令#i nclude使编译程序将另一源文件嵌入带有#include的源文件,被读入的源文件必须用双引号或尖括号括起来。例如:

#include“stdio.h”或者#include 这两行代码均使用C编译程序读入并编译用于处理磁盘文件库的子程序。将文件嵌入#i nclude命令中的文件内是可行的,这种方

式称为嵌套的嵌入文件,嵌套层次依赖于具体实现。

 如果显式路径名为文件标识符的一部分,则仅在那些子目录中搜索被嵌入文件。

例如: #include “../include/head.h”

 如果文件名用双引号括起来,则首先检索当前工作目录。如果未发现文件,则在命令行中说明的所有目录中搜索。如果仍未发现文件,则搜索实现时定义的标准目录。例如: include “head.h”

 如果文件名被尖括号括起来,则首先在编译命令行中的目录内检索。如果文件没找到,则检索标准目录,不检索当前工作目录。

例如: include 3.条件编译命令:#if、#else,#elif及#endif #define MAX 80 #include using namespace std;int main(){ #if MAX > 99 cout<<“MAX is bigger than 99”< #elif MAX > 90 cout<<“MAX is bigger than 90”< #else cout<<“MAX is smaller than 90”< #endif return 0;}  #if的一般含义是如果 #if后面的常量表达式为true,则编译

它与#endif之间的代码,否则跳过这些代码。命令#endif标识一个#if块的结束。

跟在#if后面的表达式在编译时求值,因此它必须仅含常量及已定义过的标识符,不可使用变量。表达式不许含有操作符sizeof(sizeof也是编译时求值)。

 #else命令的功能有点象C语言中的else;#else建立另一选择(在#if失败的情况下)。注意,#else属于#if块。

 #elif命令意义与ELSE IF 相同,它形成一个if else-if阶梯状语句,可进行多种编译选择。#elif 后跟一个常量表达式。如果表达式为true,则编译其后的代码块,不对其它#elif表达式进行测试。否则,顺序测试下一块。

4.#error 命令#error强迫编译程序停止编译,主要用于程序调试。该指令使预处理器发出一条错误消息,该消息包含指令中的文本.这条指令的目的就是在程序崩溃之前能够给出一定的信息。

5.#ifdef 和 #ifndef 条件编译的另一种方法是用#ifdef与#ifndef命令,它们分别表示“如果有定义”及“如果无定义”。# ifdef的一般形式是:

# ifdef macroname statement sequence

#endif #ifdef与#ifndef可以用于#if、#else,#elif语句中,但必须与一个#endif。

define MAX 91 #include using namespace std;

上一篇:性格特点词语 四字下一篇:省州督导工作汇报材料