2023年信息科学与工程学院学生科协第一次软件培训

news2024/12/23 15:39:17

2023年信息科学与工程学院学生科协第一次软件培训

运行第一个代码(“Hello World!”)

首先,我们先看以下程序:

#include <stdio.h>
int main()
{
    printf("Hello World!");
    return 0;
}

输出应该是这个样子:

Hello World!

显然,这个程序是可以成功运行的

那么,它为什么能成功运行呢?这就是我们接下来的第一个主题:

初识C语言代码的具体结构

简单来说,一个C程序就是由若干头文件函数组成。

头文件

以上面的程序为例,下面这一行代码就是头文件。

#include <stdio.h>

你可以认为这就是一条预处理命令, 它的作用是通知C语言编译系统在对C程序进行正式编译之前需做一些预处理工作。有了头文件,你就可以在你写的C语言程序中调用其他文件定义的函数,即可以在该程序中使用其他文件写好的部分内容,列如 p r i n t f printf printf s c a n f scanf scanf

ppt上已经给出常见的头文件和函数,以及查找相关函数的方法,这里就不过多赘述了

(主)函数

一个程序中,有且仅有一个主函数

主函数的函数名是main,也就是 “主要的” 的意思,主函数就是下面的:

int main()
{
    // DoSomething
    return 0;
}

如果不想在考试中得到一个非常好看的0分的话,主函数这个格式就按照我上面写的这样写就行 (先不谈什么void main()的抽象使用方式和return 0;要不要写,为何要写,如果感兴趣的话可以百度)

好的,主函数说完了,我们来说一下一般的函数。

在C语言程序中,函数的形式应该是这样的:

返回值类型 函数名(参数值) //这里的括号可不是对函数名的解释,这个括号是实打实需要写上的
{
    // DoSomething
    return 返回值;
}

我们一般用 f u n c t i o n function function这个词代表函数,所以我们下面就定义一个简单的函数:

int fun(int x)
{
    x = x + 1;
    return x;
}

然后我们执行这样的一个语句:

int a = fun(3);

显然,a的赋值是4。

(这里另外提一嘴,如果你要在一个函数中引用另一个函数的东西,请先确保该函数被声明)

比如:

#include <stdio.h>
int slove(int b)
{
    b = 1 + fun(3);
    return b;
}
int fun(int x)
{
    x = x + 1;
    return x;
}
int main()
{
    int a = slove(5);
    printf("%d",a);
    return 0;
}

哦,这个程序好像比较复杂,正好,我们来学习一下C语言语句的运行顺序。

首先执行的是第一句的头文件,这是毋庸置疑的。

然后,先执行主函数中的那句话,

由于a的定义引用到了函数slove,所以我们要执行函数slove,该函数的传入的参数是5(也就是说此时的b = 5)

但是这不是主要的,因为我们的b又在后面被修改了,可以看到,b = 1 + fun(3)

此时,我们要引用fun(3),可是我们把这段代码在本地编译运行时可以发现这一行报错了(为什么呢)

我们都知道一般来说C语言都是从上往下运行的,显然,slove前面并没有任何关于fun()函数的定义,所以在这个函数中,slove就没法引用fun函数,导致报错

那我们不妨换个写法:

#include <stdio.h>
int fun(int x)
{
    x = x + 1;
    return x;
}
int slove(int b)
{
    b = 1 + fun(3);
    return b;
}
int main()
{
    int a = slove(5);
    printf("%d",a);
    return 0;
}

此时,我们能够得到如下输出

5

这样通过一个程序我们就完成了C语言的运行顺序以及函数的调用的基本学习

输入与输出

scanf函数

使用格式:

scanf("变量数据类型", &变量名);

作用:

获取若干个数据并赋值于指定的变量

使用:

#include <stdio.h>
int main()
{
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d", a);
    printf("%d", b);
    return 0;
}

衷心提醒:

不要写成如下的输入方式,否则你会经历很多很多挫折。

scanf("%d,%d", &a, &b);//理论上这是正确的,但是逗号的输入很容易因为中英文的输入法出问题,所以别写
scanf("%d", a); //忘了加取地址符!

printf函数

使用格式:

printf("变量数据类型", 变量名);

使用:

使用:
#include <stdio.h>
int main()
{
	int a;
	scanf("%d", &a);
	printf("%d", a);
	return 0;
}

转义字符

转义字符有很多,也是因为直播中讲过,我们只挑两个来解释:

  1. \n,意义是换行,例如
printf("1\n2");

那么你的输出应该是:

1
2
  1. \0,意义是空字符,同时代表着字符串的结束,列如
