Coursera課程筆記----計算導論與C語言基礎----Week 7

C語言中的數據成分(Week7)

內存

把內存想象成長帶,帶子上有許多方格,每一個方格有8位(8bit)ios

  • 2^10 = 1024c++

  • 1B = 8 bide

  • 1KB = 1024Byte學習

  • MB、GB、TB、PB……ui

變量

  • 值能夠變化的量
  • 變量的定義格式:(變量類型)(變量標識符)
  • 最好在定義的時候賦予初始值
  • 定義,再使用
  • 定義變量後:找到一片存儲空間,給這片存儲空間起名(變量名),將數據存儲到這個存儲空間中,將名字(變量名)和存儲空間的起始地址聯繫起來

基本數據類型

整形

分類:spa

  • 基本型 int(32bit)code

  • 短整形 short/short int(16bit)對象

  • 長整形 long/long int(32bit)ip

  • C標準沒有具體規定以上各種數據所佔的內存字節數,只要求long不短於int,short不長於int內存

  • sizeof運算符,用於計算某種類型的對象在內存中所佔的字節數

  • 根據有符號、無符號,在前加signed和unsigned便可,若是不標註,程序默認爲有符號

存儲:

  • signed 1位符號位+31位數據位
  • unsigned 32位數據位
  • 正整數存儲:原碼
  • 負整數存儲:補碼
  • 補碼 = 原碼取反 + 1
  • 存儲補碼會提升計算機的運算效率

負數補碼的求法:

  1. 先肯定其符號爲爲1
  2. 求出其絕對值的原碼
  3. 對原碼各位取反
  4. +1

打印一個數的十六進制表示:

int a = -123;
cout<<hex<<a<<endl;

打印一個數的八進制表示:

int a = -123;
cout<<oct<<a<<endl;

打印一個數的十進制表示:

int a = -123;
cout<<dec<<a<<endl;
  • 0x表示16進制數

  • 03表示8進制數

最大的整數:無符號大約42億,有符號大約21億

最小的整數:無符號0,最小-21億(當最高位是1,其餘位是0時,最高位既表示負號,也表示整數最高位1)

結論:用int就好了

使用須知:在定義變量時,必定要緊接着賦初值。

實型(浮點型)

分類:

  • float(32bit) 有效7位
  • doble(64bit) 有效15位
cout<<setprecision(10)<<a<<endl;
//setprecision()設置精度

存儲:

  • 1位符號位+8位指數位(exponent)+23位二進制小數位(fraction)

    (把數字都轉換成科學計數法)

float a = 0;
a = 123456.789e5;
// 科學計數法,e5=10^5

使用須知:

避免將一個很大的數和很小的數直接相加or相減,不然就會「丟失」小的數。

字符型

  • 一個字符型佔一個字節
    • 其值能夠是任何「能夠出如今C/C++語言中的字符」
    • 最多能夠表示256個字符——ASCII Character Codes
  • 因爲存儲類型和整形相同
    • 能夠與整形數據相互賦值
    • 能夠和整數同樣進行運算
  • 轉義字符
    • \a 響一下
    • \n 換行

布爾型

  • 用於存儲「真」和「假」的變量
    • 只佔一個字節
    • 其值只能爲1或0
      • 1=True
      • 0=False
  • 賦給布爾型變量的值
    • 賦0爲False
    • 賦別的數爲True

常數

  • 常量:在程序運行過程當中,其值保持不變的量
    • 字面常量:-1,0,123,4.6……
    • 符號常量:用一個標識符表明一個常量的,稱爲符號常量
const double PI = 3.1415926

類型:

  • 整形常量的後綴
    • n=10000L:長整形常量
    • m = -0x88abL:長整形十六進制常量
    • k = 10000U:無符號整形常量
    • i = 07777LU:無符號長整型八進制常量
  • 浮點型常量的後綴
    • x = 3.1415F:單精度浮點型常量
    • y = 3.1415L:長雙精度浮點型常量
  • 說明:
    • 浮點型常量默認爲double型
    • U、L、F都可小寫

標識符(identifier)

  • 字母,數字,下劃線,不與保留字(關鍵字)等同
  • 匈牙利命名法:
    • 以一個或多個小寫字母開頭,指定數據類型
    • 其後是一個或多個第一個字母大寫的單詞,指出變量的用途
    • 如:chGrade;nLength……
  • 駝峯命名法
    • 由一個或多個單詞連接在一塊兒
    • 第一個字母以小寫字母開始
    • 第二個單詞的首字母大寫或者每個單詞的首字母都大寫

