计算机科学cs50-笔记1

计算机科学cs50 上课笔记
原始网站

第2课

某些系统或应用的格式化是伪格式化,只是仅仅擦除存储器的开头的一段字节;

第3课

nano hello.c

#include <stdio.h>
#include <cs50.h>
int main(){
        string name = GetString();
        printf("hi %s!\n",name);
}

gcc hello.c -lcs50

这里需要理解 gcc -l 的用法,待学习。。。

第4课

vim hello4.c

#include <stdio.h>
int main(){
        printf("hello morningcat\n");
}

make hello4
cc hello4.c -o hello4

./hello4

make 底层使用的还是 gccclang (缩写为cc)


#include <stdio.h>
int main(){
    int x = 2;
    printf("int length:%lu\n", sizeof(x));
}

char 1
int 4
float 4
long 4 【在本机 macxOS Big Sur 11.1 上 long sizeof = 8】
long long 8
double 8


有意思的小程序

#include <stdio.h>
#include <unistd.h>
int main(){
    for(int i=0;i<100;i++){
        printf(" Percent complete:%3d%%", i);
        fflush(stdout);
        sleep(1);
    }
    printf("completed");
}

可惜 fflush(stdout); 在我的系统上并没有出现我想要的效果,并没有刷新

第6课

#include <stdio.h>
#include <string.h>

int
main(int argc, char *args[]) {
    printf("%d\n", argc);
    for (int i = 0; i < argc; i++) {
        for(int j=0,n=strlen(args[i]);j<n;j++){
            printf("%c ", args[i][j]);
        }
        printf("--> %s \n", args[i]);
    }
}

第7课 [第三周 1]

  1. 三目表达式

codition ? true_xx : false_xx;

  1. C 语言中的常量
#define PI 3.1415926
#define COUNT 333

第8课 [第三周 2]

brew install gdb
[brew 是 macxos下的包管理工具]
遇到问题please check gdb is codesigned - see taskgated(8)
echo “set startup-with-shell off” >> ~/.gdbinit


gcc -g swap.c -o swap

gdb swap

#include <stdio.h>
void swap(int *x, int *y);

int main(void) {
    int x = 1;
    int y = 2;
    swap(&x, &y);
    printf("x=%d, y=%d\n", x, y);
    return 0;
}

void swap(int * x, int * y) {
    int tmp = *x;
    *x = *y;
    *y = tmp;
}
start 开始调试
break main   在 main 方法处打断点
break 23     在第 23 行处打断点
run  开始到断点处
next     or n   下一步
step    进入方法内部
continue  98  
print 打印某个变量的值
backtrace 
quit

l 查看源码
p x   打印x的值
n 下一步
bt 堆栈

[New Thread 0x2403 of process 2422]

touch ~/.gdbinit
echo "set startup-with-shell off" >> ~/.gdbinit

bubble sort -> 时间复杂度 O( N 2 N^2 N2)

selection sort -> 时间复杂度 O( N 2 N^2 N2)


递归【注意:需要预防栈溢出】

第9课 [第四周 1]

归并排序思想:
On input of n elements:
If n < 2
return;
Else:
Sort left half of elements
Soft right half of wlwments
Merge sorted halves.

其中合并排序[Merge sorted halves]思想:
1.取两个列表的最小值进行比较【左右两个列表已经是有序列表,只需取最左边的值即可】
2.将结果放在新的列表里,并从原列表移除
3.不断重复1,2直至两个列表为空

时间复杂度 O( N ∗ l o g 2 N N*log_2N Nlog2N)

归并排序C语言实现

第10课 [第四周 2]

// * 在函数原型中和在函数体的含义是不同的
// 在函数原型中 * 表示指针,即内存地址
// 在函数体中 * 表示取某内存地址中包含的数据,*x表示x指针所指向内存中的值
void swap(int * x, int * y) {
    int t = *x;
    *x = *y;
    *y = t;
}

在这里插入图片描述

  • & 地址操作符
  • * 定位符

malloc

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc) {
    char s1[] = "hello world";
    printf("s1=%s\n", s1);
    printf("s1 length=%d\n", strlen(s1));

    char *s2 = (char *) malloc(sizeof(char) * (strlen(s1) + 1)); // \0 结尾
    if (s2 == NULL)return 1;

    int n = strlen(s1);
    for (int i = 0; i < n; i++) {
        s2[i] = s1[i];
    }
    s2[n] = '\0';
    printf("s2=%s\n", s2);
    free(s2);
    
    return 0;
}

#include <stdio.h>
#include <stdlib.h>

int main(int argc) {
    int i = 100; // 这里的 i 在`栈`中`main方法所在区域`中的某一块内存中
    int *x, *y;
    x = (int *) malloc(sizeof(int));  // 这里的 x 是在栈中main方法所在区域中声明了一个指针对象,指向了`堆`中的某一块内存,需要手动释放,否则会造成内存泄漏 
    *x = 42;
    printf("x=%d\n", *x);
    y = x;
    *y = 13;
    printf("x=%d\n", *x);
    printf("y=%d\n", *y);

    free(x);
    // free(y); 同一块内存不能释放两次
    // 若不释放内存 则会造成内存泄漏

    // int *z = 200; 
    // 上诉写法是不合法的,因为声明了一个指针但并没有申请内存,直接赋值会有问题
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值