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】