printf("1234\0ABC");

你会得到如下的输出:

1234

变量的定义

格式:

变量的数据类型 变量的名称;

int a;

也可以一次定义多个变量

int a, b;

变量的命名规则:

1.可以用小写字母、大写字母、数字和下划线(即‘_’)来命名。

2.名称的第1个字符必须是字符或者下划线,不能是数字

进一步了解数据类型

整形数据的存储

00000011

在数据的储存时,一个字节由八个二进制组成: ( 1 B y t e = 8 b i t ) (1 Byte = 8 bit) 1Byte=8bit

有符号类型(signed):第一位为符号位,0表示正数,1表示负数,所以范围为 [ − 128 , 127 ] [-128,127] [128,127]

无符号类型(unsigned):没有符号位,范围为 [ 0 , 255 ] [0,255] [0,255]

一个int占有4个字节,即 4 B y t e 4Byte 4Byte 32 b i t 32bit 32bit。所以int的范围是

( − 2147483648 ~ 2147483647 ( − 2 31 ~ 2 31 − 1 ) ) (-2147483648~2147483647(-2^{31} ~ 2^{31}-1)) (21474836482147483647(2312311))

负数的存储

计算机只能做加法,不能做减法,减去一个数,等于加上一个负数。

在计算机中,负数以补码的形式存在

补码

  1. 对原码除符号位以外取反(1变0,0变1)

  2. 加一

浮点型数据的存储

这不是必须了解的内容,大家只需要记住两种浮点型数据的精度范围就好了

  1. float 的精度是6~7位有效数字
  2. double的精度是15~16位有效数字

想了解原理的同学可以点这里浮点数的底层原理和精度损失问题

变量的初始化

有三种初始化变量的方法

  1. 在声明变量的同时指定初值
int a = 3, b = 2;
int c = 4;
  1. 先声明变量,再赋值
int a, b;
a = 3;
b = 2;
  1. 从外部读入数据
int a;
scanf("%d", &a);

在这里我要问,C语言中的单个等于号(也就是赋值)与数学中的等于是相同的含义吗?

显然不是的

int a = 2;
if (a = 1) printf("Yes");
else printf("No");

输出是这样的

Yes

因为if中执行的是赋值,而不是判断,如果你要写判断a 和 1 相等的话,应该这样写

int a = 2;
if(a == 1) printf("Yes");
else printf("No");

这一点大家一定不要记混哦~

变量的转换

赋值运算中的自动类型转换

这一部分在直播和ppt中已经提到过了,我们就简要说几个例子吧

double x;
x = 4.6;
printf("%d", x);

输出应该是

4

不难看出,浮点型小数如果要转化成整数,后面的小数位数会被直接抹掉,不会有任何的四舍五入

强制类型转换

格式:(数据类型)(表达式)

这里的表达式可以为常量,变量或表达式

#include <stdio.h>
int main()
{
    int i, j;
    double f = 4.5;
    i = (int)f;
    j = (int)(f + 2.5);
    printf("%d %d", i, j);
    return 0;
}

输出为:

4 7

算术表达式

算术运算符

运算符类型举例含义
+一元运算符+aa的值
-一元运算符-aa的负值
+二元运算符a+ba与b的和
-二元运算符a-ba与b的差
*二元运算符a*ba与b的积
/二元运算符a/ba除以b的商(整除)
%二元运算符a%ba除以b的余数(取余)

关于/与%更多的细节:

  1. 正负问题

    / :若一个为负数则结果为负数,两个为负数则负负得正

    % :分子为负则结果为负,分子为正则结果为正,不受分母影响

  2. 小数问题

    / :若两个都是整数,则做整除运算;若有一个浮点数,则做实数除法

    % :要求两个都必须为整数,否则会报错

int main()
{
    int a = 3, b = 2;
    float c = 3, d = 2;
    printf("%d\n", a / b);
    printf("%f\n", c / d);
    return 0;
}

输出:

1
1.500000

可以看出,第一个作用与两个整数a, b中的 ‘ / ’ 意义应该是整除,而下面作用于c, d 的 ’ / ’ 才是我们熟悉的除法

复合运算符

运算符实例等价式
+=a += ba = a + b
-=a -= ba = a - b
*=a *= ba = a * b
/=a /= ba = a / b
%=a %= ba = a % b

复合运算符的结合方向为自右向左!

这里有两个例子:

int a = 4, b = 5, c = 6;
(1) a *= b -= c + 3
(2) a += b -= c *= 2

答案应该是:

(1) -16
(2) -3

