当前位置 : 主页 > 编程语言 > c语言 >

C语言进阶- 2

来源:互联网 收集:自由互联 发布时间:2023-08-29
1、输出0~9之间的数 #include stdio.hint main(){int ch=0;while((ch=getcharr())!=EOF){if(ch'0' || ch'9')continue;putchar(ch);} return 0;} for循环 使用while循环时,循环变量初始、循环判断、循环调整,可能会离得比

1、输出0~9之间的数

#include <stdio.h>

int main()
{
	int ch=0;
	while((ch=getcharr())!=EOF)
	{
		if(ch<'0' || ch>'9')
			continue;
		putchar(ch);
	}	

   return 0;
}

for循环

使用while循环时,循环变量初始、循环判断、循环调整,可能会离得比较远,不容易修改,如下;所以就使用了for循环

#include <stdio.h>

int main()
{
	int i=0;//初始化
	//...
	
	while(i<10)//判断
	{
		
		//...
		
		i++;//循环调整
	}
   return 0;
}
for语法
for(表达式1;表达式2;表达式3)
		循环语句;

表达式1是 初始化部分,用于初始化循环变量的

表达式2是 条件判断部分

表达式3是 调整部分

建议:

1、不可在for循环体内(循环语句)修改循环变量,防止for循环失去控制

eg:在循环语句中写上 if(i=5),直接改变了i的值

2、建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

eg:前闭后开区间如:for(i=0;i<10;i++);

       前后都闭区间如:for(i=0;i<=9;i++);

上面两个是等价的,推荐第一个是由于 第一个方便看出进行了10次循环,其他无关

eg:

#include <stdio.h>

int main()
{
	int i=0;
      //初始化 判断  调整
	for(i=1; i<=10; i++)
        ---  -----  ---
         1      2    4
	{
		printf("%d ",i);
        ----------------
               3
	}
    
    //先走第1步(初始)——>第2步(判断)--判断为真--->第3步  第4步
    (一直2、3、4步循环),直到----判断为假--->跳出
	
    return 0;
}

#include <stdio.h>

int main()
{

	for(int i=1;i<=10;i++)
	{
		printf("%d ",i);
	}
	
    return 0;
}

break、continue可以在for循环中使用,且与while循环中的作用一致

break:跳出循环;

continue:跳到循环调整部分处


使用continue时,while循环会卡死,但for不会;由于while循环中i++在循环语句中,而for循环i++在调整语句中,无论如何都会执行调整语句

如while:

while(i<=10)
{
		if(5==i)
    		continue;//当i=5时,直接跳到while条件判断部份,不会执行i++,
 i一直是5,就一直在死循环
    printf("%d ",i);
    i++;
 }
#include <stdio.h>

int main()
{

	for(int i=1;i<=10;i++)
	{
		if(5==i)
			break/continue; //
		printf("%d ",i);
	}
	
    return 0;
}
for循环的变种:

1、for循环的初始化、调整、判断都可以省略;但是——for循环的判断部分如果被省略,那判断条件就是:恒为真,就一直会执行

#include <stdio.h>

int main()
{
	for(;;)
	{
		printf("hehe\n");
	}
	
    return 0;

2、如果不是非常熟练,不要随便省略代码

(1)如下正常是会打印100个“hehe”,如省略两个图示,就只会打印10个,是由于i=0,j循环时,j循环结束,j=10并未清零,之后i=2、3、4...10时j都不会再循环,所以只有1*10个“hehe”

#include <stdio.h>

int main()
{
	int i=0;
	int j=0;
	for(i=0;i<10;i++)  //省略i=0
	{
		for(j=0;j<10;j++)//省略j=0
		{
			printf("hehe\n");
		}
	}
	return 0;
}

(2)例:下面不进行循环,由于条件判断语句:k=0, 直接k赋予/赋值 0,0为假,直接跳出循环;

若k=非0,就会出现死循环

#include <stdio.h>

int main()
{
	int i=0;
	int k=0;
	for(i=0,k=0;k=0;i++,k++)//条件判断语句:k=0,
  直接k赋予/赋值 0,0为假,直接跳出循环
		k++;
	
	return 0;
}

do...while()循环

do语句的语法:先执行循环语句,之后再判断表达式是否为真,真循环 、假跳出循环

do
		循环语句;
while(表达式);

do语句特点:循环至少执行一次

eg:打印1~10

#include <stdio.h>

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

   return 0;
}

