C语言学习记录-first.c

C语言学习记录

第一次使用Markdown,想通过写博客的方式记录并能加深学习。

first.c程序

C primer plus程序清单2.1

#include<stdio.h>/*<---包含另一个文件:该文件名的含义是 标准输入/输出文件。#include<stdio.h>作用相当于把stdio.h文件中的所有内容都输入该行。这是一种“拷贝-粘贴”的操作;这行代码是一条C预处理器指令,C编译器在编译前会对代码做一些准备工作,即预处理。所有的C编译器软件包都提供stdio.h文件。该文件中包含了供编译器使用的输入和输出函数(如printf())信息。顶部的信息集合--头文件*/
int main(void)//C程序一定从main()函数开始执行;圆括号作用是用于识别main()是一个函数,函数是C程序的基本模块; int是main()函数的返回类型。这表明main()函数返回给操作系统的值是整数 
{
	int num;  //声明 1.在函数中有一个名为num的变量。2.int表明num是一个整数;num是一个标识符,也就是一个变量、函数或其他实体的名称,因此声明把特定标识符与计算机内存中的特定位置联系起来,同时也确定了存储在某位置的信息类型或数据类型。
	num = 1; //赋值表达式语句 :在执行上一句 int num;声明时,编译器在计算机内存中为变量num预留了空间,然后在执行这行赋值表达式语句时,把值存储在之前预留的位置。

	printf("I am a simple");
	printf("comptuer.\n");
	printf("My favorite number is %d because it is first.\n",num);

	getchar();//添加到retunrn语句前,这行代码会让程序等待击键,窗口会在用户按下一个键后才关闭
	return 0;
}

//花括号标记函数的开始和结束,是规定,不能省略。

程序细节

1. #include指令和文件

#include<stdio.h>   //程序的第一行。
  include<stdio.h>的作用相当于把stdio.h文件中的内容都输入该行-----“拷贝–粘贴”操作