自增、自减运算符

表达式"等效"表达式注意
i++i = i + 1先使用i,再自增
i–i = i – 1先使用i,再自减
++ii = i + 1先自增,再使用i
–ii = i - 1先自减,再使用i

注意运算符前置与后置的区别!

int i = 1, j = 1;
printf("%d\n", i++);
printf("%d\n", ++j);
printf("%d %d\n", i, j);

这里的四个输出应该分别为:

1
2
2 2

“等效”并不代表真的完全相同!

位运算符

现有:

A:00000101 B:00001011

其他运算符

逻辑运算符

基本知识:

​ C语言中,0为, 1为

变量的逻辑含义:

​ bool变量 0假 1真 只有这两种取值

​ 其他变量 0假 其余均为真

关系运算符

关系运算符含义
==两个等号,当左右两边相等的时候为真,不等的时候为假
!=不等号,当左右两边相等的时候为假,不等的时候为真
>大于号
<小于号
>=大于等于号
<=小于等于号

实例:

int main()
{
    int a = 1, b = 2;
    printf("%d\n", a == a);
    printf("%d\n", a != b);
    printf("%d\n", a >= b);
    return 0;
}

输出:

1
1
0

逻辑运算符

逻辑与的写法是&&,而位运算中的与写法是&

逻辑或的写法是||,而位运算中的或写法是|

运算符之间的优先级

多个逻辑表达式

例:

int main()
{
    int a = 1, b = 2;
    printf("%d\n", a || b ++ );
    printf("%d\n%d\n", a, b);
}

输出:

1
1
2

条件控制

if 语句

if 是最常见的条件分支语句

语法:

if (表达式1) {
    语句组1;
}

if 语句是最常见的条件分支语句

表达式1是一个逻辑表达式,它的值可能是非0(真)或0(假)

当表达式1为真时,会执行下面的语句组1,否则不会执行。

if-else 语句

if (表达式1) {
    语句组1;
} else {
    语句组2;
}

else 常常搭配 if 出现

当表达式1为真时,只会执行下面的语句组1

当表达式1为假时,不会执行语句组1,并且会进入执行语句组2

多个 if-else 形成的多条件分支

if (表达式1) {
    语句组1;
} else if (表达式2) {
    语句组2;
} else if (表达式3) {
    语句组3;
} else {
    语句组4;
}

当表达式1为真时,只会执行语句组1,当表达式1为假时,会判断一下表达式2的真假值,当表达式2为真时,只会执行语句组2,否则接着判断表达式3的真假值,当表达式3为真时,只会执行语句组3,否则执行语句组4。

switch-case语句

switch (表达式) {
    case 常量1: 语句1; break;
    case 常量2: 语句2; break;
    case 常量3: 语句3; break;
    default: 语句n; break;  // 结尾的 break; 可以省略
}

switch 语句是根据表达式的值来进行选择,看一看执行哪条语句

常量几和表达式相等就从语句几开始执行,直到语句中出现break才会中断

都没有的话就执行语句n。

例:

#include <stdio.h>

int main()
{
    int day = 0;
    scanf("%d", &day);
    switch (day) {
        case 1: printf("星期一\n");
        case 2: printf("星期二\n");
        case 3: printf("星期三\n");
        case 4: printf("星期四\n"); break;
        case 5: printf("星期五\n");
        case 6: printf("星期六\n");
        case 7: printf("星期天\n");
        default: break;
    }
    return 0;
}

输入1:

5

输出1:

星期五
星期六
星期天

输入2:

1

输出2:

星期一
星期二
星期三
星期四

循环控制

while 语句

语法:

while (condition) {
    // DoSomething
}

while 语句执行流程图:

例:
使用 while 语句打印 0 ~ 9

#include <stdio.h>

int main()
{
    int a = 0;
    while (a < 10) {
        printf("%d ", a);
        ++a;
    }
}

输出:

0 1 2 3 4 5 6 7 8 9 

do-while 语句

语法:

do {
    // DoSomething
} while (condition);

do-while 语句执行流程图:

例:
使用 do-while 循环打印 0 ~ 9

#include <stdio.h>

int main()
{
    int a = 0;
    do {
        printf("%d ", a);
        ++a;
    } while (a < 10);
}

输出:

0 1 2 3 4 5 6 7 8 9 

for 语句

语法:

for (init; condition; increment) {
    // DoSomething
}

for 语句执行流程图:

例:
使用 for 循环打印 0 ~ 9

#include <stdio.h>