加入:if...break、continue

(1)结果输出为 1 2 3 4

#include <stdio.h>

int main()
{
   int i=1;
	do
	{
		if(5==i)
			break;
		printf("%d ",i);
		i++;
	}
	while(i<=10);

   return 0;
}

(2)输出为 1 2 3 4 6 7 8 9 10

#include <stdio.h>

int main()
{
   int i=0;
	do
	{
		i++;
		if(5==i)
			continue;
		printf("%d ",i);
		
	}
	while(i<=10);

   return 0;
}
题型:

1、表示n的阶乘,也就是得出1*2...*n的数

思路:直接表示让n乘以1,之后n一直减一和一相乘,就可以,直到n等于1

#include <stdio.h>

int main()
{
	int i=1;
	int n=0;
	scanf("%d",&n);
	do
	{
		i=i*n;
		n=n-1;
	}
	while(n>=1);
	printf("%d",i);
	

   return 0;
}
#include <stdio.h>

int main()
{
	int i=1;
	int n=3;
	for(i=1;n>=1;n--)
	{
		i=i*n;
	}
	
	printf("%d",i);
	

   return 0;
}
#include <stdio.h>

int main()
{
	int i=0;
	int n=0;
	int ret=1;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		ret=ret*i;
	}
	printf("ret=%d\n",ret);
	

   return 0;
}

2、求1!+2!+3!+...+n!=  什么

注:注意循环未跳出,导致输入的变量未初始化,导致使用的数字不对-结果异常(循环嵌套中 两个循环不要使用相同的变量字母)

#include <stdio.h>

int main()
{
	int i=1;
	int n=4;
	int reb=1;
	int sum=0;
	while(n>0)
	{
		reb=1;
		for(i=1;i<=n;i++)
		{
			reb=reb*i;
		}
		sum=sum+reb;
		n--;
	}
	
	printf("%d",sum);
	

   return 0;
}
#include <stdio.h>

int main()
{
	int i=1;
	int n=3;
	int ret=1;
	int sum=0;
	for(n=1;n<=3;n++)
	{
		ret=1;//由于循环未跳出,ret未初始化,需要手动定义初始化下
		for(i=1;i<=n;i++)
		{
			ret=ret*i;
		}
		//n的阶乘
		sum=sum+ret;
	}
		printf("sum=%d",sum);

   return 0;
}

优化代码:是由于2!=1!*2, 3!=2!*1,  依次直接累加就可以

#include <stdio.h>

int main()
{
	int n=3;
	int ret=1;
	int sum=0;
	for(n=1;n<=3;n++)
	{
		ret=ret*n;
		sum=sum+ret;
	}
		printf("sum=%d",sum);

   return 0;
}
#include <stdio.h>

int main()
{
	int i=1;
	int ret=1;
	int sum=0;
	int n=0;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		ret=ret*i;
		sum=sum+ret;
	}
		printf("sum=%d",sum);

   return 0;
}

3、在一个有序数组中查找具体的某个数字n。编写int binsearch(int x,int v[],int n);功能:在v[0]<=v[1]<=v[2]<=...<=v[n-1]的数组中查找x

#include <stdio.h>

int main()
{
	int arr[]={1,2,3,4,5,6,7,8,9,10};
	int k=7;
	//写一个代码,在arr数组(有序的数组)中找到7
	int i=0;
	int sz=sizeof(arr)/sizeof(arr[0]);
	for(i=0;i<sz;i++)
	{
		if(k==arr[i])
		{
			printf("找到了,下标是:%d\n",i);
			break;
		}
	}
	if(i==sz)
		printf("找不到\n");

   return 0;
}

