編程:OJ中使用C編程最基礎的操做

平時一直寫的都是Java,但有時候一些OJ須要必須使用C/C++,雖然學過,但好多用法都不是太清楚了,本身整理了一下C語言處理OJ問題時最經常使用的操做,應付一些基本的算法題應該不成問題。算法

C語言程序執行過程

源代碼——預處理器Preprcessor——擴展源代碼——編譯器Compiler-——彙編代碼——彙編器Assembler——目標代碼(simple.obj)——連接器Linker——可執行代碼(simple.exe)——加載器loader——內存執行——控制檯輸出。express

輸入和輸出

內置庫函數,在stdio.h(頭文件)中定義。數組

scanf("format string",argument_list);

例如scanf("%d",&number)語句從控制檯讀取整數,並將給定值存儲在數字變量中。函數

printf("format string",argument_list);

格式字符串("format string")能夠是%d(整數),%c(字符),%s(字符串),%f(float)等)。指針

基本數據類型

C語言中有4種類型的數據類型。code

類型 包含的類型
基本數據類型(Basic Data Type) int, char, float, double
派生數據類型(Derived Data Type) array, pointer, structure, union
枚舉數據類型(Enumeration Data Type) enum
Void數據類型(void Data Type) void

轉義序列

\n 新行
\r 回車
\t 水平製表符
\v 垂直製表符
\0 null

switch語句

switch表達式必須是整數或字符類型。case值必須是整數或字符常量。orm

switch(expression){    
case value1:    
 //code to be executed;    
 break;  //optional  
case value2:    
 //code to be executed;    
 break;  //optional  
......    

default:     
 code to be executed if all cases are not matched;    
}

類型轉換

語法:(type)value; 始終建議將較低的值轉換爲較高值以免數據丟失。內存

// 無類型轉換:Output: 2
int f= 9/4;  
printf("f : %d\n", f );

//使用類型轉換:Output: 2.250000
float f=(float) 9/4;  
printf("f : %f\n", f );

值和引用

在經過值調用函數時,原始值不被修改。在經過引用的調用中,原始值可被修改並反映到外部調用者。字符串

void change(int num) {
    num = num + 10; 
}

void change(int *num) {
    *num = *num + 10; 
}

int main() {
    int x = 200;
    change2(x);  // 經過值調用,變量x並無改變
    change2(&x); // 經過引用調用,變量x已經改變了
    return 0;
}
經過值調用 經過引用調用
將值的副本傳遞給函數 將值的地址傳遞給函數
函數內的更改不會反映在函數外 函數內部的改變也反映在函數的外部
將在不一樣的內存位置建立實際和正式的參數 將在相同的內存位置建立實際和正式的參數

指針

// 這段代碼頗有意思
int main(){
    int a = 10, b = 20, *p1 = &a, *p2 = &b;
    printf("Before swap: *p1=%d *p2=%d\n", *p1, *p2);
    *p1 = *p1 + *p2;
    *p2 = *p1 - *p2;
    *p1 = *p1 - *p2;
    printf("\nAfter swap: *p1=%d *p2=%d\n", *p1, *p2);
}

// Output
//Before swap: *p1=10 *p2=20
//After swap: *p1=20 *p2=1

數組

int main(){
    // 數組聲明初始化
    int arr[5]; // 聲明大小,後賦值
    int arr2[5] = {1,2,3,4,5} // 聲明賦值
    int arr3[] = {1,2,3,4,5}  

    // 二維數組
    int arr4[3][4] = {0}; // 初始化是一個好習慣 
    int arr5[3][4] = {{1,2,3,4},{2,3,4,5},{3,4,5,6}};
    int j, k;
    // 遍歷
    for(j = 0; j < 3; j++) {
        for(k = 0; k < 4; k++){
            printf("%d ", arr5[j][k]);
        }
        printf("\n");
    }

    // 將數組做爲參數傳遞給函數
    int arr[5] = {5,4,3,2,1};
    bubsort(arr,5); // 調用
}
// 函數要聲明
void bubsort(int arr[], int len){
}

字符串

C語言中的字符串是由\0(空字符)終止的字符數組。gets()函數從用戶讀取字符串,puts()函數打印字符串。這兩個函數都在<stdio.h>頭文件中定義。get

char ch[]={'h', 'e', 'l', 'l', '0', '\0'};
char ch2[]="hello";

// 輸入輸出
char str[10];
printf("輸入一個字符串:\n");
gets(str);
puts(str);

// 字符串函數,在"string.h"庫中定義。
// strlen();字符串長度
int len = strlen(str);
printf("字符串長度:%d\n", len);

// strcpy(destination,source);字符串拷貝
char str2[10];
strcpy(str2,str); // 將字符串str拷貝到字符串str2

// strcat(first_string, second_string)函數鏈接兩個字符串,結果返回到first_string
char str3[] = " world";
strcat(str, str3);

// strcmp(first_string, second_string)函數比較兩個字符串,若是兩個字符串相等,則返回0。
if(strcmp(str, str2) == 0);

// strrev(string)函數返回給定字符串的反轉字符串。
printf("字符串反轉: %s \n", strrev(str));

// strlwr(string)函數返回給定字符串的小寫形式
printf("小寫形式: %s \n", strlwr(str));
// strupr(string)函數返回給定字符串的大寫形式
printf("大寫形式: %s \n", strupr(str));

結構體

// 定義一個結構體
struct employee  
{   int id;  
    char name[50];  
    float salary;  
};

// 在main中聲明一個結構體變量
struct employee e1;
// 賦值調用
e1.id = 110;

// 結構體數組
// 就是將結構體以數組形式保存
struct employee e[10]; // 至關於定義了10個結構體變量

// 結構體嵌套
struct Employee
{
    int id;
    char name[20];
    struct Date
    {
        int dd;
        int mm;
        int yyyy;
    }doj;
}e1;
// 賦值
e1.id = 110;
e1.doj.yyyy = 2019;

聯合體

像結構體同樣,聯合體(Union)在C語言中是一個用戶定義的數據類型,用於保存不一樣類型的元素。但它並不佔全部成員的內存總和。它只佔最大成員的內存,它分享最大成員的內存。

文件處理

經常使用函數:

編號 函數名稱 功能描述
1 fopen() 打開新的或現有的文件
2 fprintf() 將數據寫入文件
3 fscanf() 從文件讀取數據
4 fclose() 關閉文件
// FILE *fopen( const char * filename, const char * mode );
// int fprintf(FILE *stream, const char *format [, argument, ...])
// int fscanf(FILE *stream, const char *format [, argument, ...])

#include <stdio.h>  
main() {
    FILE *fp;
    // 寫文件
    fp = fopen("file.txt", "w");  
    fprintf(fp, "Hello World\n");
    fclose(fp);   
    // 讀文件
    char buff[255]; 
    fp = fopen("file.txt", "r");  
    while(fscanf(fp, "%s", buff)!=EOF){  
        printf("%s ", buff );  
    }  
    fclose(fp); 
}

數學函數

math.h頭文件中定義和實現有各類方法。math.h頭文件的經常使用函數以下。

序號 函數 描述
1 ceil(number) 舍入給定數字。它返回大於或等於給定數字的整數值。
2 floor(number) 舍入給定數字。它返回小於或等於給定數字的整數值。
3 sqrt(number) 返回給定數字的平方根。
4 pow(base,exponent) 返回給定數字的冪值。
5 abs(number) 返回給定數字的絕對值。
相關文章
相關標籤/搜索