演算法筆記知識點整理(一)
阿新 • • 發佈:2018-12-17
1.陣列部分
- memset可用來對陣列中每一個元素賦0或-1的初值
語法為 memset(陣列名,初始值,sizeof(陣列名))
- 如果不是使用
scanf
的%s格式讀入字串或gets函式輸入字串(例如使用getchar()),一定要在輸入的每個字串後面加\0 string.h
標頭檔案中的常用字串函式
strlen(字元陣列)
函式可以得到一個字元陣列中\0前的元素個數strcmp(字元陣列1,字元陣列2)
返回兩個字串大小比較結果(字典序)>返回正整數,小於返回負整數,相等返回0strcpy(字元陣列1,字元陣列2)
把字元陣列2賦值給字元陣列1,包括\0strcat(字元陣列1,字元陣列2)
把字元陣列2接在字元陣列1的後面
sscanf
和sprintf
函式 語法: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--){……};
-