#include<stdio.h>

  • #include是一条c预处理器指令。通常,C编译器在编译前会对代码做一些准备工作,即预处理
  • stdio.h是一个文件,所有C编译器软件包都提供。该文件名的含义是标准输入/输出头文件包含了供编译器使用的输入和输出函数( 如printf() )信息。
    通常,在C程序顶部的信息集合被称为头文件
  • 头文件帮助编译器把程序正确地组合在一起。通常情况下,头文件包含了编译器创建最终可执行程序要用的信息。例如,头文件中可以定义一些常量( #define Blog “csdn” ),或者指明函数名以及如何使用它们。但是,函数的实际代码在一个预编译代码的库文件中。
  • 头文件就是一个工具箱,里面是装你需要的工具。要用什么工具就先准备好。
2. main()函数

C程序一定从main()函数开始执行。圆括号的作用是用于识别main()是一个函数。刚开始只需记住函数是C程序的基本模块。

int main(void)

  • int是main()函数的返回类型。这表明main()函数返回的值是整数,返回给哪里?返回给操作系统。
  • 通常,函数名后面的圆括号中包含一些传入函数的信息。该例子中没有任何传递信息,所以里面是void(C99和C11标准)
3. 注释
  • /* 一条注释,可以跨行,直到结束 */
 // 也是一条注释,但是必须得是单行。
这段话就不在上面那条注释里面了
4. 花括号、函数体和块

{

}

  • 所有C函数都使用花括号标记函数体的开始和结束。这是规定
  • 花括号还可用于把函数中的多条语句合并为一个单元或块。类似于Verilog-HDL里的begin和end。
5. 声明

int num;

  • int是C语言的一个关键字,表示一种基本的C语言数据类型。关键字是语言定义的单词,不能用作其他用途。例如,不能用int作为函数名和变量名。

  • num是一个标识符,也就是一个变量、函数或其他实体的名称;因此,声明把特定标识符与计算机内存中的特定位置联系起来,同时也确定了存储在某位置的信息类型或数据类型。
    这行代码叫做声明。

在该例中,int num;声明完成了两件事

  • 其一,在函数中有一个名为num的变量
  • 其二,int表明num是一个整数。int是一种数据类型(整形)。编译器使用这些信息为num变量在内存中分配存储空间。分号在C语言中是大部分语句和声明的一部分。

在C语言中,所有的变量都必须先声明才能使用。这意味着必须列出程序中用到的所有变量名或数据类型。
最好把变量声明在块的顶部,其他语句不能再声明前面。
例:

int main(void)
{
   int doors;
   int dogs;
   doors = 5;
   dogs = 3;
   //其他语句
  
}
6. 赋值

num = 1;
这行代码是赋值表达式语句。意思是“把值1赋给变量num”。在执行int num;声明时,编译器在计算机内存中为变量num预留了空间,然后在执行者行赋值表达式语句时,把值存储在之前预留的位置。可以给num赋不同的值,这就是num之所以被成为变量 的原因。
注意:

  • 该赋值表达式语句从右侧把值赋到左侧,并且该语句以分号结尾。
  • C语言是通过赋值运算符“=”完成赋值操作,而不是赋值语句 。根据C标准,C语言并没有所谓的“赋值语句 ”,有的书提到的赋值语句 实际上是“赋值表达式语句”!
7. printf()函数
printf("I am a simple ");
printf("computer.\n");
printf("My favorite number is %d because it is first.\n",num);

这3行都使用了C语言的一个标准函数:printf()
圆括号表明printf是一个函数名。圆括号中的内容是从main()函数传递给printf()函数的信息。例如,上面的第1行把 I am a simple 传递给printf()函数。该信息被称为参数,或者更确切地说,是函数的实际参数,【在C语言中,实际参数(实参)】是传递给函数的特定值,形式参数(形参)是函数中用于存储值的变量。
printf()函数用参数来做什么?该函数会查看双引号中的内容,并将其打印在屏幕上。
第一行printf()演示了在C语言中如何调用函数。

  • 只需输入函数名,把所需的参数填入圆括号即可。当程序运行到这一行时,控制权被转给已命名的函数(该例中是printf())。函数执行结束后,控制权被返回至主调函数,该例中是main()

第二行printf()函数的双引号中的\n字符并未输出。这是为什么?

  • \n的意思是换行。
    \n代表一个换行符
    对于printf()而言,它的意思是“在下一行的最左边开始新的一行”。打印换行符的效果与Enter键的作用相同。
  • 换行符是一个转义序列。转义序列用来代表难以表示或无法输入的字符。如\t代表Tab键,\b代表Backspace键(退格键)。每个转义序列都以反斜杠(\)开始。

第三行printf()参数中的%d有什么用?

  • 先看下函数的输出:
    My favorite number is 1 because it is first
    对比发现,参数中的%d被数字1代替了,而1就是变量num的值。

%d相当于一个占位符,其作用是指明输出num值得位置。

  • %提醒程序,要在该处打印一个变量。
  • d表明把变量作为十进制整数打印。
8. return语句

return 0;
int main(void)中的int表明main()函数应返回一个整数。C标准要求main()这样做。有返回值的C函数要有return语句。

  • 该语句以return关键字开始,后面是待返回的值,并以分号结束。
  • 如果遗漏main()函数中的return语句,程序在运行至最外面的右花括号(})时会返回0;但是不要遗漏它!

简单程序的结构

C程序的基本结构,程序由一个或多个函数组成,必须有main()函数。函数由函数体和函数体组成。函数头包括函数名、传入该函数的信息类型和函数的返回类型。通过函数名后的圆括号可识别出函数,圆括号可能为空,可能有参数。函数体被花括号括起来,由一系列语句、声明组成。
如下,本例用有一条声明,声明了程序使用的变量名和类型。然后是一条赋值表达式语句,变量被赋予一个值。接下来是一条printf()语句,调用printf()函数1次。最后,main()以return语句结束。

                 函数头
