C语言从0到1算法小白训练营——day1
我们先从小白开始:
一、怎么学习
1、算法是我们未来进企业工作必须会的。
算法 --->企业
2、学习编程语言的方法:
过,抄,访,改,调,练,看,悟
2.1 过:
学习一门新的语言,第一步就是把它所涉及的基础知识大体过一遍,不求深度理解,只求了解。
2.2 抄
刚开始写代码,没有多少人一上来就能立刻写出一个很强大完善的代码,甚至连一些基础的语法都会写错,这时候抄代码就很关键,从书上抄,从例子抄,抄同学的等等,边抄边想,边想边回忆语法。
2.3 模仿改:
自己会抄写一些简单的代码,熟悉了一遍这个编程语言的简单语法之后,但是还不清楚怎么下手写一个完整的代码模块,所以这一步要模仿写,仿照给出的代码写一个属于自己的程序。
2.4 勤调试:
代码出错或者遇到问题时,调试!
一名优秀的程序员是一名出色的侦探。
每一次调试都是尝试破案的过程。
2.5 练
刷题
2.6 看
同一个题,有着不同的解法,自己写完之后,多看别人的代码,看看不同的思路,你写的时候想到没有,多积累。
2.7 悟
找到写代码的感觉和成就感,保持下去。
接下来我们正式开始学习,从简单开始:
先来道简单案例热热身:
1、案例1:求圆的面积
条件:从键盘输入半径r
算法:面积=π*r*r
分析:
1、π是常量,所以要#define定义的标识符常量
知识点:#define定义的标识符常量
格式:#define 标识符 字面常量
tip:习惯上常量名用大写,变量名用小写
代码实例:
#include<stdio.h>//预处理,对scanf,printf函数的声明//#define定义的标识符常量
#define PI 3.14int main()
{int r = 0;//系统给r开辟4个字节的内存空间//从键盘输入rscanf("%d", &r);//输出面积printf("%.2f\n", PI * r * r);return 0;
}
2、数据类型
2.1 每种类型的大小是多少?
代码实例:在32位平台下的大小(在VS:X86是32位环境,X64是64位环境)
#include<stdio.h>int main()
{printf("%d\n", sizeof(char));printf("%d\n", sizeof(short));printf("%d\n", sizeof(int));printf("%d\n", sizeof(long));printf("%d\n", sizeof(long long));printf("%d\n", sizeof(float));printf("%d\n", sizeof(double));return 0;
}
运行结果:
知识点:sizeof-关键字(如变量名不能和关键字一样)-操作符-计算类型或变量所占内存的大小
单位:字节
tip:了解计算机的单位:
计算机存储的是二进制,一位二进制只能存放 0或1(1bit)
bit-比特位-一个比特位存放一个二进制
byte-字节-8bit
kb-1024byte 10月24号程序员节
mb-1024kb
gb-1024mb
tb-1024gb
pb-1024tb
eb-1024pb
2.2 为什么出现这么多类型?
类型的意义:
1、使用这个类型开辟内存空间的大小(大小决定了适用范围)
2、如何看待内存空间的视角
总结:就是要我们使用时选择合适的类型,合理的利用内存空间
类型的使用:创建变量(变量:先定义,后使用)
3、案例:用分函数(自定义函数)的方式,求两个数的和
分析:
1、定义两个变量data1 data2 从键盘输入
2、调用分函数,去计算两个数的和(传值调用)
3、得到分函数内部的计算结果(怎么得到?通过函数的返回值,得到函数的计算结果)
知识点:
1、函数的组成
ret_type fun_name(para,*)
{
statement;//语句项
}
ret_type:返回类型
fun_name:函数名
para:函数参数(注:函数参数之间用逗号隔开)(*就是等等的意思)
函数体:由{}括起来的
2、函数调用:
传值调用-->形参不影响实参,传址调用-->形参可以影响实参。
代码实例:
#include<stdio.h>//自定义函数--实现求两个数的和
int add_fun(int a, int b)
{return a + b;
}int main()
{int data1 = 0;int data2 = 0;//输入data1,data2scanf("%d %d", &data1, &data2);//调用函数,求和int result = add_fun(data1, data2);//输出和printf("%d\n", result);return 0;
}
4、无符号数 unsigned
数据没有符号位,自身的所有二进制位,都是数据位
5、有符号数 signed 默认一般省略掉
注意:二进制最高位为符号位,其他位为数据位
最高位为1 表示负数
最高位为0 表示正数
6、结构体struct和共用体union
结构体struct中的成员拥有独立的空间;
共用体union中的成员共享同一份空间。
7、enum和void
enum枚举 将变量要赋值的值一一列举出来
void表示空类型(无类型):通常应用于函数的返回类型、函数的参数、指针类型
8、其他关键词
(1)auto
自动类型:动态存储方式 默认一般省略掉
注:①局部变量才有(可理解成局部变量就是自动变量)
②函数的参数具有自动变量的属性,但是不允许对形参使用auto关键字
③自动变量的作用域局限于定义它的语句块或函数。出了其作用域,其值即从内存中撤销。
④不同语句块中的auto变量可以同名。同名变量不会使用相同的内存单元。
(2)register
寄存器变量:①register只是建议的作用,会不会放在寄存器,编译器决定。
补充:计算机上,数据都可以存储在哪里?
注:寄存器变量不能取地址。
(3)static
在C语言中:static是用来修饰变量和函数的
①修饰局部变量-称为静态局部变量
②修饰全局变量-称为静态全局变量
③修饰函数-称为静态函数
①静态局部变量
代码实例:
代码1:自动局部变量
#include<stdio.h>void test()
{int a = 0;a++;printf("%d\n", a);
}int main()
{int i = 0;for (i = 0; i < 5; i++){//调用函数test();}return 0;
}
运行结果:
代码2:static修饰局部变量
#include<stdio.h>void test()
{static int a = 0;a++;printf("%d\n", a);
}int main()
{int i = 0;for (i = 0; i < 5; i++){//调用函数test();}return 0;
}
运行结果:
如上,我们可得:
1、普通的局部变量是放在栈区上的,这种变量的生命周期是进入作用域创建,出作用域释放。
2、但是局部变量被static修饰后,这种变量就放在静态区,放在静态区的变量生命周期是创建好后,直到程序结束才释放。
3、本质上:static的修饰改变了局部变量的存储位置,因为存储位置的差异,使得执行效果不一样。
注意:静态局部变量是不影响作用域的!!!但是生命周期发生了变化,变长了。
②静态全局变量
图1:不修饰:全局变量具有外部链接属性
图2:修饰:全局变量的外部链接变成了内部链接
从编译器实践中,我们发现:
1、全局变量本身是具有外部链接属性的,在A文件中定义的全局变量,在B文件中可以通过[链接]使用(extern—声明外部符号)
2、但是如果全局变量被static修饰,这个外部链接属性就变成了内部链接属性,这个全局变量只能在自己所在的源文件内部使用。
3、static的修饰,会把外部链接属性变成内部链接属性,最终使得全局变量的作用域变小了。
③静态函数
1、静态函数同全局变量一样,函数自身是具有外部链接属性的,被static修饰后,外部链接属性就变成内部链接属性,使得这个函数只能在自己所在的源文件内部使用,其他源文件无法使用(限制了作用域)
总结:
1、局部没有链接,全局才有链接
2、static修饰局部变量不影响作用域,但是生命周期变长了。
3、static修饰全局变量和函数、限制的是作用域
4、注意:函数没用生命周期,他只是一个代码
5、静态变量和全局变量不赋初值编译时自动赋初值0(对数值型变量)或空字符(对字符变量),而对自动变量不赋初值则它的值是随机值(不确定的)。
6、静态局部变量在编译时赋初值,即只赋初值一次;而对自动变量赋初值是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句
(4)typedef-关键字-类型重命名-相当于别名(小名)
代码实例:
//类型重命名将unsigned int重命名为uint(相当于小名,简化)
typedef unsigned int uint;int main()
{//a,b这两个变量的类型是一样的unsigned int a = 2;uint b = 3;return 0;
}
(5)const——修饰的常变量
图1:可以得出const修饰的常变量,不能被修改
图2:可得出const修饰的常变量a,本质上还是变量
总结:const修饰的常变量在C语言中只是在语法层面限制了,变量a不能直接被修改,但是a的本质还是一个变量,所以叫常变量。
(6)volatile—指令关键字—防止编译器优化
确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
C语言从0到1算法小白训练营——day1相关推荐
- 一篇解双链表(0基础看)(C语言)《数据结构与算法》
目录 序言 带头双向循环链表 1. 概念 2. 效果展示图 3. 接口实现 3.01. 本文章要实现的接口 3.02. 双链表的实现 3.03. 双链表的初始化 3.04. 打印链表 3.05. 动 ...
- 零编程基础学python-如果是一个纯0编程基础的小白,如何学Python
Python 可用的地方非常多.无论是从入门级选手(爬虫.前端.后端.自动化运维)到专业级数据挖掘.科学计算.图像处理.人工智能,Python 都可以胜任.或许是因为这种万能属性,周围好更多的小伙伴都 ...
- 【每日算法】C语言8大经典排序算法(2)
接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...
- 数据结构源码笔记(C语言):置换-选择算法
//实现置换-选择算法#include<stdio.h> #include<malloc.h> #include<string.h> #include<std ...
- Algorithm:C++语言实现之链表相关算法(链表相加、链表的部分翻转、链表划分、链表去重、重复元素全部删除)
Algorithm:C++语言实现之链表相关算法(链表相加.链表的部分翻转.链表划分.链表去重.重复元素全部删除) 目录 一.链表 1.1.链表相加 1.2.链表相加 2.1.链表的部分翻转 2.2. ...
- Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)
Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...
- 《趣题学算法》—第0章0.3节算法的伪代码描述
本节书摘来自异步社区<趣题学算法>一书中的第0章0.3节算法的伪代码描述,作者徐子珊,更多章节内容可以访问云栖社区"异步社区"公众号查看. 0.3 算法的伪代码描述 上 ...
- rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)
原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...
- 二分查找算法举例说明C语言,C语言快速排序与二分查找算法示例
本文实例讲述了C语言二分排序与查找算法.分享给大家供大家参考,具体如下: 题目:首先产生随机数,再进行快速排序,再进行二分查找. 实现代码: #include #include #include vo ...
最新文章
- 孙正义60亿贱卖波士顿动力,狂降至3折,现代汽车接盘
- win10 vEthernet
- 基于PHP的CURL快速入门
- python正则表达式怎么用_Python如何使用正则表达式
- Traceroute程序
- facebook开源的prophet时间序列预测工具---识别多种周期性、趋势性(线性,logistic)、节假日效应,以及部分异常值
- 动态链接库的设计(DLL)
- PHP将swf转为gif,swf怎么转换成gif 怎么把swf转换成gif
- 前端需要学python吗_python是前端语言吗
- Windows Azure AppFabric Caching入门简介
- 智能世代的工业/嵌入式网络与I/O桥接芯片解决方案
- 夺宝奇兵 (优先队列 + 贪心 + 暴力枚举)
- node节点kubelet报错 node \“xxxxx“ not found
- linux shell 操作二进制文件(xxd、dd)
- java小球模拟平抛运动_实操项目跳跃的小球
- 11.0592 M晶振
- 蓝桥杯比赛单片机文件组织
- Android一键锁屏源码
- keil v5中下载程序时遇到错误:NO ULINK2/ME Device found
- 计算机开机关机清除键都是什么,详细教您win10电脑关机后自动开机怎么解决