C语言程序设计笔记---008
C语言程序设计的三大语法结构
前言:
语句:C语言中,由分号隔开的句子就是一条语句
C语言中用非零表示真,用零表示假,即:逻辑真,逻辑假
三大语法结构:顺序结构、分支(选择)结构、循环结构
/知识点汇总/
1、顺序结构
C语言中的顺序结构,逻辑很简单,就是代码一条一条的按顺序执行。
2、分支(选择)结构
2.1、if语句:
if语句的语法结构:
a、形式一:if(表达式)
语句;
a、形式二:if(表达式)
语句1;
else
语句2;
a、形式三:if(表达式1)
语句1;
else if(表达式2)
语句2;
...
else
语句n;
2.1.1 、if—else语句例程1
/*例程2.1.1*/
#include <stdio.h>
int main()
{
int age;
scanf("%d",&age);
//形式一:
if (age >= 18)
printf("成年");
//形式二:
if (age >= 18)
printf("成年");
else
printf("未成年");
//形式三:
if (age >= 18)
printf("成年");
//区分逻辑真,age=60也可输出,故不满足条件
//else if (18 <= age <= 28)
else if (age>=18 && age <= 28)
printf("青年");
else
printf("发展");
return 0;
}
代码规范性
2.1.2 、强调代码规范性例程1
/*例程2.1.2*/
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("haha");
else
printf("hehe");
//此时,该代码不会打印
//因为代码不规范,else理解为就近原则,是与第二个if组合的
return 0;
}
//例程纠正,正确按照逻辑输出
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
{
printf("haha");
}
else
{
printf("hehe");
}
}
return 0;
}
2.1.2 、强调代码规范性例程2
/*代码规范性例程2*/
//不规范书写
if (codition){
return x;
}
return y;
//规范书写,加括号划分清楚
if (codition)
{
return x;
}
else
{
return y;
}
2.1.2 、强调代码规范性例程3
/*代码规范性例程3*/
//避免错误
if(num == 5)
printf("666");
//更好的书写,避免输入为赋值符
if(5 == num)
printf("6868");
2.1.3 、练习题1
a、判断一个数是否为奇数
b、奇数:除二余一
#include <stdio.h>
int main()
{
int num;
printf("请输入一个正整数:");
scanf("%d",&num);
if (1 == num % 2)
{
printf("YES:奇数\n");
}
else
{
printf("NO:不是奇数\n");
}
return 0;
}
2.1.3 、练习题2
a、输出一百以内的奇数
b、奇数:除二余一
#include <stdio.h>
int main()
{
//方法一:结合for语句
for (int i = 1; i <= 100; i++)
{
int js = i % 2;
if (1 == js)
{
printf(" %d", i);
}
}
printf("\n\n");
//方法二:结合while语句
int num = 1;
while (num >= 1 && num <= 100)
{
if (1 == num % 2)
{
printf(" %d",num);
}
num++;
}
printf("\n");
return 0;
}
小结:
(1)注意代码的规范性
(2)注意判断的语句赋值符 = 与关系运算符 == 的应用
(3)注意 if—else 语句的对应
2.2、switch语句
switch也属于分支结构,常常用于多分支的情况
switch语句的语法结构如下:
swich(表达式)
{
case 常量1: 语句1 ;break;
case 常量2: 语句2;break;
...
case 常量n: 语句n;break;
default 语句n+1;break;
}
2.2.1 、switch语句例程1
/*例程2.2.1*/
#include <stdio.h>
int main()
{
int day = 0;
printf("请输入一个整数:");
scanf("%d",&day);
switch (day)//switch语句的参数只能整型/字符型/枚举型/字符串型
{
case 1: //case的参数需要为常数
printf("星期一\n");
break;//跳出循环
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期七\n");
break;
default:
printf("无效\n");
break;
}
return 0;
}
2.2.2 、switch语句例程2
/*例程2.2.2*/
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:m++;
case 2:n++;
case 3:
switch (n)
{
case 1:
n++;
case 2:
m++; n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d,n = %d",m,n);//5,3
return 0;
}
小结:
(1)switch语句的参数只能整型/字符型/枚举型/字符串型
(2)case的参数需要为常数
(3)break在switch语句的正确使用
3、循环结构
3.1、while循环语句
while语法结构:
while(表达式){
语句块
}
3.1.1 、while语句例程1
/*例程3.1.1*/
#include <stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
printf("%d",i);
i++;
}
printf("\n");
return 0;
}
3.1.2 、while语句例程2
/*例程3.1.2*/
#include <stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
if (5 == i) break;//起到了强制跳出整个循环作用//0124
if (5 == i) continue;//起到了强制跳出本次循环作用//0124+i==5的死循环
printf("%d", i);
i++;
}
printf("\n");
return 0;
}
3.1.3 、while语句例程3
/*例程3.1.3*/
#include <stdio.h>
int main()
{
char ch = 0;
while ((ch = getchar()) != EOF)//ctrl+z退出
{
if (ch < '0' || ch > '9')//如果是非数字
continue;//跳出本次循环
putchar(ch);
}
printf("\n");
return 0;
}
小结:
(1)while语句根据情况,是否给跳出循环的条件,避免死循环
(2)break在while语句中的正确使用
3.2、getchar()与putchar()语句
a、getchar()从标准输入中读取一个字符
b、putchar()把一个字符写到标准输出
3.2.1 、getchar()与putchar()语句例程1
/*例程3.2.1*/
#include <stdio.h>
int main()
{
int ch = getchar();
printf("%c\n",ch);
putchar(ch);
while ((ch = getchar()) != EOF)//EOF理解为逻辑错误-1
{
putchar(ch);
printf("输入ctrl+z结束循环。\n");
}
return 0;
}
3.2.2 、getchar()与putchar()语句例程2
/*例程3.2.2*/
#include <stdio.h>
int main()
{
char paeeword[20] = {0};
printf("请输入密码:");
scanf("%d",paeeword);//数组名本身是地址,所以不用加&
printf("请确认(Y/N):");
//int ch = getchar();
//输入错误,因为输入函数是从缓冲区获取反馈,故此时的enter也被识别为\n,导致输出错误
//清理缓冲区中不需要的内容
int tmp = 0;
while ((tmp = getchar()) != '\n')//判断从缓冲区读取到得是否是\n
{
;//空语句,理解为不用的扔掉
}
int ch = getchar();
if('Y' == ch )
{
printf("密码正确\n");
}
else
{
printf("密码错误\n");
}
return 0;
}
小结:
(1)getchar()与putchar()语句是单个的输入输出,字符需要单引号 ’ ’
(2)注意格式符的正确使用 %c%d%s等
(3)数组名本身是地址,所以不用加取地址符 &
3.3、for循环语句
for语法结构:
for(表达式1;表达式2;表达式3)
语句;
3.3.1、for语句例程1
/*例程3.3.1*/
#include <stdio.h>
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
//if (5 == i) break;//01234
//if (5 == i) continue;//012346789
printf("%d\n",i);
}
return 0;
}
3.3.2、for语句例程2
/*例程3.3.2*/
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int i = 0;
for (i = 0; i < 10; i++)//左闭=,右开<
{
printf("%d\n",arr[i]);
}
return 0;
}
3.3.3、for语句例程3
/*例程3.3.3*/
#include <stdio.h>
int main()
{
int j = 0;
int i = 0;
//for (i = 0; i < 3; i++)//左闭=,右开<
//{
// for (j = 0; j < 3; j++)//左闭=,右开<
// {
// printf("haha ");//9个haha
// }
//}
for (; i < 3; i++)//结束内部的for循环后,i++,i=2,进入内部for
//由于此时内部for没有赋初值,所以j任然等于3,判断3=3不进入内部for循环
{
for (; j < 3; j++)//因为当j=3时,完成了打印三次haha,然后结束内部的for循环
{
printf("haha ");//3个haha
}
}
printf("\n");
return 0;
}
3.3.4、for语句例程4
/*例程3.3.4*/
#include <stdio.h>
int main()
{
int j = 0;
int i = 0;
for (i = 0,j = 0; i = 10; i++,j++)//判断参数为0,0为假所以一次都不执行
{
printf("循环几次?");//0次
}
return 0;
}
小结:
(1)for语句参数用分号隔开
(2)for语句参数可省略,但是不滥用
3.4、do–while循环语句
do–while语法结构:
do
循环语句;
while(表达式);
3.4.1、do–while语句例程1
/*例程3.4.1*/
#include <stdio.h>
int main()
{
int i = 0;
do
{
//if (5 == i) break;//01234
//if (5 == i) continue;//01234+死循环
printf("%d",i);
i++;
} while (i < 10);
printf("\n");
return 0;
}
3.4.2、do–while语句例程2
/*例程3.4.2*/
#include <stdio.h>
int main()
{
int i = 0;
do
{
//if (5 == i) break;//01234
//if (5 == i) continue;//01234+死循环
printf("%d",i);
i++;
} while (i < 10);
printf("\n");
return 0;
}
小结:
(1)do–while语句至少都执行一次
(2)break和continue的正确使用
3.5、goto语句
a、无条件转移语句
b、其中语句标号是按标识符规定书写的符号,放在某一语句行的前面,标号后加半角冒号“:”
c、语句标号起标识语句的作用,与 goto 语句配合使用
d、goto语句语法结构:
flag:
语句;
goto flag;
3.5.1、goto语句例程1
通常不建议使用goto,滥用可能导致程序混乱甚至崩溃
/*例程3.5.1*/
#include <stdio.h>
int main()
{
flag:
printf("hehe\n");
printf("666\n");
goto flag;//使得程序跳回到指定位置
//根据goto : 可反复横跳
//造成死循环
return 0;
}
3.5.2、goto语句例程2
注意:goto语句只能在一个函数范围内跳转,不能跨函数。
/*例程3.5.2*/
#include <stdio.h>
void test()
{
flag:
printf("不可跳转\n");
}
int main()
{
goto flag;//报错,不能跨函数使用
return 0;
}