用c语言实现llf算法,C语言复习

1 编辑、编译、链接

2 printf scanf用于显示器

fprintf fscanf用于文件

sprintf sscanf用于字符串

3 面试的时候必须注释,否则人家当你没有工作经验

4 全局变量有声明和定义的区别,局部变量不区分声明和定义,都是定义

5 声明可以有多个,定义只能有一个

6printf不会进行数据类型转换

7 自动转换和与强制转换,赋值的时候会自动转换,int num=3.5;int是3,+-*/会自动转换

8 常量,一旦赋值,不能修改。#define const都是常量。const只是限定代码不能直接修改。变量,可以修改。

9 标识符用于函数名称,变量名称

10 代码要注意软件工程规范

11 scanf("a=%d",&a);要输入a=10

12printf, scanf格式控制

13 C语言把所有设备当作文件处理。stdin键盘stdout显示器stderr错误stdprn打印机

14 运算符的优先级和结合性,解析复杂表达式

++自增1,*间接运算符,优先级一样,自右至左

1 #define _CRT_SECURE_NO_WARNINGS

2

3 #include

4 #include

5

6 main()//++自增1,*间接运算符,优先级一样,自右至左

7 {8 int a[5] = { 1,2,3,4,5};9 int *p =a;10

11 //printf("%d

", *p++);//结果1,等价于*(p++)12

13 //printf("%d

", *++p);//结果2

14

15 printf("%d", ++*p);//结果2

16

17 system("pause");18 }

15 赋值运算,嵌入式赋值,赋值会自动转换数据类型

16 逻辑与,用于某些灯泡强行关闭,某些灯泡不变。

逻辑或,用于某些灯泡强行开启,某些灯泡不变。

异或,记忆:民政局,同性0,异性1

17 while, do...while, for, 递归

18 break, continue

19 逻辑表达式,关系表达式

20 注意逻辑表达式短路效应

短路:与

1 #define _CRT_SECURE_NO_WARNINGS

2

3 #include

4 #include

5

6 main()7 {8 int a = 10;9 int b = 0;10 printf("%d", b && ++a);11 printf("%d", a);12

13 system("pause");14 }

短路:或

1 #define _CRT_SECURE_NO_WARNINGS

2

3 #include

4 #include

5

6 main()7 {8 int a = 10;9 int b = 0;10 printf("%d", a || ++b);11 printf("a=%d,b=%d", a, b);12

13 system("pause");14 }

21 整数的极限#include

22 八进制0开头

十进制

十六进制0x开头

23 整数常量的后缀

10

10u无符号型

10l长整型

24 浮点,就是浮动的小数点

long long %ll 用于处理海量数据,占8个字节

1 #define _CRT_SECURE_NO_WARNINGS

2

3 #include

4 #include

5

6 main()7 {8 long long data = 1234567890;9 printf("%lld", data);10

11 printf("sizeof(long long)=%d", sizeof(long long));12

13 system("pause");14 }

25 long double %lf 打印浮点数,超过8个字节就是%llf

1 #define _CRT_SECURE_NO_WARNINGS

2

3 #include

4 #include

5

6 main()7 {8 printf("sizeof(long double)=%d", sizeof(long double));9

10 system("pause");11 }

26 short int等价于short,double float等价于double

27 必须掌握中文处理,宽字符,宽字符串的增删查改

28 缓冲区的概念,sizeof不是函数,而是运算符

29 return和函数参数会自动进行数据类型转换

1 #define _CRT_SECURE_NO_WARNINGS

2

3 #include

4 #include

5

6 int add(int a, int b)//形参自动把实参10.0转换为int类型

7 {8 return a + b + 10.0;9 }10

11 main()12 {13 printf("%d", add(10.0, 10));14

15 system("pause");16 }

30 强制类型转换(int)10.9

问:什么时候用到强制类型转换?

printf不会自动转换

1 #define _CRT_SECURE_NO_WARNINGS

2

3 #include

4 #include

5

6 main()7 {8 double db = 10.9;9

10 printf("%d", (int)db);//printf不会自动转换

11

12 system("pause");13 }

31 数组需要理解顺序排列。指针访问,选择排序、冒泡排序、插入排序

