• Coursera课程笔记----计算导论与C语言基础----Week 7


    C语言中的数据成分(Week7)

    内存

    把内存想象成长带,带子上有许多方格,每个方格有8位(8bit)

    • 2^10 = 1024

    • 1B = 8 b

    • 1KB = 1024Byte

    • MB、GB、TB、PB……

    变量

    • 值可以变化的量
    • 变量的定义格式:(变量类型)(变量标识符)
    • 最好在定义的时候赋予初始值
    • 定义,再使用
    • 定义变量后:找到一片存储空间,给这片存储空间起名(变量名),将数据存储到这个存储空间中,将名字(变量名)和存储空间的起始地址联系起来

    基本数据类型

    整形

    分类:

    • 基本型 int(32bit)

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

    • 长整形 long/long int(32bit)

    • 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 响一下
      • 换行

    布尔型

    • 用于存储“真”和“假”的变量
      • 只占一个字节
      • 其值只能为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<<"
    "<<n50<<"
    "<<n20<<"
    "<<n10<<"
    "<<n5<<"
    "<<n1<<endl;
        return 0;
    
    
    }
    
  • 相关阅读:
    Android文件操作总结
    SQLite优化方法
    Android之TabHost布局
    Android简单数据存储SharedPreferences
    Android之SharedPreferences权限
    Android布局大全
    context理解
    Android网络连接之HttpURLConnection和HttpClient
    Android之ContentProvider总结
    Intent的简介以及属性详解
  • 原文地址:https://www.cnblogs.com/maimai-d/p/12791197.html
Copyright © 2020-2023  润新知