Fork me on GitHub

C语言

易错点
  • C语言输出需要使用双引号
  • switch 语句只会根据条件语句进行case、default的选择执行
  • continue只能用在循环体内

范例: 水仙花数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
int main()
{
//定义三位数num,个位数sd,十位数td,百位数hd
int num, sd, td, hd;
//循环所有三位数
for(num=100;num<1000;num++)
{
//获取三位数字num百位上的数字
hd =num/100;
//获取三位数字num十位上的数字
td =num%100/10;
//获取三位数字num个位上的数字
sd =num%10;
//水仙花数的条件是什么?
if(num==hd*hd*hd+td*td*td+sd*sd*sd)
{
printf("水仙花数字:%d\n", num);
}
}
return 0;
}

范例: 输出下图

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int main()
{
int i, j, k;
for(i=1; i<5; i++)
{
/* 观察每行的空格数量,补全循环条件 */
for( j=i ; j<5 ; j++ )
{
printf(" "); //输出空格
}
/* 观察每行*号的数量,补全循环条件 */
for( k=0 ; k<2*i-1 ; k++ )
{
printf("*"); //每行输出的*号
}
printf("\n"); //每次循环换行
}
return 0;
}

每一行的*数目为: 2i-1


  • 范例:判断是否为闰年

判断闰年的标准是:能整除4且不能整除100 或者能整除400

switch 语句会根据 condition来选择case的条件执行,若喜欢能执行多个case,则把符合condition的case放置第一位,然后不要使用break语句,直到执行完最后一个希望执行的case,再添加break

实例:使用switch语句和if…else语句,计算2008年8月8日这一天,是该年中的第几天。

方案一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
int main()
{
int year = 2008;
int month = 8;
int day = 8;
int i,j;
if(year%100==0&&year%400==0||year%4==0&&year%100!=0)i=1;
else i=0;
switch(month)
{
case 1:j=day;break;
case 2:j=31+ day;break;
case 3:j=31+ 28+ day;break;
case 4:j=31+ 28+ 31+ day;break;
case 5:j=31+ 28+ 31+ 30+ day;break;
case 6:j=31+ 28+ 31+ 30+ 31+ day;break;
case 7:j=31+ 28+ 31+ 30+ 31+ 30+ day;break;
case 8:j=31+ 28+ 31+ 30+ 31+ 30+ 31+day;break;
case 9:j=31+ 28+ 31+ 30+ 31+ 30+ 31+ 31+ day;break;
case 10:j=31+ 28+ 31+ 30+ 31+ 30+ 31+ 31+ 30+day;break;
case 11:j=31+ 28+ 31+ 30+ 31+ 30+ 31+ 31+ 30+ 31+day;break;
case 12:j=31+ 28+ 31+ 30+ 31+ 30+ 31+ 31+ 30+ 31+ 30+ day;break;
}
if(i==1)j+=1;
printf("%d年%d月%d日是该年的第%d天",year,month,day,j);
return 0;
}

方案二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
int main()
{
/* 定义需要计算的日期 */
int year = 2008;
int month = 8;
int day = 8;
/*
* 请使用swtich语句,if...else语句完成本题
* 如有想看小编思路的,可以点击左侧任务中的“不会了怎么办”
* 小编还是希望大家独立完成哦~
*/
int date = 0;
switch (month)
{
case 12: date += 30;
case 11: date += 31;
case 10: date += 30;
case 9: date += 31;
case 8: date += 31;
case 7: date += 30;
case 6: date += 31;
case 5: date += 30;
case 4: date += 31;
case 3: if(year%400 != 0 && year%4 == 0){
date += 29;
}else{
date += 28;}
case 2: date += 31;
default: date += 8,printf("2008年8月8日是该年的第%d天",date);break;
}
return 0;
}

goto语句

goto语句是一种无条件分支语句,goto 语句的使用格式为:

goto 语句标号;

语句标号是一个标识符,该标识符一般用英文大写并遵守标识符命名规则,这个标识符加上一个“:”一起出现在函数内某处,执行goto语句后,程序将跳转到该标号处并执行其后的语句。

示例:

img

goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在特定情况下,可以使用goto语句来提高程序的执行速度,所以还是少用为妙。


函数

自创函数

img

注意:自定义函数尽量放在main函数之前,如果要放在main函数后面的话,需要在main函数之前先声明自定义函数,声明格式为:[数据类型说明] 函数名称([参数]);

示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
/* 自定义整型函数 sayLove() */
int sayLove()
{
//在这里输入输出语句printf,输出内容为I Love imooc
printf("I Love imooc");
return 0;
}
/* 主函数 */
int main()
{
sayLove();
return 0;
}


#### 函数调用
语法:函数名([参数]);

[]中可以是常数,变量或其它构造类型数据及表达式,个参数之间用逗号分隔。

参数:形参与实参

形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量 在参数传递时,实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹

函数返回值

return 表达式 或者为: return (表达式); 没有返回值的函数,返回类型为void

注意:void函数中可以有执行代码块,但是不能有返回值,另void函数中如果有return语句,该语句只能起到结束函数运行的功能。其格式为:return;

### 递归使用
一、 猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又多吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第10天在想吃的时候就剩一个桃子了,问第一天共摘下来多少个桃子?并反向打印每天所剩桃子数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
/* 定义获取单词数量的函数 */
int getWordNumber(int n)
{
if(n == 1)
{
return 1; //第一天只会1个单词,即返回最后一天的数量
}
else{
return getWordNumber(n-1)+n ; //到第天会的单词数量
}
}
int main()
{
int num = getWordNumber(10); //获取会了的单词数量
printf("小明第10天记了:%d个单词。\n", num);
return 0;
}


二、有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2人大两岁。问第2个人,说比第1个人大两岁。最后 问第1个人,他说是10岁。请问第5个人多大?

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h> 

int dfs(int n) {
return n == 1 ? 10 : dfs(n - 1) + 2; // 三则运算符
}
int main()
{

printf("第5个人的年龄是%d岁", dfs(5));
return 0;
}


## 局部与全局
### 初解
img

全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。

程序会优先寻找函数内部变量,如果没找到再在全局变量寻找。

1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
int x = 10;
if(x>0)
{
int x = 100;
x /= 2;
printf("if语句内, x=%d\n", x);
}
printf("main方法内, x=%d\n", x);
return 0;
}


输出:
1
2
if语句内, x=50
main方法内, x=10


### 变量存储类别
C语言根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式

静态存储方式:

是指在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量。
动态存储方式:

是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等。


存储类别又分为四类:

自动(auto) 静态(static)
* 寄存器的(register)和外部的(extern)


自动变量

用关键字auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式.

img

静态变量static

static修饰的为静态变量,如果定义在函数内部的,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量。

静态变量可以记忆变量的变化之后的值

示例如下:

img

img

外部变量extern

extern声明的的变量是外部变量,外部变量的意义是某函数可以调用在该函数之后定义的变量

img

喜欢的可以对我打赏了哟~