CS50 week1 笔记

一、编译器

1.认识VS Code

source code(源代码)---->>compiler(编译器)---->machine code(机器代码)

本课介绍VS Code编译器,用它将C语言源代码转译成机器语言

     VS Code软件界面板块:*text editor(*编写程序的空间)、*command line(*终端程序区域(CLI))、file explorer

    操作步骤:创建文件(code A.c)--编写代码---编译机器代码(make A.c)--运行代码(./A)

    tips:编程三个层面的要求

           First, correctness refers to “does the code run as intended?”

           Second, design refers to “how well is the code designed?”

           Finally, style refers to “how aesthetically pleasing and consistent is the code?”

二、C语言初步

1.打印内容 printf

#include <stdio.h>

int main(void)
{
    printf("hello, world**\\\\n**");
}

#include <stdio.h> 这是在调用库(library)【第三方】

     C不能自动获得printf,必须包含一个head file ,该文件声明函数存在,其中包含了足够多的函数即Standard I/O Library【Standard I/O:standard input and output】

printf("hello, world\n");

          A.通常在语句之后加“;”

          B./n:转义序列—移到下一行

                           如果没加/n ,"$"将在“hello world“后面而不是另起一行

          C.有了引号里面的内容必须在同一行

tips:

(1)为什么出现两个hello的文件

一个是我作为人类写的代码文件,一个是编译器将我的源代码翻译成机器代码

(2)为什么有颜色:语法高亮

(3)小技巧:清除终端:ctrl+l/输入clear

手册页 查询帮助

2.变量(variables)设置

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    string answer = get_string("What's your name? ");
    printf("hello, %s\\\\n", answer);
}

#include <cs50.h>:本课程中关于 string的library

answer:变量

=:赋值,右边的值赋值到左边【从右到左】

说明存储的是什么类型的值【String:字符串】

             There are many data types, such as int, bool, char, and many others.(后面讲)

%s:字符串的占位符【格式代码】,表示插入一些值

【%i:整数的格式代码;%li:长整数; %f :浮点数】

tips:

      怎么输入数学中的%?---使用%%

3.条件(conditionals)

if

else if

else

内含布尔表达式

例子:进行比较判断

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    int x = get_int("What's x? ");
    int y = get_int("What's y? ");

    if (x < y)   //【中间有空格】
    {
        printf("x is less than y\\n");
    }
    else if (x > y)
    {
        printf( "x is greater than y\\n");
    }
    else{
        printf("x is equal to y\\n");
    }
}

tips:

记得标注数据类型 int

(1)不能用=,=的意思是从右到左的赋值;==才表示相等

(2)使用键盘的向后键滚动,按一下向上键看到写的最后一个命令,按两下是写的倒数第二个命令

(3)每次改了程序之后要重新编译 make 文件

(4)code:新建/打开文件

例子:进行是否选择

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    // Prompt user to agreechar c = get_char("Do you agree? ");

    // Check whether agreedif (c == 'Y' || c == 'y')
    {
        printf("Agreed.\\n");//【文本的双引号  双引号:不止一个字符】
    }
    else if (c == 'N' || c == 'n')//【单引号:用一个字符】
    {
        printf("Not agreed.\\n");
    }
}

tips:

(1)或者(or):||

(2)在输出一样时可以考虑合并代码

(3)双引号与单引号 在C中必须【见代码内标记】

4.循环(loop)

(C语言缩进4个位置)

(1)便捷写法:syntactic sugar

“变量=值“

更新现有变量不需要关键词int

使用“+=”并且只在左侧提及一次变量名称

如果是加1的话,还可以:

想减去就 --

(2)while

#include <stdio.h>

int main(void)
{
    int i = 3;
    while (i > 0)
    {
        printf("meow\\n");
        i--;
    }
}

tips:编程优化思路:颠倒逻辑,比如从相减检查变成相加检查

while内部包含了一个布尔表达式,更多检测是否满足条件

(3)for

#include <stdio.h>

int main(void)
{
    for (int i = 0; i < 3; i++)
    {
        printf("meow\\n");
    }
}

tips:for 括号内不仅仅是布尔表达式

         第一个分号内的内容只发生一次,后面的循环由二、三部分完成

(4)【C语言特有】do while

见之后的实际运用

(5)不断重复,永远运行的程序

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    while (true)/while(1)
    {
        printf("meow\\n");
    }
}

tips:想用true 要引用特定的库

(6)实际解决问题案例

A.做方块

a.

#include *<stdio.h>*

int main(void)
{
    **for** (int i = 0; i < 4; i++)
    {
        printf("?");【关于重复的都可以考虑loop】
    }
    printf("**\\n**");【这样&不会跟在????之后】
}

b.

#include *<stdio.h>*

int main(void)
{
    **for** (int i = 0; i < 3; i++)
    {
        printf("#**\\n**");
    }
}

