网易云课堂程序设计入门—C语言第四周 循环控制学习笔记

第四周 循环控制

标签(空格分隔): 程序设计入门—C语言


4.1 for循环

  • 阶乘
#include<stdio.h>
int main (){

    int num =0;
    scanf("%d",&num);
//while循环 
//  int i=2;
//  int he=1; 
//  printf("%d!=1",num);
//  while(i<=num){
//      he*=i;
//      printf("*%d",i);
//      i++;
//  }
//  printf("=%d\n",he);

//do while循环 
//  int i=1;
//  int he=1;
//  do{
//      he*=i;
//      i++;
//  }while(i<=num);

    int i=1;
    int he=1;
//  for (i=2;i<=num;i++){
//      he*=i;
//  }
    for(i=num;i>1;i--){
        he*=i;
    } 
    printf("%d!=%d",num,he);
    return 0;
}
  • for循环
    • for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器达某值之前,重复执行循环体,而每执行一轮循环,计数器就以一定的步进进行调整
  • for = 对于
    • for (count=10;count>0;count–)
    • 对于一开始的count=10,当count>0时,重复做循环体,每一轮循在做完循环体内语句后,使得count–
  • 小套路
    • 做求和的程序时,记录结果的变量应该初始化为0,而做求积的程序时,记录结果的变量应该初始化为1
  • 循环控制变量i只在循环里被使用了,再循环外面它没有任何用处。因此我们可以把变量定义写到for语句里面去for(int i=0; i<10; i++) (only C99)
  • 同while相同,先做判断,for中每一个表达式都是可以省略的int i=n; for( ; i>1; i--)
//for循环
for(初始值;循环条件;步进){
    循环体;
}
  • 循环的次数
    • for(i=0; i<5; i++)
    • for(i=1; i<=5; i++)
    • 走的次数相同,但i值不同
  • 循环的选择
    • 如果有固定次数 用for
    • 如果必须执行一次 用do-while
    • 其他情况 用while

4.2 循环控制

4.2.1 循环控制
  • 素数
#include <stdio.h>
int main()
{
    int n;
    scanf("%d", &n);

    int i=2;
    int sf = 1;  //是否是素数 
    for ( ; i<n; i++ ){
        if( n%i == 0 ){
            sf=0;
            break;
        }
    }

    if ( sf ==1 ) {
        printf("%d是素数\n",n);
    } else {
        printf("%d不是素数\n",n);
    }

    return 0; 
}
  • break VS continue
    • break; 跳出循环
    • continue; 跳过循环这一轮剩下的语句,进入下一轮
    • break和continue都只能对它所在的那重循环做
4.2.2 逻辑运算
  • 逻辑运算
  • 逻辑运算是对逻辑量进行的运算,结果只有0和1
  • 逻辑量是关系运算或逻辑运算的结果
    运算符——描述——-示例
    !———-逻辑非—–!a
    &&——–逻辑与——a&&b
    ||———–逻辑或——a||b
  • 优先级!>&&>||
  • 如何判断一个字符c是否是大写字母
    • c>=’A’ && c<=’Z’
  • !age<20

    • 逻辑运算符优先级是普遍低于比较运算符的,但是!是单目运算符,单目运算符高于双目运算符。实际相当于(!age) < 20
  • 优先级

    1. ( ) (从左往右)
    2. !、+、-、++、– (从右往左)
    3. *、/、% (从左往右)
    4. +、- (从左往右)
    5. <、<=、>、>= (从左往右)
    6. ==、!= (从左往右)
    7. && (从左往右)
    8. || (从左往右)
    9. =、+=、-=、*=、/=、%= (从右往左)
  • 短路
    • 逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算
    • a==6 && b==1 如果a不等于6 右边就不会做了
    • a==6 && b+=1 不要把赋值,包括复合赋值组合进表达式
    • 对于&&,左边false,不做右边了
    • 对于||,左边true,不做右边了
4.2.3 多重循环
  • 100以内的素数
#include <stdio.h>
int main()
{
    int n;
    scanf("%d", &n);

    int j =1;
    for ( ; j<=n; j++){ 
        int i=2;    
        int sf = 1;  //是否是素数 
        for ( ; i<j; i++ ){
            if( j%i == 0 ){
                sf=0;
                break;
            }
        }

        if ( sf ==1 ) {
            printf("%d,",j);
        }

    }
    printf("\n");   
    return 0; 
}
4.2.4 离开多重循环
  • 接力break
  • goto
    • 建议只在多重循环的时候使用

4.3循环计算

//求和------------------------------------------------------------
#include<stdio.h>
int main(){
    int n;
    printf("请输入数字:") ;
    scanf("%d",&n);

//  f(n)=1+1/2+1/3+...
//  int i=1;
//  double sum=0;
//  for(i=1;i<=n;i++) {
//      sum+=1.0/i;
//  }
//  printf("f(%d)=%f\n",n,sum);

//  f(n)=1-1/2+1/3+...
    int i=1;
    double sum=0;
    double sign=1;
    for(i=1;i<=n;i++) {
        sum+=sign/i;
        sign=-sign;
    }
    printf("f(%d)=%f\n",n,sum);

    return 0;
} 

