目标

白话C,最短时间内写出简单C程序. 进阶篇

关键字

  • 1.数据聚合
  • 2.运算符
  • 3.函数++
上期解答[]
#include <stdio.h>
int is_prime(int x) // 1
{
    int i;
    for(i = 2;i * i < x;i++)
        if((x % i) == 0) 
            return 0;
    return 1;
}
int main() 
{
    int i, count, sum;
    for(i = 500, sum = 0, count = 0;i < 1000;i++){ // 2
        if(is_prime(i)){
            count++;        
            sum += i;
        }            
    }
    printf("There are %d primes, sum is %d\n", count, sum);
    return 0;
}

解释两处:1.自己定义的函数is_prime用于判断数的素性; 2.for循环的初始部分有错??NO!逗号运算符[]


数据聚合

问题:已知每个人的成绩,求每个人与平均分间的差。 如果只有几个人,可以定义几个变量解决问题。可是若有成百上千的个体,定义变量使用将是多么痛苦。数组应运而生,数组是解决同类个体聚合的利器。

数组 []

#include <stdio.h>
int main(){
    float scores[6] = {3, 4, 8, 9, 5, 7};//数组的定义
    //float scores[] = {3, 4, 8, 9, 5, 7};也可以 

    float average = 0;
    int i;
    for(i = 0;i < 6;i++)
        average += scores[i];

    average /= 6.0;

    for(i = 0;i < 6;i++){
         scores[i] -= average;
         printf("%f\t", scores[i]);
    }    
}

上面解答只针对一门成绩,如果有多门呢? 建立多个数组??如果可以把名字,学号成绩合起来定义一种类型,处理将简单,直接。

结构 struct

#include <stdio.h>
int main(){
    struct student{        //定义结构类型
        char name[20];        
        int id;
        float score1, score2;
    }; //此处分号不要丢
    struct student s1 = {"Lili", 201006, 5.5, 6.6};  //定义一个结构变量
    printf("name:%s id:%d score:%f %f\n", s1.name, s1.id, s1.score1, s1.score2);

    struct student stu[6] = {        //定义结构数组
            {"Lili", 201001, 5.5, 6.6},
            {"Lilk", 201002, 5.5, 2.6},
            {"Lile", 201003, 8.5, 9.6},
            {"Lils", 201004, 9.5, 8.6},
            {"Lilz", 201005, 3.5, 2.6},
            {"Lilw", 201006, 2.5, 8.6}
                            };
    int i;
    float aver1, aver2;
    for(i = 0, aver1 = 0, aver2 = 0;i < 6;i++){
        aver1 += stu[i].score1;        
        aver2 += stu[i].score2;        
    }
    aver1 /= 6.0;
    aver2 /= 6.0;
    for(i = 0;i < 6;i++){
        stu[i].score1 -= aver1; 
        stu[i].score2 -= aver2;
    }
    for(i = 0;i < 6;i++)
        printf("name:%s id:%d stucore:%f %f\n", stu[i].name, stu[i].id, stu[i].score1, stu[i].score2);
}

运算符

注意几点
  • 1.位运算(& | ^)符优先级高于逻辑运算符(&& || );
  • 2.取模运算符(%) 的两个操作数都要是 整型 ;
  • 3.运算符用于构成表达式,表达式产生值;
  • 4.赋值运算符(=),赋值表达式产生值,结合型自右向左;
  • 5.函数调用也是表达式(上表不全),表达式产生值。

函数(递归)

阶乘的计算。

#include <stdio.h>
int f(int x){
    if(x <= 1) //递归返回边界
        return 1;
    else return x * f(x -1);
}
int main()
{
    printf("%d\n", f(6));
    return 0;
}

递归就是函数调用本身,递归一定有返回边界;


小结,有码有真相

写出求斐波那契数的函数fib(n)

int fib(int n){
     //-------
}

答案戳这里

下期将有指针、宏、常用函数

PS:本来打算都写在这期的,结果太多了...