日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++初始编程及相关的问题总结

發布時間:2023/12/15 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++初始编程及相关的问题总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這篇文章是根據之前完成的“數字信號處理器”這門課的作業

運行環境及建工程步驟

  • 創建工程項目:

    Visual Studio(VS)后,點擊菜單欄第一個鍵,文件 -> 新建-> 項目-> 設置項目名稱以及存儲位置-> 選擇Win32控制臺應用程序-> 勾選“為解決方案創建目錄”-> 下一步-> 下一步-> 勾選“空項目”-> 完成。

  • 更新VS2010,或者卸載VS2012安裝2010后,建立Win32 Console Project/MFC項目時會出現”LINK : fatal error LNK1123: 轉換到 COFF 期間失敗: 文件無效或損壞”的錯誤。
    解決方案:

    (1):將 項目——項目屬性——配置屬性——連接器——清單文件——嵌入清單 “是”改為“否”。若還不能解決問題進入第二步。

    (2):查看計算機是否為64bit操作系統,如是,繼續如下操作。
    查找是否有兩個cvtres.exe。
    C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe
    C:\Windows\Microsoft.NET\Framework\v4.0.30319\cvtres.exe
    右鍵屬性—詳細信息, 查看兩者版本號,刪除/重命名較舊的版本,或者重新設置Path變量。
    治本的辦法是第二步,刪除舊版本的cvtres.exe后,就不需要每次都設置配置了。

  • #include<***.h>和#include"***.h"的區別

    • #include<***.h>,用于系統頭文件,直接從編譯器自帶的函數庫中尋找文件。在#include指令里,系統頭文件的文件名要放在尖括號里給出,這是告訴編譯器:應該到“標準的”地點尋找這個文件:#include <stdio.h>
    • #include"***.h",用于自定義頭文件,是先從自定義的文件中找,如果找不到在從函數庫中尋找文件。

      頭文件是一些以.h作為擴展名的標準文本文件。一般情況下,都應該把自定義的頭文件和其余的程序文件放在同一個子目錄里,或者在主程序目錄下專門創建一個子文件夾來集中存放它們。參考:C++中“頭文件”的定義和使用

  • 自定義頭文件

    1
    2
    3
    4
    \#ifndef CIRCLE_H
    \#define CIRCLE_H
    //你的代碼寫在這里
    \#endif

    CIRCLE_H這個名字實際上是無所謂的,命名為什么都行,只要符合規范都行。原則上來說,建議把它寫成這種形式,因為比較容易和頭文件的名字對應。

    源文件(.cpp):主要寫實現頭文件中已經聲明的那些函數的具體代碼。需要注意的是,開頭必須#include一下實現的頭文件,以及要用到的頭文件。那么當你需要用到自己寫的頭文件中的類時,只需要#include進來就行了。工程中只能有一個main()函數,是應用程序的入口

    雖說頭文件可以用來保存任意代碼片段,但典型的做法是只用它們來保存函數聲明、用戶自定義類型數據(結構和類)、模板和全局性的常量。

    如果你有一個程序需要多次調用一個或一組函數,或是你有一個或一組函數需要在多個程序里調用,就應該把它們的聲明拿出來放到一個頭文件里。

    頭文件應該只包含最必要的代碼,比如只聲明一個類或只包含一組彼此相關的函數。把接口(函數的原型)和實現(函數體的定義)分開是對代碼進行模塊化的基本原則之一。

C++編程中遇到的一些問題

  • menset():char型初始化函數

    • 所在頭文件<string.h>或 <memory.h>,有人通過測試,發現使用memset似乎不需要使用額外的頭文件。。
    • 函數原型:void *memset(void *s , int ch , size_t n )
    • 函數解釋:將s中的前n個字節用ch替換并且返回s。
    • 函數作用:在一段內存塊中填充某一個給定的值,常用于較大的對結構體和數組的清零操作。

      參考:C++中memset函數的用法一般用于清零。

  • 在<float.h>中定義了浮點類型的范圍:

    1
    2
    #define DBL_MAX 1.7976931348623158e+308 /* max value */
    #define DBL_MIN 2.2250738585072014e-308 /* min positive value */
  • 給C++的一維數組賦初值,只有在定義的時候可以整體初始化,
    錯誤的賦值方法:

    1
    2
    3
    int *temp = new int[2];
    temp[0] = arr1[0];
    temp[1] = arr1[2];

    應該為:

    1
    2
    3
    int temp[2];
    temp[0] = arr1[0];
    temp[1] = arr1[2];

