在 C 语言知识体系中,
数据类型 --- 》 点
运算符 --- 》 线
逻辑结构 --- 》 面
函数 --- 》 体
1. 控制流 - 分支结构
1. if-else 分支: 两路分支一般形式:
if( 逻辑表达式 ) { // 如果表达式为逻辑真, 则执行分支体 1 } else { // 如果表达式为逻辑假, 则执行分支体 2 }
2 } 多路分支一般形式:
备注:
1. 两路或者多路分支中, else 可省略, 主要看使用场景。
2. 当多路分支中, 某一个为逻辑真, 执行分支体后直接结束分支。
3. 多路分支没有规定分支总数。
4. if-else 分支结构中, 如果分支体只有 1 条语句, 范围括号 {} 可省略。
5. 尽量减少分支、 循环的嵌套, 尽量小于 5 层, 否则导致程序逻辑可读性变差。
2. 入口选择分支: switch-case
备注: 1. 进入某个入口后, 按照顺序向下执行。 如果需要提前结束 swich-case , 可使用 break
练习
.1.从小到大输入 3 个数字(三角形的三边长) a. 判断是否能组成三角形? ( 两短边之和, 大于第三边。) (如果成立继续执行 b , 如果不成立提前结束程序。) b. 判断该三角形属于直角?钝角?锐角?
#include <stdio.h> int main() { int a, b, c; scanf("%d %d %d", &a, &b, &c); /* // 2层if嵌套 if(a+b > c) { // 正常的三角形,开始执行b if(a*a + b*b == c*c) printf("直角三角形\n"); else if(a*a + b*b < c*c) printf("钝角三角形\n"); else if(a*a + b*b > c*c) printf("锐角三角形\n"); } else // 不是三角形 printf("不是三角形\n"); */ // 1层if if(a+b <= c) { printf("不是三角形\n"); return -1; // 返回数值无所谓(一般错误使用负数) } // 正常的三角形,开始执行b if(a*a + b*b == c*c) printf("直角三角形\n"); else if(a*a + b*b < c*c) printf("钝角三角形\n"); else if(a*a + b*b > c*c) printf("锐角三角形\n"); return 0; }
2.下列代码会打印哪个数字?
int a=-1; if(++a) printf("1\n"); else if(a++) printf("2\n"); else if(a++) printf("3\n"); else if(a++) printf("4\n"); else if(a++) printf("5\n"); else printf("6\n"); printf("a: %d\n", a);
while
#include <stdio.h> int main() { /* if(逻辑表达式) { //逻辑真,则执行分支体 // 执行完毕后,结束。 } while(逻辑表达式) { //逻辑真,则执行循环体。 // 执行完毕后,再次判断 } */ int var1 = 1; while(var1<=10) { printf("var1: %d\n", var1); var1++; } // 可简化为: int var1 = 1; while(var1<=10) printf("var1: %d\n", var1++); return 0; }
作业:
1、编写一个程序,要求用相应的控制流语句往屏幕打印 26 个小写字母。
#include<stdio.h> int main() { for (int i = 97; i <=122; i++) { char a=i; printf("%c\t",a); } printf("\n"); return 0; }
2、编写一个程序,用户输入某个大写字母,产生一个金字塔图案。例如用户输入字母 E,则产生如下图案:
#include<stdio.h> int main() { printf("请输入一个大写字母\n"); char a; scanf("%c",&a);while (getchar()!='\n'); int asciiCode=(int)a-64; printf("现在有%d数\n",asciiCode); int lineNum; for (int i = 0; i <asciiCode; i++) { for (int z = 2*asciiCode-1-i; z>= 0; z--)printf(" "); for (int j = 0; j <i+1; j++) { printf("%c",(char)65+j); if(j==i){ for (;j>0;j--) { printf("%c",(char)65+j-1); } j=i; } } printf("\n"); } return 0; }
3、编写一个程序,该程序读取输入直到遇到#字符,然后报告读取的空格数目、读取的换行符数目以及读取的所有其他字符数目。
#include <stdio.h> int main(int argc, char **argv) { char ch; int space = 0;//空格数 int line = 0; //换行数 int otherchars = 0; //其他字符数 printf("请输入文本:(输入'#'结束)\n"); while(1) { scanf("%c", &ch); if(ch == '#') //遇到'#'就结束循环 { break; } if(ch == ' ') //遇到空格,space+1 { space++; } else if(ch == '\n') //遇到换行,line+1 { line++; } else { otherchars++; } } printf("空格数:%d\n", space); printf("换行数:%d\n", line); printf("其他字符数:%d\n", otherchars); return 0; }
4、编写一个程序,接受一个整数输入,然后显示所有小于或等于该数的素数。
#include<stdio.h> void sushu(int a) { //素数(质数)计算方法 int i,j; for (i = 1; i <= a; i++) { for (j = 2; j < i; j++) { if (i % j == 0) { // printf(i+"不是素数\n"); break; } } if (i == j) { printf("%d\t",i); } } } int main() { int a; printf("输入一个整数\n"); scanf("%d",&a); // unsigned char b; sushu(a); return 0; }
5、输入一个华氏温度,要求输出摄氏温度。要求结果保留 2 位小数。
转换公式为:c = 5(F-32)/9
#include<stdio.h> int main() { float a; printf("输入一个华氏温度"); scanf("%f",&a); float c=5* (a-32)/9; //1 华氏度(华氏温度)=-17.222222222 摄氏度 // printf("%.2f华氏度=%.2f℃\n",a,a*17.222); printf("%.2f华氏度=%.2f℃\n",a,c); return 0; }
6.打印如下图案:
#include<stdio.h> int main() { int i, j, k; for (i = 0; i < 4; i++) //先输出前四行 { for (j = 0; j < 3 - i; j++) //随行数增加而减少每行空格的输出 { printf(" "); } for (k = 0; k <= 2 * i; k++) //随行数增加而增加每行*的输出 { printf("*"); } printf("\n"); } for (i = 0; i < 3; i++) //输出后三行 { for (j = 0; j < i+1; j++) //随行数增加而增加空格的输出 { printf(" "); } for (k = 0; k <= 4-2*i; k++) //随行数的增加而减少*的输出 { printf("*"); } printf("\n"); } return 0; }
7、将一个十进制数转换为十六进制数。比如输入 10,输出 0xA
#include<stdio.h> int main() { int a; printf("输入一个10进制数:\n"); scanf("%d",&a); printf("转为16进制数是:0x%x\n",a); return 0; }