/*------------------------------------*/

   int main(void)
 
 
                 函数体
/*------------------------------------*/

{
声明---int q;
语句---q = 1;
语句---printf("%d is neat. \n",q);
return 0;
}
/*-------------------------------------*/

简而言之,一个简单的C程序如下

#include<stdio.h>
int main(void)
{
      语句
      return 0;
}

大部分语句都以分号结尾。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以回答您的问题。 首先,图是一种非线性数据结构,它由一组节点(顶点)和一组边组成。图可以用多种方式存储,其中邻接矩阵是一种常见的存储方式。邻接矩阵是一个二维数组,数组中的元素表示图中两个节点之间是否有边相连。如果节点i和节点j之间有边相连,则邻接矩阵中第i行第j列的元素为1,否则为0。 下面是用C语言实现图的邻接矩阵存储: ``` #define MAX_VERTEX_NUM 100 //最大顶点数 typedef struct { int vexs[MAX_VERTEX_NUM]; //顶点数组 int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵 int vexnum, arcnum; //图的顶点数和边数 } MGraph; ``` 其中,vexs数组用来存储图的顶点,arcs数组用来存储邻接矩阵,vexnum表示图的顶点数,arcnum表示图的边数。 接下来是图的遍历。图的遍历是指按照某种顺序访问图中的每个节点。常用的两种遍历方式是深度优先遍历和广度优先遍历。 深度优先遍历(Depth-First-Search,DFS)是一种先访问深度较深的节点的遍历方式。具体实现可以用递归或栈来实现。 下面是用C语言实现图的深度优先遍历: ``` void DFS(MGraph G, int v, int* visited) { visited[v] = 1; //标记节点v已经被访问 printf("%d ", G.vexs[v]); //输出节点v的值 for (int i = 0; i < G.vexnum; i++) { if (G.arcs[v][i] == 1 && visited[i] == 0) { //如果节点v和节点i之间有边相连且节点i未被访问过 DFS(G, i, visited); //递归访问节点i } } } void DFSTraverse(MGraph G) { int visited[MAX_VERTEX_NUM] = {0}; //标记数组,用来记录每个节点是否被访问过 for (int i = 0; i < G.vexnum; i++) { if (visited[i] == 0) { //如果节点i未被访问过 DFS(G, i, visited); //从节点i开始进行深度优先遍历 } } } ``` 其中,DFS函数是递归实现的深度优先遍历,DFSTraverse函数是遍历整个图的入口函数。 广度优先遍历(Breadth-First-Search,BFS)是一种先访问深度较浅的节点的遍历方式。具体实现可以用队列来实现。 下面是用C语言实现图的广度优先遍历: ``` void BFSTraverse(MGraph G) { int visited[MAX_VERTEX_NUM] = {0}; //标记数组,用来记录每个节点是否被访问过 int queue[MAX_VERTEX_NUM]; //队列 int front = -1, rear = -1; //队列的头和尾 for (int i = 0; i < G.vexnum; i++) { if (visited[i] == 0) { //如果节点i未被访问过 visited[i] = 1; //标记节点i已经被访问 printf("%d ", G.vexs[i]); //输出节点i的值 queue[++rear] = i; //将节点i入队 while (front != rear) { //当队列不为空时 int j = queue[++front]; //将队列头部元素出队 for (int k = 0; k < G.vexnum; k++) { if (G.arcs[j][k] == 1 && visited[k] == 0) { //如果节点j和节点k之间有边相连且节点k未被访问过 visited[k] = 1; //标记节点k已经被访问 printf("%d ", G.vexs[k]); //输出节点k的值 queue[++rear] = k; //将节点k入队 } } } } } } ``` 其中,BFSTraverse函数是遍历整个图的入口函数,使用了队列来实现广度优先遍历。 希望我的回答能够解决您的问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值