c语言学习笔记

for循环

for循环像一个计数循环:设定一个计数器,初始化 它,然后在计数器到达某值之前,重复执行循环体, 而每执行一轮循环,计数器值以一定步进进行调整, 比如加1或者减1

for (i=0;i<5;i=i+1)

{ printf("%d",i);

}

for =对于

  • for (count=10; count>0; count--)
  • 就读成:“对于一开始的count=10,当 count>0时,重复做循环体,每一轮循环 在做完循环体内语句后,使得count--。”

算阶乘

  • n!= 1×2×3×4×...xn
  • 写一个程序,让用户输入n,然后计算输 出n!
  • 变量:

    • 显然读用户的输入需要一个int的n,然后 计算的结果需要用一个变量保存,可以 是int的factor,在计算中需要有一个变量 不断地从1递增到n,那可以是int的i。
# include <stdio.h>

int main (){
    int n;
    int i=1;
    int fact=1;

    scanf("%d",&n);
    for (i=1;i<=n;i++){
        fact*=i;
    }
    printf("%d!=%d\n",n,fact);
    return 0;
}

循环控制变量i只在循环里被使用了,在循 环外面它没有任何用处。因此,我们可以 把变量i的定义写到for语句里面去。

int n; 
scanf("sd", &n);
 int fact = 1;
 for (int i=1; i<=n; i++){ fact *= i; 
printf("sd!=*d\n", n, fact);

循环的计算和选择

循环次数

  • for (i=0;i<n;i++)
  • 则循环的次数是n,而循环结束以后,i的 值是n。循环的控制变量i,是选择从0开始 还是从1开始,是判断i<n还是判断i<=n, 对循环的次数,循环结束后变量的值都有 影响。

for循环

  • for(初始动作;条件;每轮的动作){ }
  • for中的每一个表达式都是可以省略的 for (;条件;)== while(条件)

选择

  • 如果有固定次数,用for
  • 如果必须执行一次,用do_while
  • 其他情况用while

循环控制

判断素数

素数

  • 只能被1和自己整除的数
  • 1, 2, 3, 5, 7, 11,13,17, 19....
# include <stdio.h>

int main (){
    int x;
    int i;
    scanf("%d",&x);
    int isprime = 1;//x是素数 
    for (i=2;i<x;i++){
        if (x%i==0){
            isprime=0;
            break;
        }
    }
    if(isprime==1){
        printf("是素数\n");
    }else{
        printf("不是素数"); 
    }

    return 0;
} 

continue和break

  • break:跳出循环
  • continue:跳过循环这一轮剩下的语句进入 下一轮
  • 只能对它所在的那层循环做

同学们依次站起来唱歌

continue:一位同学唱歌唱到一半,指令,然后不唱了,直接下一个人唱继续循环。

break:一位同学唱歌唱到一半,指令,然后不唱了,直接下一个人不唱了跳出循环。

输出100以内的素数

# include <stdio.h>

int main (){

    int x;
    for(x=1;x<=100;x++){

        int i;
        int isprime = 1;//x是素数 
        for (i=2;i<x;i++){
            if (x%i==0){
                isprime=0;
                break;
            }
        }
        if(isprime==1){
            printf("%d\n",x);
        }

    }
    return 0;
} 

嵌套的循环

  • 循环里面还是循环

找50个素数

# include <stdio.h>

int main (){

    int x;
    int cnt=0;//用来计数 
    for(x=1;cnt<50;x++){//计数器到50时停止循环 

        int i;
        int isprime = 1;//x是素数 
        for (i=2;i<x;i++){
            if (x%i==0){
                isprime=0;
                break;
            }
        }
        if(isprime==1){
            cnt++;//每找到一个素数计数器加一 
            printf("%d\t",x);
            if(cnt %5 == 0) {
                printf("\n");//每输出5个数换一行 
            }
        }

    }
    return 0;
} 

从嵌套的循环中跳出

凑硬币

  • 如何用1角、2角和5角的硬币凑出10元以 下的金额呢?
# include <stdio.h>

int main (){

    int x;
    int one, two, five;
    int exit = 0;

    scanf("%d",&x);
    for(one = 1;one< x*10;one++){
        for(two = 1;two< x*10/2;two++ ){
            for(five = 1;five< x*10/5;five++){
                if(one + two*2 + five*5 ==x*10){
                    printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,two,five,x);
                    exit = 1;
                    break;
                }
            }
            if(exit==1) break;
        }
        if(exit==1) break;
    } 
    return 0;
} 

