Day07

Day07

前面玩了一天

break语句

在循环体中,如果我们想让程序在中途跳出循环,那么可以使用break语句来实现

例:Day06的求素数问题

​ 我们原来的代码要通过验证2到num/2所有的数,来判断是否能被整除,但若num/2很大。执行的循环次数会变得很大,而其中存在很多不必要的循环,只要添加break语句,会使程序的效率提高很多

代码:

#include <stdio.h> 
#include <stdbool.h>
int main()
{
	long long i,num;//输入会特别大,用long long int会比较合适
	_Bool flag=1;
	printf("请输入一个整数\n");
	scanf("%lld",&num);// long long对应lld
	for(i=2;i<num/2;i++)
	{
		if(num%i==0)
		{
			flag=0;
            break//跳出循环
		}
	}
	if (flag==1)
	{
		printf("%lld是质数\n",num);
	}
	else
	{ 
	printf("%lld不是质数\n",num) ;
	}
	 printf("i=%lld\n",i)//用来看循环次数
	
	return 0;
}

对于break语句,它的作用是跳出它所在那一层的循环,要跳出外层循环也要在外层布置一个break语句

例:

#include <stdio.h>
int main()
{
	int i,j;
	for(i=0;i<10;i++)
	{
		for(j=0;j<10;j++)
		{
			if(j=3)
			{
				break;
			 } 
		}
	}
	printf("i=%d j=%d\n",i,j);

	return 0;
 } 

输出结果

i=10 j=3

说明外层循环完整执行了,内层循环每轮执行了三次

如果要让程序在j=3时就结束循环,就要在外层再布置一个break语句

#include <stdio.h>
int main()
{
	int i,j;
	for(i=0;i<10;i++)
	{
		for(j=0;j<10;j++)
		{
			if(j=3)
			{
				break;
			 } 
		}
        if(j=3)
        {
            break;
        }
	}
	printf("i=%d j=%d\n",i,j);

	return 0;
 } 

输出结果:

i=0 j=3

continue语句

使用continue语句时,循环体的剩余部分被忽略,直接进入下一次的循环

例:

#include <stdio.h>
int main()
{
	int ch;
	while((ch=getchar())!='\n')//ch获得键盘输入流的下一个字符 
	{
		if (ch=='c')//ch是否和c的asc值相同 
		{
			continue;
		}
		putchar(ch);//putchar一次只会输出一个字符 
	}
	return 0;
 } // 程序的大意是在用户输入的字符内,凡是有c的都当做看不见 

输出结果:

csdwdsawds//我输入的
sdwdsawds//程序输出的

continue语句和break语句一样,只能作用于一层循环

while语句和if语句的转换

例:

#include <stdio.h>
 int main()
 {
 	int i;
 	for(i=0;i<100;i++)
 	{
 		if(i%2)
 		{
 			continue;
		 }
	 }
 	return 0;
  } 

改成等价的while语句

错误改法:

#include <stdio.h>
int main()
{
	int i;
	i=0;
	while(i<100)
	{
		
		if (i%2)
		{
			continue;
		}
		i++;
	}
	return 0;
}

这种改法会让程序进入死循环,因为continu以下的内容会被跳过,i无法增长

正确的改法:

#include <stdio.h>
int main()
{
	int i;
	i=0;
	while(i<100)
	{
		i++;
		if (i%2)
		{
			continue;
		}
		
	}
	return 0;
}

for语句不会出现这样的问题,continue之后不会跳过i++

拾遗

赋值运算符

赋值运算符的左边必须是一个lvalue,变量名就是一个lvalue。

复合的赋值运算符

a=a+1    等价于   a+=1
a=a-2            a-=2
a=a*3            a*=3

以此类推

把算术运算符和赋值运算符兼容在一起

自增自减运算符

i=i+1可以写作i++或++i
i=i-1可以写作i--或--i

++放前与++放后的区别

例:

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

输出:

i=6,j=6
i=6,j=5

i++是先使用i变量里的值5给j,再对i进行加1,所以j为5

++i是将i变量里的值加1,再把运算后的结果赋值给j

自增自检运算符只能作用于变量不能作用于常量和表达式

逗号运算符

我们在for语句中能够在第一表达式和第三表达式里使用逗号运算符,来初始化多个值或调节多个变量

但逗号运算符也可以单独使用

语法:表达式1,表达式2,表达式3,…表达式n

-逗号表达式的运算过程为从左到右逐个计算表达式

-逗号表达式作为一个整体有一个值,它的值为最后一个表达式的值

例a=3,5 为a=3;5;(赋值运算符优先级更高)

