c/c++基础知识,易错知识总结(一)

0914打卡~

今天是在北邮上课的第一天,学的是“信息检索与信息抽取”,害,还是英文教学,感觉还不错!

今天计划:过一遍编程基础知识,所以今日打卡内容:c/c++基础知识,易错知识总结。

1.在累加时,注意初始化0
2.排序的方法:
冒泡排序:比较相邻俩元素,每趟排序,将最大的放到后面,俩层循环,第一层决定趟数u,第二层决定**每行前面的(len-1-i)**不确定大小的去排序。

void bubble_sort(int a[],int len)
{
 int t;
 int i,j;
 for(i=0;i<len-1;i++)//最后一层只有一个,不需要在进行排序 
 {
  for(j=0;j<len-1-i;j++) 
  {
   if(a[j]>a[j+1])
   {
    t=a[j];
    a[j]=a[j+1];
    a[j+1]=t;
   }
  }
 }
}

选择排序:
先通过比较将最小的数找出来,在将剩余的数找出最小的,循环排序。(比较简单)

插入排序:
每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕,从第一个开始固定,之后一个一个围绕已排好的插进来。


```cpp
void insert_sort(int a[],int len)
{
 int t,m;
 int i,j;
for(i=0;i<len;i++)
 {
   m=a[i];
  for(j=i+1;j<=len-1;j++) 
  {
   if(a[j]<m)
   {
    t=a[j];
    a[j]=m;
    m=t;
   
   }
  }
   a[i]=m;
 }
}
快速排序:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以**递归**进行,以此达到整个数据变成有序序列。

```cpp
void Qsort(int arr[], int low, int high){
    if (high <= low) return;    
    int i = low;    
    int j = high + 1;    
    int key = arr[low];    
    while (true)    {        /*从左向右找比key大的值*/        
	    while (arr[++i] < key)        {            
	     if (i == high){                
	     break;           
	     }       
     }        /*从右向左找比key小的值*/        
     while (arr[--j] > key)        {            
	     if (j == low){                break;            }        
	     }        
	     if (i >= j) break;        /*交换i,j对应的值*/        
	     int temp = arr[i];        
	     arr[i] = arr[j];        
	     arr[j] = temp;     
    }    /*中枢值与j对应值交换*/    
    int temp = arr[low];    
    arr[low] = arr[j];    
    arr[j] = temp;    
    Qsort(arr, low, j - 1);    
    Qsort(arr, j + 1, high);}

比较:
排序属于比较基础的内容,在复杂度上一定要搞清楚了!
小结在这里插入图片描述

(1) 若n较小,则可以采用直接插入排序或直接选择排序。由于直接插入排序所需的记录移动操作较直接选择排序多,因而当记录本身信息量较大时,用直接选择排序较好。
(2) 若文件的初始状态已按关键字基本有序,则选用直接插入或冒泡排序为宜。
(3) 若n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。快速排序是目前基于比较的内部排序法中被认为是最好的方法。
(4) 在基于比较排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程,由此可以证明:当文件的n个关键字随机分布时,任何借助于"比较"的排序算法,至少需要O(nlog2n)的时间。
(5) 当记录本身信息量较大时,为避免耗费大量时间移动记录,可以用链表作为存储结构。
3.头文件整理:
先说c++
#include:
基本输入输出流,用于处理cin,cout;
#include:
基本输入输出流,用于处理printf,scanf;
#include<math.h>:
数学函数库,包括(函数在前,用法在后)
1、 三角函数
double sin(double);正弦
double cos(double);余弦
double tan(double);正切
2 、指数与对数(大部分返回为double型,注意类型)
double frexp(double value,int exp);这是一个将value值拆分成小数部分f和(以2为底的)指数部分exp,并返回小数部分f,即f2^exp。其中f取值在0.5~1.0范围或者0。
double ldexp(double x,int exp);这个函数刚好跟上面那个frexp函数功能相反,它的返回值是x*2^exp
double modf(double value,double *iptr);拆分value值,返回它的小数部分,iptr指向整数部分。
double log (double); 以e为底的对数
double log10 (double);以10为底的对数
double pow(double x,double y);计算x的y次幂
float powf(float x,float y); 功能与pow一致,只是输入与输出皆为单精度浮点数
(一般我们需要的结果是整数型,注意类型)
double exp (double);求取自然数e的幂
double sqrt (double);开平方根