總結

學習數據成分的關鍵是瞭解但不陷入細節,等用到時再細究它。

習題

Quiz1 約瑟夫問題

#include <iostream>
using namespace std;

int succedent[300];
//用於保存一個猴子的後一位是誰
int precedent[300];
//用於保存一個猴子的前一位是誰

int main()
{
    int n,m;
    while (true)
    {
        cin >> n >> m;
        if( n == 0 && m == 0)
            break;
        for (int i = 0; i < n - 1; i++)
        {
            succedent[i] = i + 1;
            precedent[i + 1] = i;
        }
        succedent[n-1] = 0;
        precedent[0] = n-1;

        int current = 0;
        while (true)
        {
            for (int count = 0; count < m - 1; count++)
                current = succedent[current];

            int pre = precedent[current];
            int suc = succedent[current];

            succedent[pre] = suc;
            precedent[suc] = pre;
            if(pre == suc)
            {
                cout<< pre+1 << endl;
                break;
            }
            current = suc;
        }
    }
    return 0;
}

Quiz2 分數求和

#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int sumn = 0, sumd = 1;
    while (n--)
    {
        int num, deno;
        char slash;
        cin >> num >> slash >> deno;
        sumn = sumn*deno + num*sumd;
        sumd = sumd*deno;
    }

    int a = sumd, b = sumn, c;
    while(a != 0)
    {
        //歐幾里得法
        c = a;
        a = b % a;
        b = c;
    }
    int gcd = b;
    sumd /= gcd;
    sumn /= gcd;

    if(sumd > 1)
        cout << sumn << '/' << sumd<<endl;
    else
        cout<< sumn <<endl;

    return 0;
}

Quiz3 年齡與疾病

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    int numAll = 0, numA = 0, numB = 0, numC = 0,numD = 0;
    cin >> numAll;
    for (int i = 0; i < numAll; i++) {
        int temp;
        cin >> temp;
        if(temp <= 18)
            numA++;
        else if(temp >= 19 && temp <= 35)
            numB++;
        else if(temp >= 36 && temp <= 60)
            numC++;
        else numD++;
    }

    cout<<"1-18: "<<fixed<<setprecision(2)<<(double)numA/(double)numAll*(double)100<<"%"<<endl;
    cout<<"19-35: "<<setprecision(2)<<(double)numB/(double)numAll*(double)100<<"%"<<endl;
    cout<<"36-60: "<<setprecision(2)<<(double)numC/(double)numAll*(double)100<<"%"<<endl;
    cout<<"60-: "<<setprecision(2)<<(double)numD/(double)numAll*(double)100<<"%"<<endl;
  
    return 0;
}

Quiz4 成績判斷

#include <iostream>
using namespace std;
int main()
{
    int score;
    cin >> score;

    if(score <= 100 && score >= 95)
        cout<<"1"<<endl;
    if(score < 95  && score >= 90)
        cout<<"2"<<endl;
    if(score < 90 && score >= 85)
        cout<<"3"<<endl;
    if(score < 85 && score >= 80)
        cout<<"4"<<endl;
    if(score < 80 && score >= 70)
        cout<<"5"<<endl;
    if(score < 70 && score >= 60)
        cout<<"6"<<endl;
    if(score < 60 )
        cout<<"7"<<endl;

    return 0;

}

Quiz5 找出第k大的數

#include <iostream>
using namespace std;
int main()
{
    //從最大的數開始逐個尋找並逐個刪除,直到找到第k個
    int  n,k,index,temp = 0;
    cin>>n>>k;
    int a[n];
    for (int i = 0; i < n; i++)
    {
        cin>>a[i];
    }
    for (int i = 0; i < k; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if(a[j] > temp)
            {
                temp = a[j];
                index = j;
            }
        }
        a[index] = 0;
        if(i == k-1)
            cout<<temp<<endl;
        else
            temp = 0;
    }
}

Quiz6 人民幣支付

#include <iostream>
using namespace std;
int main()
{
    int num,n100,n50,n20,n10,n5,n1;
    cin>>num;

    n100 = num / 100;
    num -= n100*100;
    n50 = num / 50;
    num -= n50*50;
    n20 = num / 20;
    num -= n20*20;
    n10 = num / 10;
    num -= n10*10;
    n5 = num / 5;
    num -= n5*5;
    n1 = num;

    cout<<n100<<"\n"<<n50<<"\n"<<n20<<"\n"<<n10<<"\n"<<n5<<"\n"<<n1<<endl;
    return 0;


}
相關文章
相關標籤/搜索