對于new創建的數組,之間使用創建時的大小。new數組只能用無參的構造函數或者所有參數都有默認值的構造函數。

  • 函數調用的三種參數傳遞方式

    • (1)傳值調用:實參被拷貝了一份,然后在函數體內使用,函數體內修改參數變量時修改的只是實參的一份拷貝,而實參本身沒有改變,所以如果想要在調用的函數中修改實參的值,使用值傳遞不能達到其目的,這時只能使用引用或者指針傳遞。

    • (2)傳址調用(即是傳指針):傳遞的是一個地址值,如果改變被調函數中的指針地址,它將應用不到主調函數的相關變量。指針可以改變其指向的對象(指針變量中的值可以改)。

    • (3)傳引用:任何對于引用參數的處理都會通過一個間接尋址的方式操作到主調函數中的相關變量,引用對象不能修改。。

      • C++中引用傳遞與指針傳遞的區別
      • C語言中memset函數詳解
  • 指針的使用:如果使用下面的方法對一個數組做初始化,double** q = Pxy;,此處直接使用Pxy構建一個二維數組,但是在此之后的語句,對數組q操作,Pxy的值也會相應地改變。

  • 計算靜態數組的長度函數

    1
    2
    3
    4
    5
    6
    7
    8
    template<typename T>
    int count(T& x)
    {
    int s1 = sizeof(x);
    int s2 = sizeof(x[0]);
    int result = s1 / s2;
    return result;
    }

對于動態數組,上面的函數不能得到二維數組的長度,sizeof(動態數組)結果是單個元素的大小,相當遠sizeof(x[0])。

  • 隨機數的產生
    (1) c語言中rand()函數的用法筆記:http://blog.csdn.net/chikey/article/details/66970397
    (2)C++中rand()函數的用法,可根據這個來產生隨機數

    (3)示例,使用下面的語句,產生的是一個0-1的隨機數,且精度為1/32767,rand() / (double)RAND_MAX;

  • C++動態內存分配:

    delete[] mi;// 由于mi是靜態存儲分配,不需要手動釋放內存,如果加這兩句可能會陷入程序不運行的狀態。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // 使用new構建并初始化二維數組
    float** create_array(int row, int col){
    float** p = new float*[row];
    for (int i = 0; i < row; ++i) {
    p[i] = new float[col];
    for (int j = 0; j < col; ++j) {
    p[i][j] = 0;
    }
    }
    return p;
    }
    // 初始化二維數組
    template<typename T>
    void init_array(T&& arr, int row, int col){
    for (int i = 0; i < row; ++i) {
    for (int j = 0; j < col; ++j) {
    arr[i][j] = 0;
    }
    }
    }

參考:(1)C++ 動態內存分配(6種情況,好幾個例子)(2)C++ 內存分配秘籍—new,malloc,GlobalAlloc詳解(分析詳細易懂)

  • 調試
    (1)數據類型與輸入或輸出的類型不匹配
    fscanf_s(fp, "%lf,", &temp); //此處temp定義的是float類型,但是輸入確實double型
    報錯如下:
    Run-Time Check Failure #2 - Stack around the variable 'temp' was corrupted.

  • 將變量加入到字符數組中:

    1
    sprintf_s(t, "result/FJ_%d_%d_%d_%d.txt", FEATURE_NUM, FEATURE_SUB_NUM,1,5);
  • 輸入字符串,轉化為數組,并統計字符個數:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include<iostream>
    #include<string>
    using namespace std;
    int main() {
    // 輸入數據
    string s1;
    char temp;
    while((temp=cin.get())!='\n') {
    s1 +=temp;
    }
    const int LEN =s1.length();
    char* s = new char[LEN];//根據輸入字符串的長度,創建字符數組
    for(int i = 0;i<LEN;i++){ //將字符串保存到字符數組中
    s[i]=s1[i];
    }
    cout<<LEN<<endl;
    return 0;
    }

總結

以上是生活随笔為你收集整理的C++初始编程及相关的问题总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。