0
点赞
收藏
分享

微信扫一扫

开发成长之路(1)-- C语言从入门到开发(入门篇一)


开发成长之路(1)-- C语言从入门到开发(入门篇一)_数组

内容不限于此思维导图


文章目录

  • ​​前言·鸡汤​​
  • ​​环境搭建​​
  • ​​编码规范​​
  • ​​基本数据类型​​
  • ​​标准输入输出​​
  • ​​分支循环​​
  • ​​分支​​
  • ​​循环​​
  • ​​while循环​​
  • ​​for循环​​
  • ​​break与continue​​
  • ​​无限循环​​
  • ​​函数与定制输入输出控制函数​​
  • ​​函数​​
  • ​​传值调用与引用调用​​
  • ​​作用域​​
  • ​​数组​​
  • ​​多维数组​​
  • ​​数组作为函数参数​​
  • ​​定制输入输出函数​​

前言·鸡汤

在这个浮华的“名利场”,我挺感谢这几天的冷静期。其实我一直知道自己该干什么,但是总有各种理由推迟,推迟,再推迟。

说到底,争。

一个“争”字,蒙蔽了双眼,获得了多少,又失去了多少,并不知道。

曾经我以为自己在这条路上已经很牛逼了,慢慢的也就开始飘了,心态变了,这也导致我失去了不少的东西。

曾经我以为曾经的大佬们已经“作古”,后来慢慢发现,他们只是站在了更高的层次,做出了自己的选择罢了。

谁又不是在自己目前所处的信息层面上做出的选择呢,只要努力过,都会有收获。

好了好了,不扯皮了,半年之期已到,我得回去带我的团队了。但是这半年没有练,手生,不能这么回去吧,就先在这里做一波总结归纳,归纳我这三年学习+项目经验,车速会快,篇幅很长,愿者上车,多多少少都会有收获。

环境搭建

对于老手,自动跳过这一趴吧,或者也可以看一下我有没有啥纰漏,毕竟小白需要这一趴。

编译器很多,大部分老师会在学生学习C语言的时候推荐使用VC,不带语言提示器的那种,说是可以提高学生的编码能力。我也不知道到底是不是这么一回事儿。我推荐使用VS,这样学的快,函数记不住的问题很严重吗?项目的车轮碾压过去,再记不住也得记住吧!!!

更何况这个系列到后面是会有需要用文本文件编程写项目的阶段。

VS下载地址:https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=Community&rel=16

官网2019社区版,不要标新立异选那些最新版的,出了问题到时候又调不过来。

下载之后点击安装,前面一路正常,会出困惑的应该是这个界面:

开发成长之路(1)-- C语言从入门到开发(入门篇一)_数组_02

开发成长之路(1)-- C语言从入门到开发(入门篇一)_c语言_03

如果说之后还有需要什么功能的话,也是可以再行添加的:

打开visual studio Installer,进入修改:

开发成长之路(1)-- C语言从入门到开发(入门篇一)_原力计划_04

不建议安装在C盘,换一个路径吧。

再接下来,就是创建一个项目:

开发成长之路(1)-- C语言从入门到开发(入门篇一)_原力计划_05

开发成长之路(1)-- C语言从入门到开发(入门篇一)_c语言_06

开发成长之路(1)-- C语言从入门到开发(入门篇一)_输入输出_07

新建一个写代码的地方:

Ctrl+shift+A

开发成长之路(1)-- C语言从入门到开发(入门篇一)_输入输出_08

编译运行代码:

开发成长之路(1)-- C语言从入门到开发(入门篇一)_#include_09

编码规范

分号:在 C 程序中,分号是语句结束符。也就是说,每个语句必须以分号结束。它表明一个逻辑实体的结束。

比方说:printf(“hello world”);

注释:以 // 开始的单行注释,这种注释可以单独占一行。

/* 
多行注释
多行注释
多行注释
*/

不能在注释内嵌套注释,注释也不能出现在字符串或字符值中。

标识符:C 标识符是用来标识变量、函数,或任何其他用户自定义项目的名称。一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)

C 标识符内不允许出现标点字符

程序入口:C语言的程序入口从main函数开始、

头文件:引用头文件的时候有两种方法:

#include <·····> //引用系统头文件
#include "·····" //引用我们自己的头文件

基本数据类型

开发成长之路(1)-- C语言从入门到开发(入门篇一)_#include_10

标准输入输出

#include<stdio.h>

int main() {
/*
这是一个输出的示例函数代码
*/

int i = 47;
printf("hello world");
printf("%d\n", i);
system("pause");
return 0;
}

%d就是控制符,用“,“隔开参数,进行格式化输出时,有许多控制符,常用的有:

%d 十进制有符号整数。
%s 字符串。
%c 单个字符。

盘点一下:

