C语言学习第三天

分支语句:

这里重点讲一下switch语句(因为在java学习的时候对这部分理解有点疏忽)

格式

switch(整形表达式){
语句项
}

语句项是一些case语句,例子如下:

#include<stdio.h>
int main(){
int xuanze=0;
scanf("%d",&xuanze);//取地址
switch(day){
case 1:
printf("现在去打永杰无间\n");
break;
case 2:
printf("现在去打LOL\n");
break;
case 3:
printf("现在去打csgo\n");
break;
case 4:
printf("现在去打瓦洛兰特\n");
break;
}    
return 0;
}

因为代码是一个个往下走的,所以如果我们选择其中一个选项而没有加break退出语句的话,那么他就会执行到下一行而不是跳出来。(注意点:必须使用整数类型) 

补充:default选项,添加在switch末尾,当用户输入的所有选项不符合的时候就会执行该语句。后面最好加break(编程习惯)

while循环语句

格式:while(循环条件):{

                      加循环体 

萨达

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

该段代码要循环11次,直到a的值等于10,如果在循环中加一个if语句,当if语句的条件满足的时候实现break;这时候也是可以直接跳出循环的。所以在while循环中break用于永久性的终止循环如果把break换成continue,那么就不会执行continue后面的代码,而是继续执行从刚开始开始执行。所以continue的作用就是跳过本次循环

补充知识点:getchar是获取键盘的字符,同样的会有一个putchar是输出键盘上的字符。

#include<stdio.h>
int main(){
int ch=0;
while((ch=getchar())!=EOF){
putchar(ch);//打印出来字符
}
return 0
}

这串代码的输出结果就是,键盘上敲那个键那么打印出来的就是那个键。结束是ctrl+z键,当我们输入这两个键的时候此刻getchar识别的就是EOF

getchar函数工作原理:

当我们启动程序并执行到getchar的时候,它会一直等待缓冲区里面是否有数据输入,此刻我们输入一个A并且加一个回车确定的时候,缓冲区就会有如下数据A\n,此刻它会先识别到A并且赋给ch这个变量,在识别\n这个信息并进行换行操作

讲到getchar就必须提一嘴scanf这个函数了它们两个都是从缓冲区拿的数据但是scanf只有识别到\n也就是回车的时候才会将数据放到缓冲区并且让scanf去读取,scanf是不会拿\n的但是getchar是会拿走\n的。下面案例需要注意这一点:

#include<stdio.h>
int main(){
char password[20]={0};
printf("请输入密码:>");
scanf("%s",possword);//向上面说的scanf这时候只接受缓冲区的密码部分,但是此刻缓冲区人仍然会有一 
                        个\n没有被scanf给拿走
int ch=getchar();//因为缓冲区还有一个\n所以这时候会识别到直接赋给了ch
if(ch=='Y'){
printf("确认成功\n");
}else{
printf("确认失败\n");
}
return 0;
}

 由于scanf只拿走了缓冲区的密码部分,而确认的回车键却没有被拿走所以紧接着的getchar会第一个识别到此刻缓冲区剩余的\n。为了消除这个影响,我们需要进行的是清除缓冲区的操作,具体如下。另外:scanf也不识别空格。

#include<stdio.h>
int main(){
char password[20]={0};
printf("请输入密码:>");
scanf("%s",possword);//向上面说的scanf这时候只接受缓冲区的密码部分,但是此刻缓冲区人仍然会有一 
                        个\n没有被scanf给拿走
int tmp=0;
while((tmp=getchar)!=\n){
;
}//用循环消耗缓冲区的内容
int ch=getchar();
if(ch=='Y'){
printf("确认成功\n");
}else{
printf("确认失败\n");
}
return 0;
}

for循环 

格式:for(初始化;循环条件;每次变化条件){

循环体;

}

do while循环

格式:do 

                  循环体

while(表达式)

以打印1~10为例子

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

练习题1计算n的阶乘。

1.for循环

#include<stdio.h>
int main(){
int i=0;
int n=0;
int sum=1;
scanf("%d",&n);//取地址
for(i=1;i<=n;i++){
sum*=i;
}
printf("%d",sum);
return 0;
}

函数

类似与java里面的方法,包括输入参数以及返回参数

c语言中有两类函数:

1.库函数

strcpy(要拷贝的位置,要拷贝的内容)

2.自定义函数 

函数的调用:

1.传值调用

2.传址调用(重点):

函数在必须要写在调用之前,如果写在之后需要声明一下,操作如下:

#include<stdio.h>
int main(){
int a=10;
int b=10;
//声明函数
int Add(int,int);
int c=Add(a,b);
printf("%d\n",c);
return 0;
}
int Add(int x,int y){
return x+y;
}

函数的定义是创造函数,函数的声明是告诉代码有这个函数。如果函数定义在调用之前就不用声明了(定义是强有效的声明)。

在我们实际开发中经常会和别人合作开发,这时候就需要负责编写主函数的人来集合大家编写的代码,这时候就要用:#include   “别人开发的文件名 加在头文件的位置”,这样就可以使用别人写的方法了。

函数的声明一般是放在头文件里面的,函数的定义放在对应的.c文件里面的,这样就可以在主函数集成它们了

函数的递归:

什么是递归?
程序调用自身的编程技巧称为递归(recursion)。递归做为一种算法在程序设计语言中广泛应
用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复
杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可
描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的主要思考方式在
于:把大事化小。(函数自己调用自己)

递归练习:

接受一个整型值(无符号),按照顺序打印它的每一位。例如:1234,打印:1  2   3   4

思路:对输入数每次模10在除10

void print(unsigned int n){
if(n>9)
{
print(n/10);
}
printf("%d",n%10);
}


int main(){
unsigned int num=0;//无符号整数
scanf("%u",&num);//%u是取无符号整数
print(num);
return 0;
}

递归理解要点:在一次递归的时候要清楚,你进入到这个函数还没有出来,到最后一次递归的时候才慢慢返回。实际的理解还需要大量练题。

数组:

创建方式:数组类型   数组名[数组内元素个数](在c99语法中支持 int  arr[n],变长数组),还有一种创建方式:数组类型  数组名[]  ={初始化元素};这样创建的画就不用写数组内元素个数了,它会自动的根据初始化的个数来创建,字符类数组也是类似。

注意点:在使用第二种创建字符数组的时候会有下面这种情况:

原因:我们在用第一种方式创建数组的时候,会在内存开辟一个空间存储:bit\0这四个字符而我们用第二种方式的时候指挥存bit这三个字符,然而我们在打印数组的时候它要识别到\0才会停止打印的,而第二种因此会因为编译器的不同打印随机值。

补充:在数组中用到的[  ]这个符号叫做下标引用操作符,%p是专门打印地址,%x是用来打印16进制数的。

数组是在内存上连续存储的,随着数组下标的整张地址是由低到高变化的!! 

获取数组指针:

int*pt=arr;

二维数组:

二维数组的创建:

格式:元素的数据类型  数组名称[   ][  ];

二维数组的存放顺序是依次放入一行,放满之后放第二行。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值