//最大公约数------------------------------------------------------------
#include<stdio.h>
int main(){

    int a,b;
    printf("请输入两个数字:") ;
    scanf("%d %D",&a,&b);

//枚举    
//  int min;//两个数小的一个,循环上限 
//  if(a>b){
//      min=b;
//  }else{
//      min=a;
//  }
//  
//  int i=2;
//  int ret=1;//记录公约数 
//  for(;i<=min;i++){
//      if(a%i==0 && b%i==0){   // 错误if(a%i==b%i==0)
//          ret=i;
//      }
//  }

/*辗转相除法
1.如果b等于0,计算结束,a就是最大公约数
2.否则计算a除以b的余数,让a等于b,而b等于那个余数
3.回到第一步*/
    int i;
    while(b!=0){
        i=a%b;
        a=b;
        b=i;
    }

    printf("最大公约数是%d",a) ;  
    return 0;
} 

//正序分解整数------------------------------------------------------------
#include<stdio.h>
int main(){
    int n;
    printf("请输入数字:");
    scanf("%d", &n);

> //整数逆序    
>   int t=0;
>   do{
>       int d = n%10;
>       t=t*10+d;
>       n=n/10;
>   } while( n!=0 );    
>   printf("%d\n", t);
> //逆序分解
>   do{
>       int d = t%10;
>       printf("%d", d);
>       if( t>=10 ) {
>           printf(" ");
>       }
>       t = t/10;
>   } while(t>0);   
> //只适用于末尾不是0的情况        

    int n;
    scanf("%d", &n);
    int wei=1;  

    int x=n;
    while( x>=10 ){
        wei*=10; 
        x /=10; 
    }
//  printf("%d\n", wei);

>   while( wei > 0) {
>       int d = n/wei;
>       printf("%d", d);
>       if(n>=10){
>           printf(" ");
>       } 
>       n %= wei;  
>       wei/=10;
>   }

    do {
        int d = n/wei;
        printf("%d", d);
        if(n>=10){
            printf(" ");
        } 
        n %= wei;  
        wei/=10;
    } while( wei > 0);

    printf("/over");
    return 0;
}

第四周编程题

1素数和(5分)

题目内容:我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。
现在,给定两个整数n和m,0

#include<stdio.h>
int main(){
    int n,m;
    scanf("%d %d",&n,&m);

    int sum=0;
    int i;
    int x=0;//计数器 
    for(i=2;x<m;i++){
        int a=2;
        int isPrime=1;
        for(;a<i;a++){
            int x=i%a;
            if(x==0){
                isPrime=0;
                break;
            }
        }
        if(isPrime==1){
            printf("%d ",i);
            x++;
            if(x>=n){
                sum+=i;
            }
            printf("%d\n",x);
        }
    } 
    printf("素数和是%d ",sum);
    return 0;
}

2念整数(5分)
题目内容:你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。
如输入1234,则输出:yi er san si
注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出的开头加上“fu”,如-2341输出为:fu er san si yi
输入格式:一个整数,范围是[-100000,100000]。
输出格式:表示这个整数的每一位数字的汉语拼音,每一位数字的拼音之间以空格分隔,末尾没有空格。
输入样例: -30
输出样例: fu san ling

#include<stdio.h>
int main(){
    int n;
    printf("请输入数字:") ;
    scanf("%d",&n);
    if(n<0){
        printf("负 ");
        n=-n; 
    } 

    int x=n;
    int i=1;//位数 
    while(x>=10){
        x/=10;
        i*=10;
    } 
//  printf("%d\n",i);

    int p;
    while(i>0){
        p=n/i;
        n%=i;
        i/=10;
//      printf("%d",p);
        switch(p){
            case 0:printf("零");break; 
            case 1:printf("一");break;
            case 2:printf("二");break;
            case 3:printf("三");break;
            case 4:printf("四");break;
            case 5:printf("五");break;
            case 6:printf("六");break;
            case 7:printf("七");break;
            case 8:printf("八");break;
            case 9:printf("九");break;
        }
        if(i>0){
            printf(" ");
        }
    } 
    printf("/over");
    return 0; 
} 
期中测试
  1. 在代码:while ( !e )中,!e等价于:e == 0
    • 任何非0整数值就是逻辑的true,所以只有e是0的时候,!e才会是true
  2. 以下代码片段的输出是:

    int j=4;
    for ( int i=j; i<=2*j; i++ ) {
       switch ( i/j ) {
       case 0:
       case 1: printf(“*”); break;
       case 2: printf(“#”);
       }
    }
    A.*#
    B.****##
    C.***#
    D.****#
  3. 对于以下代码:执行后,i会有几种可能性?(7)
    int i;
    scanf(“%d”, &i);
    i %= 4

  4. 以下表达式x&&1用在if的条件中时,和x是等价的(B)
    A.x==1
    B.x
    C.x!=1
    D.x==0
    • 右边的1是确定的值,所以其实不起作用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值