a=(b=3,(c=b+4)+5);

-先将变量b赋值为3,再将c赋值为7再加5,最后赋值给a,所以a为12(尽管有括号,逗号表达式运算顺序也是从左到右运算)

逗号不一定都是运算符,也会作为分隔符出现,例如:int i,j;

条件运算符 (唯一一个三目)

语法:exp1?exp2:exp3;

exp1是条件表达式

如果结果为真,条件运算符返回的值为exp2的值

如果结果为假,返回值exp3的值

用于替代简单的if else语句

if(a>b)                                           max=a>b?a:b
	max=a;
else                                等价于
	max=b;

goto语句

goto语句的作用是直接跳转到指定的标签位置

语法: goto 标签; 其中的标签要定义在某个语句的前面

例:

#include <stdio.h>
int main()
{ 
	int i=5;
	while(i++)
	{
		if(i>10)
		{
			goto Label;//写对应标签的名字,会直接跳到标签所在的语句然后往下执行 
		}
	}
	
Label : printf ("i=%d\n",i);//标签的名字可以不是label,可以任意 
	return 0;
}

这里的while本来是个死循环,但由于goto的存在,得以跳出循环

输出:

i=11

开发中,不要随意使用goto语句,跳来跳去会影响代码的逻辑

但循环后很多层,要从最里面的一层跳到最外边,这种情况可以使用

注释

注释不应该直接写这句话的意思,注释是写给自己看的,要保证代码的复用性

一般可以注释变量的作用,函数的作用,返回值等等

//这是注释,只能写一行
/*这是注释,
可以跨越多行*/

数组

数组,说白了就是存储同种类型数据的地方

数组的定义:类型 数组名[元素个数或常量表达式] 例:int a[6] char b[5]

要先说明元素的个数,才能让c语言申请内存

数组不能动态定义即c语言不能在程序运行过程中去修改数组空间大小,定义要写在最开头的位置或定义循环变量时写中间

访问数组中的元素

语法:数组名[下标]

a[0];//访问a数组中第一个元素,访问第一个元素的下标是0不是1
b[1];//访问b数组第二个元素
c[5];//访问c数组的第6个元素
数组越界问题

例:

int a[5]
a[5];//报错,第五个元素应该是a[4]

循环跟数组的关系

  • 实现一个执行10次的循环,我们一般是这么写的
for(i=0;i<10;i++)//循环变量的初始值我们不设为1而是设为0????
{
.....
}
  • 这是因为我们常常需要使用循环来访问数组;
int a[10];
for(i=0;i<10;i++)
{
    a[i]=i;
}

养成循环初始值设为0的习惯,这样访问数组就可以避免数组越界的问题

举例:用数组存放十位同学的成绩,并求平均数

#include <stdio.h>
#define NUM 10//方便下面代替
int main()
{
	int grade[NUM]; 
	int i,sum=0;
	for(i=0;i<10;i++)
	{
		printf("请输入第%d位同学的成绩\n",i+1);
		scanf("%d",&grade[i]);
		sum+=grade[i];
	}
	printf("该次小测的平均分是%.2f\n",(double)sum/NUM);//平均数为小数,将sum定义为double型
	return 0;
	
}

(这个程序给我的启发是可以在循环中使用输入依次给元素赋值,以前没想到能在for里使用scanf)

数组的初始化

在定义数组的同时,就给它赋值

  • 将数组中所有元素初始化为0可以这么写:
int a[10]={0};//事实上这里只是将第一个元素赋值为0,后面的元素会自动初始化为0,所以将0改为1不会得到一样的效果
  • 如果是赋予不同的值,那么用逗号分隔开来即可
int a[10]={1,2,3,4,5,6,7,8,9,0};
  • 你还可以只给一部分元素赋值,未被初始化的元素自动赋值为0
int a[10]={1,2,3,4,5}//表示为前五个元素赋值,后边五个元素系统自动初始化为0,和第一条很相似

倘若没有给元素赋值,那么元素得到的会是内存中随机的数据

  • 有时候我们可以偷懒,可以只给各元素的值而不指定数组的长度,编译器可以根据值的个数自动判断数组的长度
int a[]={0,1,2,3,4,5)//数组长度为6
  • C99增加了一种新特性:指定初始化的元素。可以只对数组中的某些指定元素进行初始化赋值,而未被赋值的元素自动初始化为0
int a[10]={[3]=3,[5]=5};

对数组使用sizeof函数

例:

printf("%d",sizeof(a))//剩下代码自己脑补啊

输出的结果是数组占用内存的大小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值