int main()
{
    // 考试时最好还是不要用 init 语句定义变量,将变量定义在 for 语句之前。
    for (int a = 0; a < 10; ++a) {
        printf("%d ", a);
    }
}

输出:

0 1 2 3 4 5 6 7 8 9 

init, condition, increment 语句都可以不写,不写 condition 则默认为真。(但是一般肯定还是要写的)

如果你想实现无限循环,可以这么写:

for (;;) {/* DoSomething */}

循环的嵌套

循环结构是可以嵌套的,比如下面的代码,外层是一层for循环,在循环中的每一次操作都会执行一次while循环。

例:

#include <stdio.h>

int main()
{
    int i, j;
    for (i = 1; i <= 5; ++i) {
        j = 1;
        while (j <= i) {
            printf("*");
            ++j;
        }
        printf("\n");
    }
}

输出:

*
**
***
****
*****

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1101028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何选择全面型企业备份软件以提高数据可用性?

通常&#xff0c;备份数据是指服务器正在运行的工作负载所需的所有数据。这可以包括文档、媒体文件、配置文件、机器映像、操作系统和注册表文件。本质上&#xff0c;您想要保留的任何数据都可以存储为备份数据。 在日益数字化的商业环境中&#xff0c;数据备份对于组织的生存…

C语言复杂表达式与指针高级

一、指针数组与数组指针 1.指针数组VS数组指针 &#xff08;1&#xff09;指针数组&#xff1a;实质是一个数组&#xff0c;因为这个数组中传参的内容全部是指针变量。 &#xff08;2&#xff09;数组指针&#xff1a;实质是一个指针&#xff0c;这个指针指向一个数组 2.分析指…

C语言,打印指定大小的X

要打印一个X&#xff0c;无非是在一个二维数组一个矩形中操作&#xff0c;将不是X的部分赋值为空格字符&#xff0c;将是X部分打印为*字符。 矩形的边长就是输入的n&#xff0c;由于矩形的边长是不固定的&#xff0c;所以要找到应该被赋值为*的坐标之间有什么数学关系。 以矩…

宏电股份AI BOX新产品首次亮相2023中国移动全球合作伙伴大会,以创新性AI、5G技术推动数实共生

10月11-13日&#xff0c;2023中国移动全球合作伙伴大会在广州开幕&#xff0c;本次大会以“算启新程&#xff0c;智享未来”为主题&#xff0c;作为中国移动多年来的重要合作伙伴&#xff0c;宏电股份AI BOX新产品在大会上首次精彩亮相&#xff0c;并重点展示了5G Redcap工业智…

格雷码加相移三维重建

之前所做的三维重建系统基本上都是基于多频率外差 的方法 &#xff08;交流方式可以点这个链接&#xff09;&#xff0c;最近整理了一下格雷码加相移的算法&#xff0c;与多频外差相比格雷码在对反光物体的重建效果稍微好一点&#xff0c;也可以投诉更少的图像 。采用6介互补格…

Python使用Selenium库如何绕过Cloudflare验证,网页请确认你是不是机器人

大家好&#xff0c;我是淘小白~ 前段时间使用selenium库写chatGPT的脚本&#xff0c;遇到过一个问题&#xff0c;那就是cloudflare的机器验证&#xff0c;让你点击确认不是机器人&#xff0c;这个问题最后找人解决掉了&#xff0c;我也是百度了很久没找到答案&#xff0c;B站找…

053:mapboxGL中sources的6种类型及各类型的示例代码

第053个 点击查看专栏目录 本篇文章是mapbox的source的归纳总结。 mapbox中 sources 是什么 sources:数据源集合(必填,用于包含一系列数据源 source,这些数据源提供了在地图上显示的数据) sources 是对象 {} 的形式,其属性名就是 数据源的名称(或者说 数据源的 id),…

网络基础初谈

0.一些无关紧要的心里话 ​ 一转眼学习计算机知识已经一年多了&#xff0c;中间起起伏伏&#xff0c;断断续续&#xff0c;但还算好也是坚持到了今天&#xff0c;之所以把这些基础知识写成一个系列&#xff0c;一方面方便知识巩固&#xff0c;另一方面至少还有三三两两的几个朋…

Linux命令之chpasswd命令

一、chpasswd命令简介 chpasswd命令用于同时更改多个用户的密码。它可以从标准输入或指定的文件中读取用户名和密码的组合&#xff0c;并将其应用于系统中的用户。chpasswd命令通常用于批量更改用户密码&#xff0c;特别是在自动化脚本或批处理任务中&#xff0c;该命令需要roo…

ERP系统供应商协同:优化企业供应链管理

