#include
int main()
{
int ret = 0;
int ch = 0;
char password[20] = {0};
printf("请输入密码:");
scanf("%s",password);
//缓冲区还剩余一个'\n'
//读取下一个'\n'
while ((ch = getchar()) != '\n')
{
;
}
printf("请确认(Y/N):");
ret = getchar();//Y/N
if(ret == 'Y')
{
printf("确认成功\n");
}
else
{
printf("放弃确认");
}
return 0;
}
#include
int main()
{
int ch = 0;
while((ch = getchar())!= EOF)
{
if(ch<'0' || ch>'9')
{
continue;
putchar(ch);
}
}
return 0;
}
语法
for(表达式1; 表达式 2;表达式3)
循环语句
表达式1表达式1为初始化部分,用于初始化循环变量的。表达式2 表达式2为条件判断部分,用于判断
循环时候终止。表达式3 表达式3为调整部分,用于循环条件的调整。
例子:使用for循环打印1-10的数字
#include
int main()
{
int i = 0;//初始化
for(i=1;i<=10;i++)
{
printf("%d",i);
}
return 0;
}
代码对比,输出的结果不同
for语句的循环控制变量一些建议:
1.不可在for循环体内修改循环变量,防止for循环失去控制。
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
例子1
#include
int main()
{
int i = 0;
for(i = 0;i<10;i++)
{
if(i = 5)
printf("haha\n");
printf("hehe\n");
}
return 0;
}
例子2
#include
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i= 0;
//10次打印
for(i=0;i<10;i++)
{
printf("%d",arr[i]);
}
return 0;
}
一些for循环的变种:
#include
int main()
{
//变种1
for(;;)//for循环的初始化、调整、判断都可以省略,但是如果for宣贯的判断被省略,那判断条件就是恒为正,建议不要随便省略
{
printf("hehe\n");
}
//变种2
int x,y;
for(x = 0,y = 0;x<2 && y<5; ++x,y++)
{
printf("hehe\n");
}
return 0;
}
#include
int main()
{
int i = 0;
int j = 0;
for(i = 0;i<10;i++)
{
for(j=0;j<10;j++)
{
printf("hehe\n");
}
}
return 0;
}
看看这个要循环多少次
#include
int main()
{
int i = 0;
int j = 0;
for(i = 0,j = 0;j = 0;i++,j++)
j++;
return 0;
}
答案是0次
do语句的语法:
do
循环语句
while(执行语句);
例子:在屏幕上打印1-10
#include
int main()
{
int i = 1;
do
{
printf("%d",i);
i++;
}
while(i<=10);
return 0;
}
#include
int main()
{
int i = 0;
int n = 0;
int sum = 1;
printf("请输入一个数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum = sum * i;
}
printf("sum= %d\n",sum);
return 0;
}
#include
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
// printf("请输入一个数:");
// scanf("%d",&n);
for(n=1;n<=10;n++)
{
ret = 1;
for(i=1;i<=n;i++)
{
ret = ret * i;
}
//n的阶乘
sum = sum + ret;
}
printf("sum= %d\n",sum);
return 0;
}
优化后的代码
#include
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for(n=1;n<=10;n++)
{
ret = ret * n;
//n的阶乘
sum = sum + ret;
}
printf("sum= %d\n",sum);
return 0;
}
#include
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;
}
二分法查找数字
#include
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int sz = sizeof(arr)/sizeof(arr[0]);
int k = 7;
int left = 0;//左下标
int right =sz-1;//右下标
while(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;
}
}
if(left>right)
{
printf("找不到\n");
}
return 0;
}
#include
#include
int main()
{
//welcome to bit !!!!
//###################
//w#################!
//we###############!!
//wel#############!!!
//....
//welcome to bit !!!!
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);
left++;
right--;
}
return 0;
}
#include
#include
#include
#include
int main()
{
//welcome to bit !!!!
//###################
//w#################!
//we###############!!
//wel#############!!!
//....
//welcome to bit !!!!
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);
Sleep(1000);
system("cls");//执行系统命令的一个函数--cls--清空屏幕
left++;
right--;
}
printf("%s\n",arr2);
return 0;
}
#include
int main()
{
int i = 0;
char password[20]={0};
for(i=0;i<3;i++)
{
printf("请输入密码:");
scanf("%s",&password);
if(strcmp(password,"123456") == 0)//== 不能用来比较两个字符串是否相等,应使用一个库函数--strcmp
{
printf("登录成功\n");
break;
}
else
{
printf("密码错误\n");
}
}
if(i == 3)
printf("三次密码均错误,退出程序\n");
return 0;
}
#include
int main()
{
int a,b,c = 0;
printf("请输入三个数a,b,c:");
scanf("%d %d %d",&a,&b,&c);
//算法实现 a中放最大值 b次之 c最小值
if(a<b)
{
int tmp = a;
a = b;
b = tmp;
}
if(a<c)
{
int tmp = a;
a = c;
c = tmp;
}
if(b<c)
{
int tmp = b;
b = c;
c = tmp;
}
printf("%d %d %d\n",a,b,c);
return 0;
}
#include
int main()
{
int i = 0;
for(i=1;i<=100;i++)
{
if(i%3 ==0)
printf("%d ",i);
}
return 0;
}
#include
int main()
{
int m = 0;
int n = 0;
int r = 0;
scanf("%d%d",&m,&n);
while(r=m%n)
{
m = n;
n = r;
}
printf("%d\n",n);
return 0;
}
写法一:
#include
int main()
{
int year = 0;
int count = 0;
for(year=1000;year<=2000;year++)
{
//判断year是否为闰年
//能被4整除并且不能被100整除是闰年
//能被400整除是闰年
if(year%4==0 && year%100!=0)
{
printf("%d ",year);
count++;
}
else if(year%400==0)
{
printf("%d ",year);
count++;
}
}
printf("\n count= %d\n",count);
return 0;
}
写法二:
#include
int main()
{
int year = 0;
int count = 0;
for(year=1000;year<=2000;year++)
{
if((year%4==0)&&(year%100!=0)||(year%400==0))
printf("%d ",year);
count++;
}
printf("\n count= %d\n",count);
return 0;
}
写法一:
#include
int main()
{
int i = 0;
int count = 0;
for(i=100;i<=200;i++)
{
//判断i是否为素数
//素数判断的规则
//1、试除法
//产生2--i-1的数字
int j=0;
for(j=2;j<i;j++)
{
if(i%j == 0)
{
break;
}
}
if(j == i)
{
count++;
printf("%d ",i);
}
}
printf("\n count= %d \n",count);
return 0;
}
写法二:
#include
#include
int main()
{
int i = 0;
int count = 0;
for(i=100;i<=200;i++)
{
int j=0;
for(j=2;j<=sqrt(i);j++)
{
if(i%j == 0)
{
break;
}
}
if(j>sqrt(i))
{
count++;
printf("%d ",i);
}
}
printf("\n count= %d \n",count);
return 0;
}
写法三:
#include
#include
int main()
{
int i = 0;
int count = 0;
for(i=101;i<=200;i+=2)
{
int j=0;
for(j=2;j<=sqrt(i);j++)
{
if(i%j == 0)
{
break;
}
}
if(j>sqrt(i))
{
count++;
printf("%d ",i);
}
}
printf("\n count= %d \n",count);
return 0;
}
#include
int main()
{
int a=0,b=0;
for(a=1,b=1;a<=100;a++)
{
if(b>=20)break;
if(b%3 ==1)
{
b=b+3;
continue;
}
b=b-5;
}
printf("%d\n",a);
return 0;
}
#include
int main()
{
int i = 0;
int count = 0;
for(i=1;i<100;i++)
{
if(i%10 == 9)
count++;
if(i/10 == 9)
count++;
}
printf("count = %d\n",count);
return 0;
}
#include
int main()
{
int i = 0;
double sum = 0.0;
int flag = 1;
for(i=1;i<=100;i++)
{
sum+=flag*1.0/i;
flag = -flag;
}
printf("%lf\n",sum);
return 0;
}
#include
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int max = arr[0];
int i = 0;
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=1;i<sz;i++)
{
if(arr[i]>max)
{
max = arr[i];
}
}
printf("max = %d\n",max);
return 0;
}
#include
int main()
{
int i = 0;
for(i=1;i<=9;i++)
{
//打印一行
int j = 1;
for(j=1;j<=i;j++)
{
printf("%d*%d=%-2d ",i,j,i*j);
}
printf("\n ");
}
return 0;
}
#include
#include
#include
void menu()
{
printf("********************************\n");
printf("***** 1、玩游戏 0、退出游戏 ****\n");
printf("********************************\n");
}
//RAND_MAX--32767
void game()
{
//生成一个随机数
int ret = 0;
int guess = 0;
ret = rand()%100+1;//产生一个1-100之间随机数
//printf("%d\n",ret);
//猜数字
while(1)
{
printf("请猜数字(1-100之间):");
scanf("%d",&guess);
if(guess>ret)
{
printf("猜大了\n");
}
else if(guess<ret)
{
printf("猜小了\n");
}
else
{
printf("恭喜你猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
}while(input);
return 0;
}
C语言中提供了可以随意滥用的goto语句和标记跳转的标号。从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
下面是一个关机程序:
#include
#include
#include
int main()
{
char input[20]={0};
//shutdown -s -t 60
//system()---执行系统命令
system("shutdowm -s -t -60");
again:
printf("请注意:你的电脑将在一分钟内关机,如果输入我是猪就取消关机\n 请输入");
scanf("%s",input);
if(strcmp(input,"我是猪") == 0)//比较两个字符串--strcmp
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
1.我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之 后迫不及待的想知道结果,想把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上( printf )。
2.在编程的过程中我们会频繁的做一些字 符串的拷贝工作( strcpy)。
3.在编程是我们也计算,总是会计算n的k次方这样的运算( pow)。
简单的总结, C语言常用的库函数都有:
●I0函数
●字符串操作函数
●字符操作函数
●内存操作函数
●时间/日期函数
●数学函数
●其他库函数
strcpy函数的使用:
#include
#include
int main()
{
char arr1[]="bit";
char arr2[20]="#############";
//strcpy--string copy--字符串拷贝
strcpy(arr2,arr1);
printf("%s\n",arr2);
return 0;
}
memset函数的使用:
#include
#include
int main()
{
char arr[]="hello word";
memset(arr,'*',5);
printf("%s\n",arr);
return 0;
}
对于陌生的函数,可以自己查询对应的手册 库函数查询网址
#include
int get_max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
int main()
{
// char arr[]="hello word";
// memset(arr,'*',5);
// printf("%s\n",arr);
int a=10;
int b=20;
int max =get_max(a,b);
printf("max =%d\n",max);
return 0;
}
写一个函数来交换两个变量:
#include
#include
void swap(int* pa,int *pb)
{
int tmp = 0;
tmp = *pa;
*pa = *pb;
*pb = tmp;
}
int main()
{
int a=10;
int b=20;
printf("a= %d b=%d\n",a,b);
swap(&a,&b);
printf("a= %d b=%d\n",a,b);
}
实际参数(实参) :
真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类
型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形式参数(形参) :
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配
内存单元) ,所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在
函数中有效。
我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。
传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
传址调用
●传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
●这种传参方式可以让函数和函数外边的变量建立起正真的联系 ,也就是函数内部可以直接操
作函数外部的变量。
写一个函数可以判断一个数是不是素数
#include
//是素数返回1,不是素数返回0
int is_prime(int n)
{
//2-n-1
int j = 0;
for(j = 2;j<n;j++)
{
if(n%j == 0)
return 0;
}
return 1;
}
int main()
{
int i = 0;
for(i=100;i<=200;i++)
{
//判断i是否为素数
if(is_prime(i) == 1)
printf("%d ",i);
}
return 0;
}
写一个函数可以判断一年是否为闰年
#include
int is_leap_year(int y)
{
if((y%4==0&&y%100!=0)||(y%400==0))
return 1;
else
return 0;
}
int main()
{
int year = 0;
for (year=1000;year<=2000;year++)
{
//判断year是否为闰年
if(1 == is_leap_year(year))
{
printf("%d ",year);
}
}
}
写一个函数,实现一个整形有序数组的二分查找。
#include
int binary_search(int arr[],int k,int sz)
{
//算法的实现
int sz = sizeof(arr)/sizeof(arr[0]);
int left = 0;
int right =sz-1;
while(left<=right)
{
int mid = (left+right)/2;
if(arr[mid]<k)
{
left = mid+1;
}
else if (arr[mid]>k)
{
right = mid-1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
//二分查找
//在一个有序数组中查找具体的某个数
//如果找到了返回,这个数的下标。找不到的返回-1
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int k =7;
int ret = binary_search(arr,k);
if(ret == -1)
{
printf("找不到指定的数字\n");
}
else
{
printf("找到了,下标是:%d\n",ret);
}
return 0;
}
写一个函数,每调用一次这个函数,就会将nwhm的值增加1
#include
void Add(int *p)
{
(*p)++;
}
int main()
{
int num = 0;
Add(&num);
printf("num = %d\n",num);
Add(&num);
printf("num = %d\n",num);
Add(&num);
printf("num = %d\n",num);
return 0;
}
嵌套调用
#include
void new_line()
{
printf("hehe\n");
}
void three_line()
{
int i = 0;
for(i=0;i<3;i++)
{
new_line();
}
}
int main()
{
three_line();
return 0;
}
链式访问
#include
#include
int main()
{
int len = 0;
len = strlen("abc");
printf("%d\n",len);
printf("%d\n",strlen("abc"));
return 0;
}
函数声明:
1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,无关紧要。
2.函数的声明一般出现在函数的使用之前。要满足先声明后使用。
3.函数的声明一般要放在头文件中的。
函数实现: 函数的定必是指函数的具体实现,交待函数的功能实现。
程序调用自身的编程技巧称为递归( recursion) 。递归做为一 种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
递归的主要思考方式在于:把大事化小递归的两个必要条件
●存在限制条件,当满足这个限制条件的时候,递归便不再继续。
●每次递归调用之后越来越接近这个限制条件。
最简单的递归:会存在栈溢出的现象
#include
int main()
{
printf("hehe\n");
main();
return 0;
}
接受一个整型值(无符号),按照顺序打印它的每- -位。例如:输入: 1234 ,输出1234。
#include
#include
void print(int n)
{
if(n>9)
{
print(n/10);
}
printf("%d",n%10);
}
int main()
{
unsigned int num =0;
scanf("%d\n",&num);//1234
//递归
print(num);
//print(1234)
//print(123) 4
//print(12) 3 4
//print(1) 2 3 4
return 0;
}
编写函数不允许创建临时变量,求字符串的长度。
#include
#include
int my_strlen(char* str)
{
int count = 0;
while(*str !='\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[]="bit";
// int len = strlen(arr);//求字符串长度
// printf("%d\n",len);
//模拟实现了一个strlen函数
int len =my_strlen(arr);//arr是数组,数组传参,传过去的不是整个数组,而是一个元素的地址
printf("len=%d\n",len);
return 0;
}
A、求n的阶乘
#include
#include
int Facl(int n)
{
if(n<=1)
return 1;
else
return n*Facl(n-1);
}
int main()
{
int n=0;
int ret = 0;
scanf("%d",&n);
ret = Facl(n);
printf("%d\n",ret);
return 0;
}
B、求第n个斐波那契数。( 不考虑溢出)
方法一:
#include
#include
//斐波那契数
//1 1 2 3 5 8 13 21 34 55 ......
int count = 0;
int Fib(int n)
{
if(n==3)//测试第三个斐波那契数的计算次数
{
count++;
}
if(n<=2)
return 1;
else
return Fib(n-1)+Fib(n-2);
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fib(n);
printf("ret = %d\n",ret);
printf("count = %d\n",count);
return 0;
}
方法二:
#include
#include
//斐波那契数
//1 1 2 3 5 8 13 21 34 55 ......
int Fib(int n)
{
int a = 1;
int b = 1;
int c = 1;
while(n>2)
{
c=a+b;
a=b;
b=c;
n--;
}
return c;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d",&n);
ret = Fib(n);
printf("ret = %d\n",ret);
// printf("count = %d\n",count);
return 0;
}
C、汉诺塔问题
#include
#pragma warning(disable:4996)
void hanoi(int n, char A, char B, char C)
{
//只有一个圆环时直接移动
if (n == 1)
{
printf("%c-->%c\n", A, C);
}
else {
hanoi(n - 1, A, C, B);//A上的n-1个圆环借助C移动到B上
printf("%c-->%c\n", A, C);//打印移动过程
hanoi(n - 1, B, A, C);//B上的n-1个圆环借助A移动到C上
}
}
int main()
{
int n = 0;
printf("请输入圆环的个数:");
scanf("%d", &n);
hanoi(n, 'A',' B',' C');
return 0;
}
D、青蚌跳台阶问题 :一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。
分析:当n = 1, 只有1中跳法;当n = 2时,有两种跳法;当n = 3 时,有3种跳法;当n = 4时,有5种跳法;当n = 5时,有8种跳法;
#include
int flog(int n)
{
if (n == 1)
return 1;
else if (n == 2)
return 2;
else
return flog(n - 1) + flog(n - 2);
}
int main()
{
int n = 0;
int ways = 0;
printf("请输入台阶的数量:");
scanf("%d", &n);
ways = flog(n);
printf("青蛙有%d种跳法",ways);
return 0;
}