32 指针循环数组,for(int *p=a;p

33 函数一定要有返回值,函数参数传递的顺序,从右到左

1 #define _CRT_SECURE_NO_WARNINGS

2

3 #include

4 #include

5

6 main()7 {8 int num = 10;9

10 printf("%d,%d", num, num++);11

12 system("pause");13 }

34 数组是参数唯一没有副本机制,结构体数组、指针数组同理。数组作为参数,传递地址,数组退化为指针,指针数组退化为二级指针

35 函数改变一个外部变量,需要地址,改变一个外部指针,需要二级指针

36 3BAT必须搞定快速排序法

37 可变参数的函数,回调函数学会实现劫持

38 指针是一种数据类型,类型决定了步长、解析方式

39 *p++ ++*p指针的运算,+-,指针的运算与类型密切相关

40 指针遍历数组,二级指针遍历指针数组,指向函数指针的指针遍历指针数组

41 int a[10];实际上a是int *类型

int *a[10];实际上a是int **类型

42 int a[3][4];实际上a是int (*)[4]类型

三者区别:

&a整个数组

*a列指针

a行指针

43 理解指针与数组的区别,字符串是' '结尾

char *p="123";

p存储了地址

char str[100]="123";

str存储了字符串

p=str;//OK

44 字符串 memcpy,memset, strcat, strcmp, strcpy, strstr, puts, gets, printf, scanf, sprintf, sscanf 亲自实现

45 #define替换

#include包含

#undef 取消#define的作用范围

#if...#elif...#else...#endif

#ifdef...#endif

#ifndef...#endif

46 C语言内联函数就是#define

问:什么时候用到内联函数?

提升效率

#define X(n) n*n*n

带参数的宏定义

问:如何规避以下问题?

#define X(n) (n)*(n)*(n)

1 #define _CRT_SECURE_NO_WARNINGS

2

3 #include

4 #include

5

6 #define X(n) n*n*n

7

8 main()9 {10 printf("%d", X(3));11

12 printf("%d", X(1 + 2));13

14 system("pause");15 }

47 #标识符添加""

##链接标识符

#define要用换行

1 #define _CRT_SECURE_NO_WARNINGS

2

3 #include

4 #include

5

6 #define Run(M) system(M);

7 printf("%s", M);8

9 main()10 {11 Run("calc");12

13 system("pause");14 }

48 一般头文件只能存放声明,不要存放定义,避免重复包含。

如果头文件存放定义,应该加上预编译,防止重复包含。

1 #ifdef M2 #define M

3 int add(int a, intb)4 {5

6 }7 #endif

49 C的结构体不可以有方法,但是C++可以有

如何让C的结构体实现有方法?

使用函数指针

50 结构体只有初始化可以直接赋值,可以赋值另外一个结构体变量的值

->访问方式

.访问方式

1 struct info info1 = { 1,"123"};2 structinfo info2;3

4 info2 = { 1,"123" };//错误

5 info2 = info1;//正确

51 枚举体,共用体(主要用于嵌入式),理解位域的概念

1 #define _CRT_SECURE_NO_WARNINGS

2

3 #include

4 #include

5

6 struct in

7 {8 char ch : 3;//位域,节约内存

9 char ch1 : 4;10 };11

12 main()13 {14 printf("%d", sizeof(struct in));15

16 struct inin1;17 in1.ch = 20;18

19 printf("%c", in1.ch);20

21 system("pause");22 }

52 calloc, malloc, realloc三大内存分配方式

53 数组优点:查询,修改

链表优点:插入,删除

二叉树可以综合以上优点

54 函数指针,可以实现回调(劫持)

55 指针数组,数组指针

56 声明四大变量auto, extern, register, static

57 const 限定不能直接赋值

58 VC只是建议,GCC就是强制,volatile会自动从内存读取,防止变量被意外修改而不知道

1 #define _CRT_SECURE_NO_WARNINGS

2

3 #include

4 #include

5 #include

6

7 main()8 {9 time_t start, end;10 double res = 0;11

12 time(&start);//获取时间,传递给start

13

14 for (volatile int i = 0;i < 999999999;i++)15 {16 res +=i;17 }18

19 printf("%f", res);20

21 time(&end);//获取结束时间

22

23 printf("消耗时间%f", difftime(end, start));24

25 system("pause");26 }

LLF(Least Loaded First)算法,也称为最轻负载调度算法,是一种用于多处理器系统中任务调度的策略,目标是将任务分配给当前负载最小的处理器。在C++中实现LLF算法,你需要考虑以下几个步骤: 1. 定义任务和处理器的数据结构:通常会有一个任务类(Task)包含任务的执行时间和处理器ID,以及每个处理器的负载(Load)信息。 ```cpp class Task { public: int id; int executionTime; int processorId; int load; // 初始化为0 }; ``` 2. 创建处理器类(Processor)存储任务并维护负载: ```cpp class Processor { private: std::vector<Task> tasks; int currentLoad; public: // 添加任务 void addTask(Task task) { tasks.push_back(task); updateLoad(); } // 更新负载 void updateLoad() { for (const auto& task : tasks) { currentLoad += task.executionTime; } } // 获取当前负载 int getCurrentLoad() { return currentLoad; } }; ``` 3. 实现调度函数(SchedulingFunction): ```cpp Task* schedule(Processor& processor) { // 找到负载最小的处理器 auto minLoadIndex = std::min_element(processor.tasks.begin(), processor.tasks.end(), [](const Task& a, const Task& b) { return a.load < b.load; }); if (minLoadIndex == processor.tasks.end()) { // 如果所有任务都为空,选择任意一个 minLoadIndex = processor.tasks.begin(); } // 移除并返回当前最小负载的任务 Task* lightestTask = &(*minLoadIndex); processor.tasks.erase(minLoadIndex); processor.updateLoad(); return lightestTask; } ``` 4. 示例调度循环: ```cpp int main() { // 创建处理器和任务 Processor p1, p2; // 添加任务到处理器... while (!p1.tasks.empty() || !p2.tasks.empty()) { if (p1.getCurrentLoad() < p2.getCurrentLoad()) { Task* task = schedule(p1); // 任务调度到p1 } else { Task* task = schedule(p2); // 任务调度到p2 } // 执行任务,任务完成后更新处理器负载 task->processorId = (task->processorId == p1.id) ? p2.id : p1.id; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值