矩阵的转置 由于两个矩阵的第二维参数不同,而要打印这两个矩阵,传递参数时就要确定第二维参数,因此要编写两个打印矩阵的函数(每个第二维度不同的矩阵都要写一个),这样就很麻烦。于是,采用另一种方法。由于二维数组在计算机内存储时本质上是个行优先按顺序存储的,因此可以把二维降到一维。第i行第j列元素-->i*n +j。输出函数参考CSDN。
变参函数初体验 va_arg(args, elemType):读取参数,elemType为要读取列表的类型。变参函数的形式:typename func(int argCnt, ...);va_start(args, argCnt): 读取参数列表中第一个参数。其中argCnt表示要读取变参列表中参数的个数;va_list args: 读取参数列表。va_end(args):结束读取操作。
不使用循环及额外定义函数打印1到100 引入变量cnt,并存储在静态存储区。n存在堆栈,每次main函数入栈时,局部变量也入栈。由于全局变量n 存储在静态存储区,main函数压入栈时,n并未入栈。解题思路:使用main函数作为递归函数。代码1的错误分析:输出全部为1.
二分查找的C语言实现 当left <= right时,待搜索数据x 与mid比较,若大于mid;说明x可能在右边被查到,low = mid + 1,若小于mid,可能在左半被查到, high = mid - 1;等于,则返回mid;若left>right,立即返回-1。算法思想:把数组划分成3部分,left, mid, right。为了测试二分查找算法代码是否有问题,写了个产生随机递增的算法。
冒泡排序的实现 算法思想:每趟排序时,比较相邻的两个元素,较大的向后移动,则第一趟排序完成时,最后一个元素为组大元素;下一次比较到第n - 1个元素即可。加了哨兵的冒泡排序比较次数与数组初始状态有关,最坏情况为倒序,需比较n(n-1)/2次;最好情况为顺序,需比较n-1次。
选择排序的实现 共需比较 n-1 + n-2 + n-3 + ... + 1 = n(n-1)/2次,时间复杂度为O(n²)遍历数组,每次遍历寻找未排序部分最小值,与未排序部分首个元素交换,n个元素需要遍历n次。
欧几里得算法 欧几里得算法:两数 a, b 的最大公约数等于 较小数与两数余数的最大公约数。设 r = a %b, 则 a =kb + r (r, , ∈ N*)前提: a > b && a % b!= 0 && a,b ∈N*因为x|a, x|(k*b)所以x|r,即x|(a%b)设 x 同时被 a, b 整除,即 x|a, x|b;所以a,b的最大公约数等于b与a%b的最大公约数。证明过程参考百度百科。
给定一个日期,输出前一天和后一天的日期 必然是分支结构中出现错误,仔细观察发现,由于逻辑与&&优先级比逻辑或||要高,因此先计算month == 11(条件不成立),注意执行完这一步后不是从左到右执行逻辑或,再计算day == 30;在输出后一天时,首先判断是否月底,若不是,说明年月不变,天数直接加1即可;若是说明下一天是月首,需要进一步判断本月是否是12月,如果是说明跨年,年份加1,月份置1,否则年份不变,月份加1.排除bug思路:根据输出可以断定,isMonthEnd()函数里出现了逻辑错误,当天是月首,但判断是否是月底时,返回为True;
判断两个5位数之间所有的回文质数 分两步: 第一步计算这个数是不是质数,判断质数时这里有个技巧,只要判断到n的平方根即可,但是不能用sqrt( n ),因为对一个质数取平方根,然后舍弃小数部分(int)可能是个偶数,而质数本身是个奇数,这就导致了计算错误。可以用 i * i
指向const 对象的指针 指向const 对象的指针可以给指向non-const对象的指针初始化,反之不行。从逻辑上分析,指向non-const对象的指针意味着可修改对象,如果强行给其赋值一个const 对象指针,那么如果可以,就会导致通过non-const对象指针修改const对象,这显然违背了逻辑。int a = 1;const int *p = &a;int *p2 = &a;p = p2; //没有任何问题p2 = p; //编译报错...
拷贝构造函数与拷贝复制函数 当类的成员变量含有指针时,必须编写拷贝构造函数与拷贝赋值函数,否则可能发生内存泄露。#pragma once#ifndef STRING_H_#define STRING_H_#include <string.h>#include <ostream>#define _CRT_SECURE_NO_WARNINGSclass String{private: char* m_data;public: char* get_c_data()const { retu
返回值 VS r返回引用 以及 传引用 VS 传值 准则:尽量使用传引用f而不是直接传递对象目的:减少开销,传引用相当于使用原对象,而传递对象需要拷贝一份。返回值是引用还是对象要看情况而定:不能使用返回引用的情况是:当返回的是一个局部对象时。#ifndef COMPLEX_H_#define COMPLEX_H_#include <ostream>class complex{public: inline double real()const { return re; } inline double imag
C++构造函数的注意事项 Ctor():a(aa),b(bb){}ctor(){ a = aa; b = b;}使用参数列表对成员变量进行初始化,而不是在构造函数体内赋值,这样可以减少开销。Ctor(int a= 0, int b =0){}Ctor(){}无参构造函数与所有参数都有默认值的构造函数不能同时存在无参构造函数与所有参数都有默认值的构造函数不能同时存在,因为编译器无法确认用户到底想调用哪一个构造函数。...
头文件(防卫式声明) 在C/C++头文件中,必须进行防卫式声明,防止头文件重复包含问题。#ifndef __XXXXX__H#define __XXXXX__Hcode block;#endif如果是第一次包含该头文件,则定义宏__XXXXX__H,并包含代码,如果是第二次包含,条件编译指令不通过,不再重复包含。...
Qt使用ODBC连接mysql的步骤 第一步:检测使用MySql Connector检查能否正常连接数据库第二步:把mysql lib目录下的 libmysql.dll 和libmysql.lib放到Qt的对应编译器目录下,我这里是D:\Qt\Qt5.9.0\5.9\msvc2017_64\bin第三步:创建Qt项目,并添加sql模块第四步:连接数据库 QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); db.setHostName(ho.