C++第二章new
- 格式:ppt
- 大小:1.08 MB
- 文档页数:134
《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例第01 篇基础程序设计01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}03 8只LED左右来回点亮/* 名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){for(i=0;i<7;i++)P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。
1. new 不但分配对象空间, 还会在分配后调用对象的构造函数,需要手动使用delete来调用析构函数释放空间,而malloc 只是分配, 不构造:class A{public:A(): m_value(0){}//构造函数public:int m_value;};struct B{Int a;};A *pb1 = new A;Struct B *pb2 = (B *)malloc(sizeof(B));pb1 因为被new 调用了构造函数, 所以pb1->m_value == 0, pb2 的构造函数没有被调用, 所以pb2->m_value 的值不确定(即未初始化).2. new 分配时要指定类型, 是类型安全的; 而malloc 返回的是void *, 类型不安全; 类型不安全的东西在C++ 里是不被提倡的!3.引用只是别名不能作为指针来直接使用,&p=new int;是错误的,但是可以定义如下:int *p=new int;int &rp=p;这样的是rp为指针变量p的别名,*rp就是指针变量p所指向的内容。
4.指针可以指向不同的地址,但是引用不能,它只能指向一个,如:int *p=new int;//引用必须要为对象int a,b;p=&a;p=&b;可以使用。
Int a,b;Int &rt=a;&rt=b;会出现错误。
指针不用初始化,但是引用必须初始化。
int &ra;&ra=a;会报错。
引用的一定是对象,否则会出错如:int *p;int &rp=p;会出错。
5.引用只能在块中使用,不能出块。
如:{int a;int &ra=a;ra=9;}ra=10;//出错,因为出了定义引用的块,他只能在相应的{}中使用。
6.const A *const(cost A *const one)中的各个const的意义如下:(1):表示返回的指针值的对象是不能修改的(2):表示返回的指针是不可以修改的(3):表示指针变量one所指的内容是不可以修改的(4):表示指针变量one是不可以修改的。
c语言new的用法在C语言中,没有内置的new关键字用于动态分配内存。
C 语言中通常使用malloc()函数来动态分配内存,并使用free()函数来释放已分配的内存。
malloc()函数的用法:```#include <stdlib.h>// 分配n个字节的内存空间,并返回一个指向分配内存起始位置的指针void* malloc(size_t size);```malloc()函数使用size_t类型的参数指定要分配的字节数。
成功分配内存后,返回一个指向分配内存起始位置的指针。
如果分配失败,malloc()函数将返回NULL。
示例:```c#include <stdio.h>#include <stdlib.h>int main() {int* p = (int*)malloc(sizeof(int)); // 分配一个int类型的内存空间if (p != NULL) {*p = 10;printf("Value of p: %d\n", *p);free(p); // 释放内存}return 0;}```另外,可以使用calloc()函数来分配并初始化内存,与malloc()函数类似:```cvoid* calloc(size_t num, size_t size);```calloc()函数接受两个参数,分别是要分配内存的数量和每个元素的大小。
它会分配num个元素的内存,并将每个元素初始化为0。
示例:```c#include <stdio.h>#include <stdlib.h>int main() {int* arr = (int*)calloc(5, sizeof(int)); // 分配5个int类型的内存空间,并初始化为0if (arr != NULL) {for (int i = 0; i < 5; i++) {printf("Value at index %d: %d\n", i, arr[i]);}free(arr); // 释放内存}return 0;}```请注意,使用malloc()或calloc()分配的内存必须使用free()函数进行释放,以避免内存泄漏。
C语言练习题库本题库仅供平时练习,最后考试类型与下列题型类似。
1.将所有的水仙花数保存到维数组a中。
(所谓水仙花数是指一个三位数,其各位数字立方和等于该数本身。
例如:153=1*1*1+5*5*5+3*3*3)2. 按下面的公式求sum的值。
sum = 1 - 2 + 3 - 4 + 5 - 6 + …… + 99 – 1003.编写代码,实现冒泡排序,并要求:(1)在有序的数组中,接着插入一个元素,新数组仍然有序(2)在数组中删除一个元素,新数组仍然有序(3)对该数组进行逆序存放4. 编写程序实现以下功能,能够将下面所示的6*6的二维矩阵读入并存储到二维数组中,并求其对角线之和,以及最大数,并输出最大数所在的行列下标。
35 1 6 26 19 243 32 7 21 23 2531 9 2 22 27 208 28 33 17 10 1530 5 34 12 14 164 36 29 13 18 115.对任意输入的5个字符数组进行排序比如:输入abc def fdc ccc efg得到abc ccc def efg fdc6. 求2个数组的交集输入{5,6,7,9,10}{2,3,4,5,6}得到{5,6}7.求[m,n]之间既不能被7整除也不能被5整除的整数之和,m和n 的值由键盘输入。
例如,如果m和n的值分别为10和20,则计算结果为:106。
8.求字符串的长度并输出。
例如,当字符串1为"This Is a c Program"则应输出:Result is: 199.将字符串中所有的大写字母转换为小写,其它字符不变(不使用转换函数)。
例如,当字符串为"This Is a c Program"输出:"this is a c program"10.给学生评定成绩,若学生成绩在60-69则输出“及格”,70-89分为“良好”;90-100分为“”优秀,60分一下为“不及格”,分别用if-else语句和switch语句编程实现。
C语言拓展训练编程题new选择结构(1)编程判断输入整数某的正负性和奇偶性。
(2)已知银行整存整取存款不同期限的月息利率分别为:0.63%期限一年0.66%期限=年月息利率=0.69%期限三年0.75%期限五年0.84%期限八年要求输入存钱的本金和期限,求到期时能从银行得到的利息与本金的合计。
(3)通过键盘输入字符,将输入的字符分为控制、数字、大写字母、小写字母和其他字符等五类。
(4)简单计算器。
请编写一个程序计算表达式:datalopdata2的值。
其中op为运算符+、—、某、/。
(5)输入年份year和月month,求该月有多少天。
判断是否为闰年,可用如下C语言表达(6)对输入的行、单词和字符进行计数。
我们将单词的定义进行化简,认为单词是不包含空格、制表符(\\t)及换行符的字符序列。
例如:“a+b+c”,认为是1个单词,它由5个字符组成。
又如:“某yabc”,为2个单词,6个字符。
(7)从键盘输入任意的字符,按下列规则进行分类计数。
第-类'0','1','2','3','4','5','6','7','8','9'第=类'+','-','某','/','%','='第三类其它字符当输入字符'\\'时先计数,然后停止接收输入,打印计数的结果。
(8)输入10个整数,求其中正数的个数及平均值,精确到小数点后两位。
(9)已知一个首项大于0的等差数列的前四项和为26,前四项的积为880,求此数列。
(10)输入a、b、c、d四个整数,求最小值min和最大值ma某。
(11)编写程序,输入三角型的三条边长,求其面积。
注意:对于不合理的边长输入要输出数据错误的提示信息。
循环结构(1)从键盘输入十个整数,求这十个整数之和。
(2)从键盘中读入一系列字符,直到输入字母“a”时才停止。
(3)对输入的行和字符进行计数一行是以一个回车符(’\\n’)作为行结束标记的,这样在程序中可以通过搜索’\\n’对行进行计数。
当输入[CTRL+D]时表示文件输入结束,停止计数。
c语言new:C++的new“new”是C++的一个关键字,同时也是操作符。
关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。
new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。
当然,如果我们创建的是简单类型的变量,那么第二步会被省略。
假如我们定义了如下一个类A:class A{int i;public:A(int _i) :i(_i*_i) {}void Say() { printf("i=%dn", i); }};//调用new:A* pa = new A(3);那么上述动态创建一个对象的过程大致相当于以下三句话(只是大致上):A* pa = (A*)malloc(sizeof(A));pa->A::A(3);return pa;虽然从效果上看,这三句话也得到了一个有效的指向堆上的A对象的指针pa,但区别在于,当malloc失败时,它不会调用分配内存失败处理程序new_handler,而使用new的话会的。
因此我们还是要尽可能的使用new,除非有一些特殊的需求。
new的三种形态到目前为止,本文所提到的new都是指的“new operator”或称为“new expression”,但事实上在C++中一提到new,至少可能代表以下三种含义:new operator、operator new、placement new。
new operator就是我们平时所使用的new,其行为就是前面所说的三个步骤,我们不能更改它。
但具体到某一步骤中的行为,如果它不满足我们的具体要求时,我们是有可能更改它的。
三个步骤中最后一步只是简单的做一个指针的类型转换,没什么可说的,并且在编译出的代码中也并不需要这种转换,只是人为的认识罢了。
但前两步就有些内容了。
new operator的第一步分配内存实际上是通过调用operator new来完成的,这里的new实际上是像加减乘除一样的操作符,因此也是可以重载的。