C语言从0到1算法小白训练营——day1

简介: 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.14
int main()
{
  int r = 0;//系统给r开辟4个字节的内存空间
  //从键盘输入r
  scanf("%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,data2
  scanf("%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—指令关键字—防止编译器优化

确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

相关文章
|
2月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
58 1
|
2月前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
65 4
|
5月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
119 1
|
1月前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
2月前
|
存储 缓存 算法
C语言在实现高效算法方面的特点与优势,包括高效性、灵活性、可移植性和底层访问能力
本文探讨了C语言在实现高效算法方面的特点与优势,包括高效性、灵活性、可移植性和底层访问能力。文章还分析了数据结构的选择与优化、算法设计的优化策略、内存管理和代码优化技巧,并通过实际案例展示了C语言在排序和图遍历算法中的高效实现。
50 2
|
2月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
55 1
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
71 1
|
2月前
|
存储 算法 数据管理
C语言算法复杂度
【10月更文挑战第20天】
C语言算法复杂度
|
2月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
158 7
|
2月前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
132 8
下一篇
开通oss服务