优化代码:

折半查找算法/二分查找算法 :log2n

#include <stdio.h>

int main()
{
	int arr[]={1,2,3,4,5,6,7,8,9,10};
	int k=7;
	
	int sz=sizeof(arr)/sizeof(arr[0]);//计算元素个数
	int left=0;//左下标
	int right=sz-1;//右下标
	
	while(left<=right)  //需要left<=right才有条件进行查找
	{
		int mid=(left+right)/2;
		if(arr[mid]>k)
		{
			right=mid-1;
		}
		else if(arr[mid]<k)
		{
			left=mid+1;
		}
		else
		{
			printf("找到了,下标是:%d\n",mid);
			break; //找到一定要跳出去
		}
	}	

   return 0;
}

上述编码输出为:

找到了,下标是:6

sizeof计算:

数组后面没有\0,字符串有(数组是用{}括起来的,字符串是用双引号)

(1)当数组内部是元素时:

int arr[]={1,2,3,4,5,6,7,8,9,10};

sz=sizeof(arr)/sizeof(arr[0]) //是可以算出元素个数的

int right=sz-1;//计算右下标

(2)当数组内部是字符串时:

char arr[]="welcome to bit";//由于字符串的结尾标志\0,也会被sizeof计算在内,所以如下

int right=sizeof(arr)/sizeof(arr[0])-2

sizeof与strlen:

sizeof:计算的是变量/类型所占空间的大小,单位是字节

strlen:计算字符串长度,遇到\0就停止了,个数不包含\0   

 strlen函数,需要使用#include <string.h> 定义

char arr[]="abc";
//[a b c \0]
// 0 1 2 3
//计算右下标就为4-2

4、编写代码,演示多个字符从两端移动,向中间汇集

#include <stdio.h>
#include <string.h>
//#include <windows.h>
//#include <stdlib.h>

int main()
{
	char arr1[]="welcome to bit!!!!!!";
	char arr2[]="####################";
	int left=0;
	//int right=sizeof(arr1)/sizeof(arr1[0])-2;//不好记
	int right=strlen(arr1)-1;
	
	while(left<=right)
	{
		arr2[left]=arr1[left];
		arr2[right]=arr1[right];
		printf("%s\n",arr2);
		//休息1秒
		//Sleep(1000);//单位是毫秒,相当于休息1秒,需要使用头文件#include <windows.h>
		//system("cls");//执行系统命令的一个函数,cls——清空屏幕(需要加入头文件#include <stdlib.h>)
		left++;
		right--;
	}

   return 0;
}

Sleep(1000);//单位是毫秒,相当于休息1秒,需要使用头文件#include <windows.h>

system("cls");//执行系统命令的一个函数,cls——清空屏幕(需要加入头文件#include <stdlib.h>)

 left++;

上述代码输出结果:

w##################!
we################!!
wel##############!!!
welc############!!!!
welco##########!!!!!
welcom########!!!!!!
welcome######t!!!!!!
welcome ####it!!!!!!
welcome t##bit!!!!!!
welcome to bit!!!!!!

5、编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均错误,则退出程序)

#include <stdio.h>

int main()
{
	int i=0;
	char password=0;
	for(i=0;i<3;i==)
	{
		printf("请输入密码:");
		scanf("%s",password);//password作为数组名本身就是首地址
		if(strcmp(password,"123456")==0)// ==不能用来比较两个字符串是否相等,应该使用一个库函数-strcmp
		{
			printf("登录成功\n");
			break;
		}
		else
			printf("密码错误\n");
	}
	if(3==i)
		printf("三次密码均错误,退出程序\n");
	

   return 0;
}

==:不能用来比较两个字符串是否相等,应该使用一个库函数-strcmp

eg:if(strcmp(password,"123456")==0)

【转自:盐城网站建设公司 http://www.1234xp.com/yancheng.html 复制请保留原URL】
上一篇:学习C++的意义
下一篇:没有了
网友评论