1. 程式人生 > >演算法筆記知識點整理(一)

演算法筆記知識點整理(一)

1.陣列部分

  • memset可用來對陣列中每一個元素賦0或-1的初值語法為 memset(陣列名,初始值,sizeof(陣列名))
  • 如果不是使用scanf的%s格式讀入字串或gets函式輸入字串(例如使用getchar()),一定要在輸入的每個字串後面加\0
  • string.h標頭檔案中的常用字串函式
    • strlen(字元陣列)函式可以得到一個字元陣列中\0前的元素個數
    • strcmp(字元陣列1,字元陣列2)返回兩個字串大小比較結果(字典序)>返回正整數,小於返回負整數,相等返回0
    • strcpy(字元陣列1,字元陣列2)把字元陣列2賦值給字元陣列1,包括\0
    • strcat(字元陣列1,字元陣列2)把字元陣列2接在字元陣列1的後面
  • sscanfsprintf函式 語法:sscanf(str,"%d",&n);//將str 以%d的格式寫入n中,sprintf(str,"%d",n)//將n以%d的形式寫入str中
#include<stdio.h>
#include<string.h>
int main(){
    int n;
    char str[12]="123";
    sscanf(str,"%d",&n);
    printf("%d",n);
    sprintf
(str,"%d",n); printf("%s",str); return 0; }

2.函式部分

  • 1.以陣列作為函式引數,引數中陣列的第一位不需要填寫長度(如果是二維陣列,那麼第二維需要填寫長度),實際呼叫時只需填寫陣列名。注意陣列作為引數時,在函式中對陣列元素的修改相當於對原陣列元素的修改
#include<stdio.h>
#include<string.h>
void change(int a[],int b[][5]){
    a[0]=1;
    a[1]=2;
    a[2]=3;
    b[0][0]=4;
}
int main(){
    int a[3]=0;
int b[5][5]={0}; change(a,b); return 0; }

3.指標

#include<stdio.h>
int main(){
    int a[10]={1};
    int *p=a;
    printf("%d\n",*p);
    return 0;
}

指標變數儲存的是地址,指標可以理解為是變數的地址,指標變數支援自增自減操作,p+i代表p偏移i個int型變數的地址。在上述例項中a代表陣列a首地址,即a[0]的地址,a代表&a[0],a+i代表&a[i], *(a+i)等價於a[i]

#include<stdio.h>
int a[10];
int main(){
for (int i=0;i<9;i++){
    scanf("%d",a+i);
    }
for (int j=1;j<9;j++){
    printf("%d",*(a+i));
    }
return 0;
}

4.引用

  • 引用是繼指標之後可以直接改變引數對應的變數的值的方式。引用的作用原理是相當於給原來的變數起了個別名,與原名稱指向同一變數,使用方式為,在函式引數型別後直接加&即可void change(int &a)//由於是c++的語法,必須儲存為.cpp型別
//可以通過引用實現交換傳入的地址以實現變數交換的目的
#include<stdio.h>
void swap(int *&p,int *&q){
    int *temp=p;
    p=q;
    q=temp;
    }

引用是變數的別名,不能對常量使用引用

5.結構體

  • 將若干個資料型別不同的變數或者陣列封裝在一起,以儲存自定義的資料結構,方便儲存一些符合資料。
  • 基本結構struct Name{//一些基本的資料結構或者自定義的資料型別};
struct Node{
    Node n;//此處錯誤,會引起迴圈定義的問題
    Node *next;//此處可以這樣定義
};
  • 訪問結構體內元素
    • 兩種方式 “.”操作和“->”操作,
struct Student{
    int id;
    char name[20];
    student *next;
}stu,*p;
//訪問stu中的變數的寫法如下
stu.id;
stu.name;
stu.next;
//訪問*p中的變數的寫法為
(*p).id;
(*p).name;
(*p).next;
//另一套寫法
p->id;
p->name;
p->next;

  • 結構體的初始化:建構函式

6.補充內容

  • 浮點數的比較:
const double eps=1e-8; 
#define Equ(a,b) (fabs((a)-(b))<(eps));
#define More(a,b){((a)-(b))>((eps)};
#define Less(a,b){((a)-(b))<(-eps)};
#define MoreEqual(a,b){((a)-(b))>(-eps)};
#define LessEqual(a,b){((a)-(b))<(eps)};
  • 圓周率 const double Pi=acos(-1.0);
  • 多點測試,用來實現讀取所有資料的三種方法
    • while(scanf("%d",&n)!=EOF){ ……}
    • while(scanf("%d %d",&a,&b)!=EOF){ if (a==0 && b==0) break;……}或者是while(scanf("%d %d",&a,&b),a||b){……}
    • while(T--){……};
    • -