一、ERP系统供应商协同的概念和功能 供应商协同是指在供应链中&#xff0c;企业与供应商之间通过ERP系统进行紧密合作和信息共享&#xff0c;实现供应链各个环节的协调和优化。ERP系统供应商协同功能涉及以下方面&#xff1a; 1. 供应商管理&#xff1a;ERP系统提供完善的供应…

华为云云耀云服务器L实例评测|windows系统3389防爆破之安全加固教程

为什么要选择华为云云耀云服务器L实例&#xff1a; 华为云在全国范围内建立了多个数据中心&#xff0c;这些数据中心之间相互冗余&#xff0c;以确保高可靠性和可用性&#xff0c;用户可以选择最适合的区域来部署应用程序&#xff0c;以实现更好的性能和延迟。 相对于传统的物…

选择什么电容笔比较好?平板手写笔推荐

由于苹果Pencil的热销&#xff0c;让华国内市场上&#xff0c;也出现了不少的平替式电容笔&#xff0c;这些产品&#xff0c;有好有坏&#xff0c;价格也很公道。不过&#xff0c;也有很多产品的价格都很平价。我是一个拥有多年经验的数码发烧友&#xff0c;在前几年就开始用上…

docker安装和docker安装RabbitMQ

docker安装 执行命令&#xff0c;先查看是否有Docker docker --version 如果想要删除&#xff1a;yum -y remove docker-ce 如果没有需要安装&#xff1a; 1.执行命令&#xff0c;实现Docker安装 yum install -y yum-utils yum-config-manager --add-repo http://mirrors.…

数组模拟堆实现堆排序

文章目录 QuestionIdeasCode Question 输入一个长度为 n 的整数数列&#xff0c;从小到大输出前 m 小的数。 输入格式 第一行包含整数 n 和 m 。 第二行包含 n 个整数&#xff0c;表示整数数列。 输出格式 共一行&#xff0c;包含 m 个整数&#xff0c;表示整数数列中前 m …

如何选择安全可靠的跨网文件安全交换一体机?

各行各业为了保护核心数据&#xff0c;绝大多数企业采取的第一个步骤是将企业内网与互联网进行隔离&#xff0c;将内部数据“困在”内网&#xff0c;同时也能够有效屏蔽外部网络攻击的风险。较大规模的企业&#xff0c;比如金融、政府、集成电路等行业机构&#xff0c;还可能对…

UE5----使用C++的项目重新打开后东西丢失

最近开始学习c编写代码&#xff0c;发现在场景里放置了Actor后&#xff0c;第二天打开项目&#xff0c;场景里边的放的球啊啥的东西没有了&#xff0c;蓝图类也丢失了父类。 解决方案&#xff1a; 不在Epic里打开虚幻引擎&#xff0c;在VS中打开。点击这个小绿三角&#xff0…

河北吉力宝:多维发力走创新智能鞋业道路

在快速发展的时代潮流中&#xff0c;智能科技正在改变我们的生活方式&#xff0c;消费者的选择更加多元化&#xff0c;以及制鞋行业同质化竞争严重等多重不利因素的影响&#xff0c;我国制鞋行业竞争加剧&#xff0c;各制鞋企业也在不断探索新市场&#xff0c;进一步拓展市场空…

京东数据分析:2023年下半年母婴市场各大细分赛道消费趋势盘点!

于今天的新生代父母而言&#xff0c;在诸多消费观念被改变的当下&#xff0c;新生父母们在育儿上更强调精细化&#xff0c;在这种情况下&#xff0c;母婴市场的消费升级已是大势所趋。不过&#xff0c;在如今收入增速整体放缓的背景下&#xff0c;各细分赛道的消费升级都出现了…

文心大模型4.0正式发布!来看看这届百度世界有啥亮点

今天&#xff0c;2023百度世界大会开幕了&#xff0c;大家都关注了吗&#xff1f;本次大会有很多亮点&#xff0c;我先摘一些和大家分享。 李彦宏现场做「手把手教你做AI原生应用」的分享&#xff0c;百度很多产品通过大模型进行了重构。文心大模型4.0重磅发布&#xff0c;综合…

mac读写硬盘的软件Tuxera NTFS2023免费版下载

Mac用户在使用NTFS格式移动硬盘时&#xff0c;会遇到无法写入硬盘的情况。要想解决无法写入的问题&#xff0c;很多人选择使用Mac读写软件。面对市面上“众多”的读写硬盘软件&#xff0c;用户应该怎么选择呢&#xff1f;初次接触移动硬盘的伙伴可能不知道移动硬盘怎么和电脑连…