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 响一下
    • \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; }

Coursera课程笔记----计算导论与C语言基础----Week 7的更多相关文章

  1. Coursera课程笔记----计算导论与C语言基础----Week 6

    理性认识C程序 导论(Week 6) 明确学习进度 讲课内容 感性➡️理性➡️函数➡️指针等 作业练习 初级阶段 ➡️正常作业练习 C语言的由来 程序设计语言的分类 低级语言之机器语言 0010101 ...

  2. Coursera课程笔记----计算导论与C语言基础----Week 8

    C语言中的运算成分(Week 8) 赋值运算符 "="赋值运算符 给赋值号左边的变量赋予数值 在变量定义的同时可以为变量赋初值 要点一:两面类型不同 若=两边的类型不一致,赋值时要 ...

  3. Coursera课程笔记----计算导论与C语言基础----Week 4

    感性认识计算机程序(Week 4) 引入 编程序 = 给计算机设计好运行步骤 程序 = 人们用来告诉计算机应该做什么的东西 问题➡️该告诉计算机什么?用什么形式告诉? 如果要创造一门"程序设 ...

  4. Coursera课程笔记----计算导论与C语言基础----Week 2

    计算机的历史与未来(Week 2) 计算机历史 早期计算机:手工计算器➡️机械计算器➡️计算机原型 现代计算机:电子管计算机➡️晶体管计算机➡️集成电路计算机➡️超大规模集成电路 早期的手工计算辅助工 ...

  5. Coursera课程笔记----计算导论与C语言基础----Week 9

    C语言中的控制成分(Week 9) 计算机程序的基本结构 任何具有单入口单出口的程序,都可以用顺序结构.分支结构.循环结构来表达 分支语句 在执行if语句前,先对表达式求解 if()内可以是任意的数值 ...

  6. Coursera课程笔记----计算导论与C语言基础----Week 3

    存储程序式计算机 冯·诺伊曼式计算机 "关于EDVAC的报告草案" 组成:控制器(协调工作).运算器(算数&逻辑运算).存储器(存储操作信息和中间结果).输入设备.输出设备 ...

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

    计算机的基本原理(Week 1) 第一次数学危机 公元前500年,毕达哥拉斯学派,他们相信数是万物的本源:一切数均可表示成整数或者整数之比 然而毕达哥拉斯证明了勾股定理,某些直角三角形的三边比不能用整 ...

  8. Coursera课程笔记----计算导论与C语言基础----Week 12

    期末编程测试(Week 12) Quiz1 判断闰年 #include <iostream> using namespace std; int main() { int year; cin ...

  9. Coursera课程笔记----计算导论与C语言基础----Week 11

    C程序中的字符串(Week 11) 字符数组 所有的字符串,都是以\0结尾的 只能在数组定义并初始化的时候:char c[6] = "China"; 不能用赋值语句将一个字符串常量 ...

随机推荐

  1. [总结]RMQ问题&ST算法

    目录 一.ST算法 二.ST算法の具体实现 1. 初始化 2. 求出ST表 3. 询问 三.例题 例1:P3865 [模板]ST表 例2:P2880 [USACO07JAN]平衡的阵容Balanced ...

  2. Three.js如何选中外部模型

    1.问题 three.js中模型选中使用的是射线法,根据摄像机角度,鼠标点击位置和模型选中的distance参数判断来选中模型.对于原生的矢量模型完全没有问题,但是当遇到导入的外部模型,如obj.st ...

  3. mysql 创建表 索引 主键 引擎 自增 注释 编码等

    CREATE TABLE text(id INT(20) COMMENT '主键',NAME VARCHAR(20) COMMENT '姓名',PASSWORD VARCHAR(20) COMMENT ...

  4. 实现一个简单的基于动态代理的 AOP

    实现一个简单的基于动态代理的 AOP Intro 上次看基于动态代理的 AOP 框架实现,立了一个 Flag, 自己写一个简单的 AOP 实现示例,今天过来填坑了 目前的实现是基于 Emit 来做的, ...

  5. 2007 NOIP T1奖学金

    奖学金(07NOIPT1): [题目描述] 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成绩:语文.数学.英语.先按总分从高到低排序,如果 ...

  6. Python的6种方式实现单例模式

    单例模式是一个软件的设计模式,为了保证一个类,无论调用多少次产生的实例对象,都是指向同一个内存地址,仅仅只有一个实例(只有一个对象). 实现单例模式的手段有很多种,但总的原则是保证一个类只要实例化一个 ...

  7. 2019-2020-1 20199328《Linux内核原理与分析》第九周作业

    笔记部分 2019/11/12 14:45:44 从CPU和内存的角度看linux系统的运行 CPU角度:首先我们进行了系统调度,然后系统进入内核态,把信息压栈,然后我们进行进程管理,由于进入系统调用 ...

  8. MySQL系列(一)

    一.简介 MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发.发布并支持的.有以下特点: MySQL是一种数据库管理系统. MySQL是一种关联数据库管理系统. MySQ ...

  9. HDU 5954 Do Not Pour Out

    #include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;++i) #defi ...

  10. FluentAspects -- 基于 Fluent API 的 Aop

    FluentAspects -- 基于 Fluent API 的 Aop Intro 上次我们做了一个简单的 AOP 实现示例,但是实现起来主要是基于 Attribute 来做的,对于代码的侵入性太强 ...