c.3*3正方体

嵌套循环

#include *<stdio.h>*

int main(void)
{
    **for** (int i = 0; i < 3; i++)
    {
        **for** (int j = 0; j < 3; j++)//不同的变量
        {
            printf("#");
        }
        printf("**\\n**");
    }
}

d.可输入确定的边长

#include *<cs50.h>*
#include *<stdio.h>*

int main(void)
{
    int n = get_int("Size: ");

    **for** (int i = 0; i < n; i++)
    {
        **for** (int j = 0; j < n; j++)
        {
            printf("#");
        }
        printf("**\\n**");
    }
}

e.怎么强迫用户输入正值

第三种循环 do while 【C独有】

避免重复的代码

#include *<cs50.h>*
#include *<stdio.h>*

int main(void)
{
    int n;
    **do**{
        n = get_int("Size: ");
    }
    **while** (n < 1);//【注意顺序】

    **for** (int i = 0; i < n; i++)
    {
        **for** (int j = 0; j < n; j++)
        {
            printf("#");
        }
        printf("**\\n**");
    }
}

【额外】编程思想训练:

1.想要改变正方形边长大小

          一个一个改?一起改的简单方法!

直接创建一个变量

int main(void)
{
    **const** int n = 3;//【申明其为常量】【确保自己不会意外在其他地方编写代码来更改它】
    **for** (int i = 0; i < n; i++)
    {
        **for** (int j = 0; j < n; j++)
        {
            printf("#");
        }
        printf("**\\n**");
    }

2.风格优化 VS Code 已经为我们提供好了风格

5.注释

       “ // ”可用在代码中说明这部分代码是干嘛的,这样更清晰 EG. *// Get size of grid*

6.抽象【abstraction]

  是通过一点一点小问题的解决来简化代码的艺术

      以上面的用户可以指定边长的正方形为例子进行简化:

#include *<cs50.h>*
#include *<stdio.h>*
//【顶部提示新建了函数(复制粘贴首行)】
int get_size(void);
void print_grid(int n);
//【主要程序】
int main(void)
{
    int n = get_size();
    print_grid(n);
}
//【新建的】
int get_size(void)
{
    int n;
    **do**{
        n = get_int("Size: ");
    }
    **while** (n < 1);
    **return** n;
}
//【新建的】
void print_grid(int n)
{
    **for** (int i = 0; i < n; i++)
    {
        **for** (int j = 0; j < n; j++)
        {
            printf("#");
        }
        printf("**\\n**");
    }
}

7.运算符(operators)和类型(types)

(1)运算符

  • +: for addition加法
  • - :for subtraction减法
  • * :for multiplication乘法
  • /:for division 除法
  • %:for remainder 取余

(2)数据类型

  • bool, a Boolean expression of either true or false 【布尔表达式】
  • char, a single character like a or 2 【单个符号】
  • double, a floating-point value with more digits than a float 【拥有更多数字的浮点数】
  • float, a floating-point value, or real number with a decimal value【浮点数】
  • int, integers up to a certain size, or number of bits【整数】
  • long, integers with more bits, so they can count higher than an int【有更多比特的整数】
  • string, a string of characters 【字符串】

(3)实战

A.做一个相加的程序,x+y

#include *<cs50.h>*
#include *<stdio.h>*

int main(void)
{
    *// Prompt user for x
 int x = get_int("x: ");

    *// Prompt user for y*`

 int y = get_int("y: ");

    *// Perform addition*`

  printf("%i**\\n**", x + y);
}*

问题1:当x=20亿,y=20亿相加时却出现了负数。

为什么?

       随机存储器储存空间有限

       32位中还要分出一些位置表示负数等,留给正数的空间有限

       int 大约可表示20亿,此时没有位置存储,数字溢出,所以改成负数

解决方法:

       修改数据类型:int改成long:

问题2:truncation

涉及浮点数的数字,截断,丢失小数点之后的内容

long不支持小数点,会截断

要用float

但是显示0.0000。还是截断了

怎么解决

    类型转换(type casting)

明确告诉计算机将一种数据类型转换成另一种数据类型

但是!

floating-p oint imprecision 浮点不精确

  ----- >>指定显示多少的小数位

但是算出来是0.333334569230等奇怪的东西

原因:

       计算机做了奇怪的近似

还是不精确怎么改善:

      double使用双倍的位数,用64代替float的32位,用来提高精度

结果为0.33333333333333331483

更精确了

以上体现了计算机和代码的局限

三、操作系统Linux

有命令行环境

这里还有其他命令符号

  • cd, for changing our current directory (folder)
  • cp, for copying files and directories
  • ls, for listing files in a directory
  • mkdir, for making a directory
  • mv, for moving (renaming) files and directories 【也可以用来用来重命名、移动文件(要有路径名)】
  • rm, for removing (deleting) files
  • rmdir, for removing (deleting) directories

  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值