C语言是一种结构化的程序设计语言,包括顺序结构、选择结构和循环结构。
语句是指用";"隔开的句子。
代码块是指"{ }"中的代码集合。
语句包括:表达式语句、函数调用语句、控制语句、复合语句、空语句。
控制语句用于控制程序的执行流程,以实现程序的各种结构,它们由特定的语句定义符组成,分三类:
1.条件判断语句也叫分支语句:if语句、switch语句;
2.循环执行语句:for语句、while语句、do while语句;
3.转向语句:break语句、go to语句、continue语句、return语句。
分支语句(选择结构)
注意:else会与最近的未匹配的if进行匹配使用
if语句
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d",&a);
if(a<60)//if(表达式)
printf("不及格\n");//语句1;
else if(a = 60)//else if(表达式)
printf("及格\n");//语句2;
else if(a>60 && a<85)//else if(表达式)
printf("良好\n");//语句3;
else//注意:else会与最近的未匹配的if进行匹配使用
printf("优秀\n");
return 0;
}
#include<stdio.h>
//判断一个数是否为奇数
int main()
{
int a = 0;
scanf("%d/n", &a);
if (a%2 == 1)
printf("奇数\n");
else
printf("偶数\n");
return 0;
}
#include<stdio.h>
//输出0-100的奇数
int main()
{
int i = 0;
while (i <= 100)
{
if (i%2 == 1)
printf("%d\n", i);
i++;
}
//{
printf("%d\n",i);
i+=2;
}//利用这种方法得到的结果是一样的
return 0;
}
switch语句
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch (day)//switch(整形表达式)
{
case 1://case 整形常量表达式:
//case 相当于入口
printf("Monday\n");//语句;
break;//break中止
//break相当于出口
//在最后一个语句后加上break
case 2:
printf("Tuesday\n");
break;
case 3:
printf("Wednesday\n");
break;
case 4:
printf("Thursday\n");
break;
case 5:
printf("Friday\n");
break;
case 6:
printf("Saturday\n");
break;
case 7:
printf("Sunday\n");
break;
default:
//当输入的值无法匹配任一case时,跳入dafault
//每个switch语句中只能存在一条default语句
printf("输入错误\n");
break;
}
return 0;
}
#include<stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("加班\n");
break;
}
return 0;
}
#include<stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1://n = 1进入case1:
m++;//执行,m = 3
//此时没有break,继续执行下面的case2:
case 2:
n++;//执行,n = 2
//此时依然没有break,继续执行下面的case3:
case 3:
switch (n)//经过上面的语句,此时的n = 2,因此直接跳入case 2:
{
case 1:
n++;
case 2:
m++;//执行,m = 4
n++;//执行,n = 3
break;//中止,跳出这个switch语句
}//case3:后面依然没有break,继续执行下面的case4:
case 4:
m++;//执行,m = 5
break;//中止
default:
break;
}
printf("m = %d,n =%d\n", m, n);//最终打印m = 5,n = 3
return 0;
}
循环语句(循环结构)
while
#include<stdio.h>
int main()
{
//一个最基础的while循环
int i = 0;//设定i的初始值
while (i < 10)//循环的判断
{
i++;//对i的执行语句
}
//弊端:当代码块规模变大后,相关i的语句越来越分散,不便于管理修改
return 0;
}
#include<stdio.h>
int main()
{
int i = 1;
while (10 >= i)
{
printf("%d\n",i);//打印1-10
i++;
}
return 0;
}
#include<stdio.h>
int main()
{
int i = 1;
while (10 >= i)
{
if (i == 5)
break;
//break直接中止整个循环
//当i的值等于5,break语句执行,跳出代码块,结束循环
printf("%d\n",i);//打印1-4
i++;
}
return 0;
}
#include<stdio.h>
int main()
{
int i = 1;
while (10 >= i)
{
if (i == 5)
continue;
//continue中止本次循环的后续代码,返回while,尽心下一次的循环
//当i的值等于5,continue语句执行,跳出代码块,返回上方的while判断
//继续循环,陷入死循环
printf("%d\n",i);//打印1-4,但不结束
i++;
}
return 0;
}
#include<stdio.h>
int main()
{
int ret = 0;
char password[20] = {0};
printf("请输入密码:");
scanf("%s", password);//例如输入123456
//输入缓冲区:123456\n
//password只会取走123456,余下一个'\n'
getchar();//取走缓冲区余下的'\n'
printf("请确认(Y/N):");
ret = getchar();
if (ret == 'Y' )
{
printf("确认成功\n");
}
else
{
printf("放弃确认\n");
}
return 0;
}
#include<stdio.h>
int main()
{
int ret = 0;
int ch = 0;
char password[20] = {0};
printf("请输入密码:");
scanf("%s", password);//例如输入123456
//输入缓冲区:123456\n
//password只会取走123456,余下一个'\n'
while ((ch = getchar()) != '\n')//读取缓冲区的字符直到'\n'
{
;
}
printf("请确认(Y/N):");
ret = getchar();
if (ret == 'Y' )
{
printf("确认成功\n");
}
else
{
printf("放弃确认\n");
}
return 0;
}
#include<stdio.h>
int main()
{
int ch = 0;
while ((ch=getchar()) != EOF)
{
if (ch<'0' || ch>'9')
//根据ASCII码,如果输入的字符是在48(‘0’)和57(‘9’)之外的字符,continue,返回while
continue;
putchar(ch);//如果是在48(‘0’)和57(‘9’)之间,putchar打印出来
}
return 0;
}
for语句
break和continue语句可以在for循环内使用。
不能在for循环体内修改循环变量,防止for循环失去控制。
for语句的循环控制变量的取值应采用“前闭后开区间”写法。
#include<stdio.h>
int main()
{
int i = 0;
//for(exp1;exp2;exp3)
//exp1设定i的初始值,exp2判断语句,exp3执行语句
for (i = 0; i < 10; i++)
{
;//循环语句
}
return 0;
}
do while语句
#include<stdio.h>
int main()
{
int i=1;
do
{
printf("%d", i);
i++;
} //循环语句
while (i <= 10);//判断
return 0;
}
goto语句
避免使用,容易造成逻辑混乱。
可在深层嵌套中,利用goto 标识符; 标识符:
可以快速跳出。
·
一个邪恶的关机代码
#include<stdio.h>
#include<stdlib.h>
#include<string,h>
int main()
{
char input[20] = { 0 };
system("shutdown -s -t 60");//system()执行系统命令的函数
//shutdown -s -t 60(将在60s后关机)
//shutdown -a(取消关机)
again:
printf("请注意,您的电脑将在1分钟内关机。\n如果输入我是猪,就取消关机。\n请输入:>");
scanf("%s", input);
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
练习
计算n的阶乘
#include<stdio.h>
int main()
{
//计算n的阶乘
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;
}
·
计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!的值
#include<stdio.h>
int main()
{
//计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!的值
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 10; n++)//结果的累加
{
for (ret=1,i = 1; i <= n; i++)//n的阶乘
{
ret = ret*i;
}
sum = sum + ret;
}
printf("sum=%d\n", sum);
return 0;
}
计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!的值,优化
#include<stdio.h>
int main()
{
//计算1!+2!+3!+4!+5!+6!+7!+8!+9!+10!的值
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 10; n++)
{
ret = ret*n;
sum = sum + ret;
}
printf("sum=%d\n", sum);
return 0;
}
·
在一个有序的数组arr中找到一个值,并打印
#include<stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int k = 7;//所要找的值
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);//sz等于arr数组中元素个数
for (i = 0; i < sz; i++)
{
if (k == arr[i])//当i=6,arr[6]=7==k,执行
{
printf("找到了,下标是:%d\n", i);
break; //顺利找到,break结束
}
}
if (i == sz)//假设,要找到不存在数组中,直到循环结束都没有找到
//即,i==sz
printf("找不到\n");
return 0;
}
在一个有序的数组arr中找到一个值,并打印。利用二分法优化:
#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]);//计算数组arr中元素个数
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<stdio.h>
#include<string.h>
#include<windows.h>
#include<stdlib.h>
int main()
{
char arr1[] = "welcome home!!!";
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);//停止1000ms,,需要windows.h头文件
system("cls");//执行系统命令的函数,,需要stdlib.h头文件
//cls:清空屏幕
left++;
right--;
}
return 0;
}
·
编写代码,模拟用户登录(如果密码正确提示登陆成功,密码错误提示密码错误。最多输入三次密码,否则提示登录失败)
#include<stdio.h>
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<stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d%d%d", &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<stdio.h>
int main()
{
int m = 0;
int n = 0;
int r = 0;
scanf("%d%d", &m, &n);
//利用辗转相除法
while (m%n)
{
r = m%n;
m = n;
n = r;
}
printf("%d\n", n);
return 0;
}
·
打印出1000-2000中的闰年,并计算个数。
#include<stdio.h>
int main()
{
int y = 0;
int count = 0;
for (y = 1000; y <= 2000; y++)
{
//判断是否为闰年
//能被4整除并且不能被100整除的
//能被400整除的
if (y % 4 == 0 && y % 100 != 0)
{
printf("%d ", y);
count++;
}
else if (y % 400 == 0)
{
printf("%d ", y);
count++;
}
//if(((y%4==0)&&(y%100!=0))||(y%100==0))
//{
// printf("%d ",y);
// count++;
//}
}
printf("count=%d\n",count);
return 0;
}
·
打印100-200的素数。(试除法)
#include<stdio.h>
int main()
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
//利用试除法判断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%d\n", count);
return 0;
}
打印100-200的素数。(试除法)(利用开平方函数优化)
#include<stdio.h>
#include<math.h>
int main()
{
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++)
{
//利用试除法判断i是否为素数
int j = 0;
for (j = 2; j <= sqrt(i); j++)
//数学库函数sqrt(),开平方
//需要math.h头文件
{
if (i%j == 0)
{
break;
}
}
if (j > sqrt(i))
{
count++;
printf("%d ", i);
}
}
printf("\n%d\n", count);
return 0;
}
另外,因为偶数一定不是素数,还可以继续优化for(i=100;i<=200;i++)改为for(i=101;i<=200;i+=2)
·
打印0-100中含9的数,并计算个数。
#include<stdio.h>
int main()
{
int i = 0;
int count = 0;
for (i = 1; i <= 100; i++)
{
if (i % 10 == 9)
{
printf("%d ", i);
count++;
}
else if (i / 10 == 9)
{
printf("%d ", i);
count++;
}
}
printf("%d\n",count);
return 0;
}
区别一下
求0-100中9的个数。
#include<stdio.h>
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("%d\n",count);
return 0;
}
第二个代码中不同于第一个代码用的是两个if语句,在i=99的时候,两个if语句都会判断且通过,count++执行两次。
·
计算1/1+1/2+1/3+1/4…+1/99+1/100的值,打印出结果。
#include<stdio.h>
int main()
{
int i = 0;
double sum = 0;
for (i = 1; i <= 100; i++)
{
sum += 1.0 / i;
}
printf("%lf\n",sum);
return 0;
}
计算1/1-1/2+1/3-1/4+1/5…+1/99-1/100的值,打印出结果。
#include<stdio.h>
int main()
{
int i = 0;
double sum = 0;
int j = 1;
for (i = 1; i <= 100; i++)
{
sum += j*1.0 / i;
j = -j;
}
printf("%lf\n",sum);
return 0;
}
计算1/1-1/2+1/3-1/4+1/5…+1/99-1/100的值,打印出结果。
(算法二:分母为奇数的和-分母为偶数的和)
#include<stdio.h>
int main()
{
int i = 0;
double sum = 0;
int j = 0;
for (i = 1; i <= 100; i++)
{
j = i % 2;
if (j == 1)
sum += 1.0 / i;
else if (j == 0)
sum -= 1.0 / i;
}
printf("%lf\n",sum);
return 0;
}
·
求十个数中的最大值。
#include<stdio.h>
int main()
{
int i = 0;
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int max = arr[0];//不建议赋值0
int sz = sizeof(arr) / sizeof(arr[0]);
//int sz = strlen(arr);
for (i = 0; i < sz; i++)
{
if (arr[i]>max)
{
max = arr[i];
}
}
printf("max=%d\n", max);
return 0;
}
·
打印9*9乘法口诀表
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%-2d ", i, j, i*j);
//这里的%2d是为了对齐,%-2d可以向左对齐
//不足两位数则添加一个空格
}
printf("\n");
}
return 0;
}
·
“简单的”猜数字游戏
#include<stdio.h>
#include<stdlib.h>
void menu()
{
printf("******************\n");
printf("**1.play**0.exit**\n");
printf("******************\n");
}
void game()
{
int guess = 0;
int ret = 0;
//生成一个随机数
//rand()函数随机生成一个数
//#define RAND_MAX 0x7fff,,生成的随机数在0-32767之间
ret=rand()%100+1;//将随机数的范围限制到0-100
while (1)
{
printf("请猜数字:>");
scanf("%d", &guess);
if (guess > ret)
{
printf("猜大了\n");
}
else if (guess > ret)
{
printf("猜小了\n");
}
else
{
printf("猜对了!\n");
break;
}
}
}
int main()
{
int input = 0;
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;
}