goto改:一般从最内侧跳到最外侧时才用goto

# include <stdio.h>

int main (){

    int x;
    int one, two, five;
    int exit = 0;

    scanf("%d",&x);
    for(one = 1;one< x*10;one++){
        for(two = 1;two< x*10/2;two++ ){
            for(five = 1;five< x*10/5;five++){
                if(one + two*2 + five*5 ==x*10){
                    printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,two,five,x);
                    exit = 1;
                    goto out;
                }
            }
        }
    } 
    out:
    return 0;
} 

前n项求和

# include <stdio.h>

int main (){
    int n;
    int i;
    double sum=0.0;
     
     scanf("%d",&n);
     for(i = 1;i<=n;i++){
         sum +=1.0/i;
     }
     printf("f(%d)=%f\n",n,sum);
    return 0;
} 

V# include <stdio.h>

int main (){
    int n;
    int i;
    double sum=0.0;
    int sign = 1;
     
     scanf("%d",&n);
     for(i = 1;i<=n;i++){
         sum +=sign*1.0/i;
         sign = -sign;
     }
     printf("f(%d)=%f\n",n,sum);
    return 0;
} 

整数分解

正序分解整数

  • 输入一个非负整数,正序输出它的每一位数字
  • 输入:13425
  • 输出:13 4 2 5
#include <stdio.h> 

int main()
{
    int x;
    scanf("%d",&x);

    int t =0;
    do{
        int d =x%10;
        t = t*10+d;
        x/=10;
    } while(x>0);
    x=t;//先逆序一遍再逆序输出,解决输出结果逆序问题。 

    do{
        int d = x%10;
        printf("%d ",d);
        if(x>9){
            printf(" ");//解决输出的数末尾多余的0的问题 
        }
        x /=10; 
    }while(x>0);
    printf("\n");

    return 0;
}

存在问题:此程序只适用于末尾无0的数据。

x=13425;
13425 % 10000 ->1
13425 / 10000 ->3425
10000 / 10    ->1000
3425 % 1000   ->3
3425 / 1000   ->425
1000 / 10     ->100
425 % 100     ->4
425 / 100     ->25
100 / 10      ->10
25 % 10       ->2
25 / 10       ->5
10 / 10       ->1
5 % 1         ->5
5 / 1           ->5
1 /10         ->0

int mask = 10000;
do{
int d = x / mask;
x %= mask;
mask /=10;
}while(mask>0);
printf("%d,d");

完整程序:

#include <stdio.h> 

int main()
{
    int x;
    scanf("%d",&x);

    int mask = 1;
    int t = x;
    while (t>9){
        t /=10;
        mask *=10;
    }//读取数的位数并使mask可以随输入的数的变化而变化 
    do{
        int d = x / mask;
        printf("%d",d);
        if (mask >9){
            printf(" ");
        }
        x %=mask;
        mask /=10;
    }while(mask > 0);
    printf("\n");
    return 0;
}

求最大公约数

  • 输入两个数a和b,输出它们的最大公约数
  • 输入:12 18
  • 输出:6

法1.权举

  1. 设t为2;
  2. 如果u和v都能被t 整除,则记下这个t
  3. t加1后重复第2 步,直到t等于u或 四
  4. 那么,曾经记下的 最大的可以同时整 除u和v的t就是gcd
#include <stdio.h>
int main (){
    int a,b;
    int min;
    scanf("%d""%d",&a,&b);
    if (a>b){
        min = a;
    }else{
        min = b;
    }
    int ret = 0;
    int i;
    for(i = 1;i<min;i++){
        if(a%i == 0){
            if(b%i == 0){
                ret = i;
            }
        }
    }
    printf("%d和%d的最大公约数是%d.\n",a,b,ret);
    return 0;
} 

法2.辗转相除法

  1. 如果b等于0,计算结束,a就是最大公约数;
  2. 否则,计算a除以b的余数,让a等于b,而b等于那个 余数;
  3. 回到第一步。
#include <stdio.h>
int main (){
    int a,b;
    int t;
    scanf("%d""%d",&a,&b);

    while(b!=0){
        t = a%b;
        a = b;
        b = t;
    }
    printf("最大公约数是%d.\n",a);
    return 0;
} 

参考资料

程序设计入门——C语言\_浙江大学\_中国大学MOOC(慕课) (icourse163.org)

最后修改:2023 年 10 月 21 日
如果觉得我的文章对你有用,请随意赞赏