%d —— 以带符号的十进制形式输出整数
%o —— 以无符号的八进制形式输出整数
%x —— 以无符号的十六进制形式输出整数
%u —— 以无符号的十进制形式输出整数
%c —— 以字符形式输出单个字符
%s —— 输出字符串
%f —— 以小数点形式输出单、双精度实数
%e —— 以标准指数形式输出单、双精度实数
%g —— 选用输出宽度较小的格式输出实数

输入部分:

#include<stdio.h>

int main() {
int i;
printf("请输入整型i的值:\n");
scanf_s("%d", &i); #注意这里的写法,&i
printf("输入的值是:%d\n",i);

return 0;
}

分支循环

分支

开发成长之路(1)-- C语言从入门到开发(入门篇一)_#include_11

if(boolean_expression)
{
/* 如果布尔表达式为真将执行的语句 */
}
if(boolean_expression)
{
/* 如果布尔表达式为真将执行的语句 */
}
else
{
/* 如果布尔表达式为假将执行的语句 */
}
if( boolean_expression 1)
{
/* 当布尔表达式 1 为真时执行 */
if(boolean_expression 2)
{
/* 当布尔表达式 2 为真时执行 */
}
}
switch(expression){
case constant-expression :
statement(s);
break; /* 可选的 */
case constant-expression :
statement(s);
break; /* 可选的 */

/* -简介可以有任意数量的 case 语句 */
default : /* 可选的 */
statement(s);
}
switch(ch1) {
case 'A':
printf("这个 A 是外部 switch 的一部分" );
switch(ch2) {
case 'A':
printf("这个 A 是内部 switch 的一部分" );
break;
case 'B': /* 内部 B case 代码 */
}
break;
case 'B': /* 外部 B case 代码 */
}

三目运算符:

Exp1 ? Exp2 : Exp3;

这个三目运算符呢,相对来说并不是那么非要掌握的,拿来装逼用挺好。

如果在代码中看到别人这么写,理解一下就好:

问好前面是判断条件,如果为真,执行冒号前面的语句,否则执行冒号后面的语句。

循环

开发成长之路(1)-- C语言从入门到开发(入门篇一)_#include_12

while循环

while(condition)
{
statement(s);
}

statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。

condition 可以是任意的表达式,当为任意非零值时都为 true。当条件为 true 时执行循环。 当条件为 false 时,退出循环。

#include <stdio.h>
int main()
{
int i=1,j;
while (i <= 5)
{
j=1;
while (j <= i )
{
printf("%d ",j);
j++;
}
printf("\n");
i++;
}
return 0;
}

for循环

for ( init; condition; increment )
{
statement(s);
}

init 会首先被执行,且只会执行一次(可以放空,但是分号要有)。一般用于声明对象。

判断 condition(可以放空,默认为真)。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳到紧接着 for 循环的下一条语句。

执行完 for 循环主体,跳回上面的 increment 语句(可以放空)。一般用于更新循环控制变量。

如此,循环往复。

#include <stdio.h>

int main ()
{
/* for 循环执行 */
for( int a = 10; a < 20; a = a + 1 )
{
printf("a 的值: %d\n", a);
}

return 0;
}

break与continue

当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环以外的下一条语句。

它还可用于终止 switch 语句中的一个 case。

continue 会跳过当前循环中的代码,强迫开始下一次循环。

对于 for 循环,continue 语句执行后increment语句仍然会执行。对于 while 循环,continue 语句重新执行条件判断语句。

无限循环

相信我,总有一天你会需要无限循环的。

#include <stdio.h>

int main ()
{
for( ; ; ) //或者while(1)
{
printf("该循环会永远执行下去!\n");
}
return 0;
}

函数与定制输入输出控制函数

函数

函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。

return_type function_name( parameter list )
{
body of the function
}

在C语言中,一个函数的组成部分有如下:

返回类型:return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 可以是关键字 void。

函数名称:这是函数的实际名称(function_name)。函数名和参数列表一起构成了函数签名。

参数:当函数被调用时,有时候需要向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
参数中也存在默认参数,默认参数即在函数签名中赋予了某个参数默认值,如果在调用函数的时候不指定该参数值,则该参数取值为默认。
默认参数置于参数列表的最右端、
在给默认参数赋值的时候,最好指定参数名对应数据。

函数主体:函数主体包含一组定义函数执行任务的语句。

实现一个比大小的函数:

/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2)
{
/* 局部变量声明 */
int result;

if (num1 > num2)
result = num1;
else
result = num2;

return result;
}

调用这个函数:

int main ()
{
/* 局部变量定义 */
int a = 100;
int b = 200;
int ret;

/* 调用函数来获取最大值 */
ret = max(a, b);

printf( "Max value is : %d\n", ret );

return 0;
}

传值调用与引用调用

调用类型

描述

传值调用

