c语言教程 1.分支与循环

现在是c语言各部分详细的教程,一些基础的内容我在c语言概要里讲的已经比较清楚了,所以直接从分支和循环开始讲起
c语言结构:
1. 顺序结构
2. 选择结构
3. 循环结构

选择结构:

分支语句与循环语句:

c语言中由一个分号隔开的,就是一个语句
分支语句(选择结构)

if语句结构:

1.if(表达式)
语句; //表达式为真,执行语句
2.if(表达式)
语句1;
else
语句2 ; //表达式为真,语句1,假,语句2
3.多分支
.if(表达式1)
语句1;
else if(表达式2)
语句2 ;
else
语句3 ; //1真1,2真2,都假3
例:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    
    
        int age;
               printf("please input your age\n");
               scanf("%d", &age);
        if (age < 18)
               printf("未成年\n");
        else if (age >= 18 && age < 28)//&&为“和”
               printf("青年\n");
        else if (age >= 28 && age < 50)
               printf("壮年\n");
        else if (age >= 50 && age < 90)
               printf("老年\n");
        else
               printf("老不死\n");
        return 0;
}

这里提一下常见的悬空else问题
这里有这样一个问题
在这里插入图片描述
该代码会输出什么?
其实else与其最近的if匹配
第一个if就没进去(判定为错误),所以不会打印任何东西
利用if语句时一定要注意这个问题
同时写条件时注意:一个=为赋值,两个==为判断相等
这也是新手们常犯的一个错误

switch语句

(只能定义整型)
实现多分支项目
case决定入口,break决定出口
如:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    
    
        int day;
               scanf("%d", &day);
               switch (day)     
               {
    
    
               case 1:
                       printf("星期1\n");
                       break;
               case 2:
                       printf("星期2\n");
                       break;
               case 3:
                       printf("星期3\n");
                       break;
               case 4:
                       printf("星期4\n");
                       break;
               case 5:
                       printf("星期5\n");
                       break;
               case 6:
                       printf("星期6\n");
                       break;
               case 7:
                       printf("星期日\n");
                       break;
               
               }
               return 0;
}

中间不打break会一直向下运行
可以: case 1:
case 2:
case 3:
case 4:
case 5:
printf(“工作日\n”);
break;
最好在最后的case加入break
加default以防止case外的事件发生
下面看一道例题:
在这里插入图片描述
可以自己思考一下m,n的输出是多少
m=5 n=3

while循环

条件为真->执行–回到条件–条件为真…………条件为假–结束
可在while 中用if……break
如:

while(i<=10{
    
    
            if(i==5) ;
               break;
            printf("%d",1):
            i++;
}

只能输出1234 遇到break就跳出 continue可结束当前循环,回到条件

getchar-输入一个字符并返回(待输入)
putchar-输出

例:

int ch =0;
       while ((ch=getchar())!=EOF)
             {
    
    
                    putchar(ch);
              }

如果输入EOF的话可以想一想会不会输出EOF
你可能会认为while循环进不去,从而什么都输出不出来
其实计算机是一个个识别的,先E再O再F,单个字符肯定不等于EOF字符串
所以会进入循环,并输出EOF
(EOF–end of file文件结束标志)
接下来再讲一道颇有难度的例题
在这里插入图片描述
getchat和scanf为输入函数
接受数据放在输入缓冲区中
getchar得到缓冲区剩的回车(\n)去到else输出失败
可在请确认上一行加一个getchar()取走回车
但若输入密码为12345 asdf则又失败
因为第一个getchar只读到空格
所以加入循环来代替上述getchar即可

int ch
while((ch=getchar())!=‘\n’)//一直拿到回车
{
    
    
  ..........(上述题中的代码)
    } 

(这道题对初学者来讲较有难度,这里放出来是为了让大家体会计算机思维,如果仔细看完解释还是不懂可以在评论区中提出来你的问题)

for循环

(用的最多)
语法:
for(表达式1;表达式2;表达式3)
循环语句;
*
表达式1–初始化循环变量(初始化部分)
*
表达式2–判断循环什么时候终止(条件判断部分)
*
表达式3–循环条件的调整(调整部分)

若循环过于复杂,while循环的初始化,判断,调整三部分距离太远,不方便, 故采用for循环
eg:用for循环打印1-10

#include<stdio.h>
int main()
{
    
    
        int i = 0;
        for (i = 1; i <= 10; i++)
        {
    
    
               printf("%d", i);
        }
        return 0;
}

for循环示意图:
在这里插入图片描述
注:1.不可在for循环内改变变量,放在for循环失去控制(尤其注意判断相等与赋值的区别)
2.建议for循环控制变量取值采用“前闭后开区间”写法(前等后不等)----更有意义
3.for循环的判断条件部分若被省略,条件恒为真,循环不会停!(建议不要随便省略)初始化省略后默认从0开始

do…while循环

例:

int i=1
do
{
    
    
printf("%d",1);
i++;
}

while(i<=10);//适用范围

retrun 0;

过程如图
在这里插入图片描述
接下来会布置几道利用循环的练习题,答案也一并放出,新手建议先自己写一下再看看与答案的区别

练习

1.计算n的阶乘(不考虑溢出)
2.在有序数组中查找某个具体的数字n,编写int binsearch(int x,int v[],int n);功能:在v[0]<=v[1]<=v[2]<=…<=v[n-1]的数组中查找x。
3.编写代码演示多个字符从两边汇聚到中间
4.模拟用户登录,输入密码,最多输入三次

答案

1.在这里插入图片描述

  • 简单版:
#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)
        {
    
    
               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;
}

3,

#include<stdio.h>
#include<string.h>
#include<CoreWindow.h>//sleep 的声明
#include<stdlib.h>//system的声明
int main()
{
    
    
        char arr1[] = "welcome to china!!!!!";
        char arr2[] = "#####################";
        int left = 0;
        //int right = sizeof(arr1) / sizeof(arr1[0]) - 2;//算上\0所以减2
        int right = strlen(arr1) - 1;//strlen为计算数组中元素个数的函数,更简便
        while (left <= right)
        {
    
    
               arr2[left] = arr1[left];
               arr2[right] = arr1[right];
               printf("%s\n", arr2);
               Sleep(1000);//间隔1000毫秒
               system("cls");//执行系统命令的一个函数-cls-清空屏幕"cls"
               left++;
               right--;
        }
        return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>//strcmp的库函数
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("三次密码均错误,请退出");
        return 0;
}

觉得有帮助的同学可以点一个小小的赞支持一下~~

猜你喜欢

转载自blog.csdn.net/qq_54119007/article/details/115205779

相关文章