3 、取整
double ceil (double); 取上整,返回不比x小的最小整数
double floor (double); 取下整,返回不比x大的最大整数,即高斯函数[x]

4 、绝对值
double fabs (double);求实型的绝对值
double cabs(struct complex znum);求复数的绝对值

这都是渣渣我所需要的,用的时候也比较少,但用时方恨少!

#include:

find() 查找函数
str.find(“ab”);//返回字符串 ab 在 str 的位置
str.find(“ab”, 2);//在 str[2]~str[n-1] 范围内查找并返回字符串 ab 在 str 的位置

find_first() 首次出现系列函数
str.find_first_of(“apple”); //返回 apple 中任何一个字符首次在 str 中出现的位置
str.find_first_of(“apple”, 2);//返回 apple 中任何一个字符首次在 str[2]~str[n-1] 范围中出现的位置
str.find_first_not_of(“apple”);//返回除 apple 以外的任何一个字符在 str 中首次出现的位置
str.find_first_not_of(“apple”, 2);//返回除 apple 以外的任何一个字符在 str[2]~str[n-1] 范围中首次出现的位置

find_last() 末次出现系列函数
str.find_last_of(“apple”);/返回 apple 中任何一个字符最后一次在 str 中出现的位置
str.find_last_of(“apple”, 2);//返回 apple 中任何一个字符最后一次在 str[0]~str[2] 范围中出现的位置
str.find_last_not_of(“apple”)//返回除 apple 以外的任何一个字符在 str 中最后一次出现的位置
str.find_last_not_of(“apple”, 2); //返回除 apple 以外的任何一个字符在 str[0]~str[2] 范围中最后一次出现的位置注意:以上函数如果没找到的话均返回 string::npos。
*字符串的子串 str.substr(3)
str.substr(2, 4); //返回 str[2]~str[2+(4-1)] 子串(即从[2]开始4个字符组成的字符串)

字符串替换
str.replace(2, 4, “sz”);
//返回把 [2]~[2+(4-1)] 的内容替换为 “sz” 后的新字符串
str.replace(2, 4, “abcd”, 3);
//返回把 [2]~[2+(4-1)] 的内容替换为 “abcd” 的前3个字符后的新字符串5. 字符串插入1 str.insert(2, “sz”);
//从 [2] 位置开始添加字符串 “sz”,并返回形成的新字符串
str.insert(2, “abcd”, 3);
//从 [2] 位置开始添加字符串 “abcd” 的前 3 个字符,并返回形成的新字符串
str.insert(2, “abcd”, 1, 3);
//从 [2] 位置开始添加字符串 “abcd” 的前 [2]~[2+(3-1)] 个字符,并返回形成的新字符串

字符串追加 
除了用重载的 + 操作符,还可以使用函数来完成。
str.push_back(‘a’)//在 str 末尾添加字符’a’
str.append(“abc”);//在 str 末尾添加字符串"abc"7.

字符串删除erase()
str.erase(3); //删除 [3] 及以后的字符,并返回新字符串
str.erase(3, 5); //删除从 [3] 开始的 5 个字符,并返回新字符串8. 字符串交换1 str1.swap(str2); //把 str1 与 str2 交换
str.size();//返回字符串长度
str.length(); //返回字符串长度
str.empty(); //检查 str 是否为空,为空返回 1,否则返回 0
str[n];//存取 str 第 n + 1 个字符
str.at(n); //存取 str 第 n + 1 个字符(如果溢出会抛出异常)

#include //STL 通用算法

猜你喜欢

转载自blog.csdn.net/qq_38205273/article/details/108584638