该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。

引用调用

通过指针传递方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。

上面那就是传值调用,至于引用调用,等我讲指针了再说吧。现在讲也捋不清楚啊。

作用域

这个其实应该再编码规范的时候写的,但是那会儿给忘了,现在补上。

全局变量:在所有函数外部的全局变量,通常是在程序的顶部。全局变量在整个程序生命周期内都是有效的。记住这点,我们以后会为这点做出重大举措的!!!

局部变量:在函数或块内部的局部变量(这里的块指的是:函数、结构体、分支、循环、异常等),局部变量在函数外部是不可知的。

数组

开发成长之路(1)-- C语言从入门到开发(入门篇一)_#include_13

在 C 中要声明一个数组,需要指定元素的类型和元素的数量:

type arrayName [ arraySize ]; //这里的大小也可以不设置,能设置就设置

示例:

double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};

访问数组元素:下标访问法

#include <stdio.h>

int main ()
{
int n[ 10 ]; /* n 是一个包含 10 个整数的数组 */
int i,j;

/* 初始化数组元素 */
for ( i = 0; i < 10; i++ )
{
n[ i ] = i + 100; /* 设置元素 i 为 i + 100 */
}

/* 输出数组中每个元素的值 */
for (j = 0; j < 10; j++ )
{
printf("Element[%d] = %d\n", j, n[j] );
}

return 0;
}

多维数组

一般就开到两维,再高也少见。

type name[size1][size2]...[sizeN];
int threedim[5][4]; //第一个大小不能放空

初始化示例:

int a[3][4] = {  
{0, 1, 2, 3} ,
{4, 5, 6, 7} ,
{8, 9, 10, 11}
};

也可以这样:

int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

访问二维数组依旧可以用下标取值法。

数组作为函数参数

void myFunction(int *param) //不懂指针先不急
{
···
}


void myFunction(int param[10])
{
···
}


void myFunction(int param[])
{
···
}

那具体使用该当如何呢?

#include <stdio.h>

double getAverage(int arr[], int size)
{
int i;
double avg;
double sum=0;

for (i = 0; i < size; ++i)
{
sum += arr[i];
}

avg = sum / size;

return avg;
}

int main ()
{
/* 带有 5 个元素的整型数组 */
int balance[5] = {1000, 2, 3, 17, 50};
double avg;

/* 传递一个指向数组的指针作为参数 */
avg = getAverage( balance, 5 ) ;

/* 输出返回值 */
printf( "平均值是: %f ", avg );

return 0;
}

由于还没有涉及到指针,有些操作也不太方便现在写。

定制输入输出函数

我初学C语言的时候写的代码,献丑了。

那时候还不知道写文档的重要性,现在这个函数怎么用我还得看看

这个函数有什么用呢?为什么我要特地的放在这里?

函数功能:

实现一个用于控制输入输出的函数,可控范围包括:
注入长度、接收输入类型、是否明文输出等
支持回删,回车结束,esc退出

在我们后面用C语言写项目的时候会经常用到这个函数,而不是取用默认的scanf,scanf时不时的还会暴雷!!!

所以希望各位小伙伴看完之后可以自行实现一遍,加深印象。

/输入函数///
void getstr(char str[],int maxLen,int type,int isplainText)
/*
这是一个用于控制输入输出的函数,可控范围包括:
注入长度、接收输入类型、是否明文输出
支持回删,回车结束,esc退出

参数释义:
str[]:用于接收输入
maxLen:最大输入长度+1
type:接收输入类型:0(无所谓)、1(仅数字)、2(仅英文)
isplainText:是否明文输出:0是1否
*/
{
char ch;
int iLen = 0;
while(1)
{
ch = getch();

if(ch == '\b')
{
if(iLen>0)
{
printf("\b \b");
iLen--;
}
}
if(ch == '\r')
{
str[iLen] = '\0';
break;
}

if (ch == 27)
{
system("cls");
printf("退出成功\n");
exit(1);
}

if(iLen<maxLen-1)
{
switch(type)
{
case 0:
{
if(ch !='\b')
{
if(isplainText == 0)
{
putchar(ch);
}
else
{
putchar('*');
}
str[iLen] = ch;
iLen++;
}
}
break;
case 1:
{
if(ch >= '0' && ch <= '9')
{
if(isplainText == 0)
{
putchar(ch);
}
else
{
putchar('*');
}
str[iLen] = ch;
iLen++;
}
}
break;
case 2:
{
if(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')
{
if(isplainText == 0)
{
putchar(ch);
}
else
{
putchar('*');
}
str[iLen] = ch;
iLen++;
}
}
break;
}
}
}
}

写太长了怕是看不完,就分几篇写吧。

开发成长之路(1)-- C语言从入门到开发(入门篇一)_#include_14



举报

相关推荐

0 条评论