初学编程小记

以下是我最近学习c语言的笔记

听懂和会用是两码事

先把c语言学精了再触类旁通

就算代码写对了也要知道为什么做对了

写错了更要看怎么错的 程序出错的时候就是提高技术的时候

记笔记特别重要,所以就有了这个word

还有就是思维导图,学会去做,才能深刻明白这个代码的原理

还有我的一个习惯是对的,就是编程完把代码的运行过程描述一遍

把编程的原理和编程思想沉淀到大脑里面

迟早会开窍的

语法的规则和用法是完全有必要去背背的,这个是操作规范

能够建立起一个知识体系,这才叫精通,用思维导图去建立

猴博士的题

求根号中的表达式

    double a, b, c,s,area;

    scanf_s(" % lf, % lf, % lf", &a, &b, &c);

    s = (a + b + c) / 2;

    area = sqrt(s * (s - a) * (s - b) * (s - c));

    printf("a=%f\tb=%f\tc=%f\n", a, b, c);

    printf("area=%f\n", area);

输入一个三位数,分别输出个十百位

  double a;

    int ge, shi, bai;

    scanf_s("%lf", &a);

    bai = (int)(a / 100);   加上(int)的目的是取整数部分 (int)3.14就是3

    shi = (int)((a - bai * 100) / 10);     此处运用数学思维

    ge = (int)(a - bai * 100 - shi * 10);

    printf("个位数为%d", ge);

    printf("十位数为%d", shi);

printf("百位数为%d", bai);

比较三个值的大小并从大到小排列

    double a, b, c, t;

    scanf_s("%lf,%lf,%lf", &a, &b, &c);

    if (a > b)

    {

        t = a;    t作为临时变量,起到一个承接的作用

        a = b;    b把值赋予给了a

        b = t;    最后t把a的值给了b,从而实现了大小互换

    }

    if (a > c);     其他同理

    {

        t = a;

        a = c;

        c = t;

    }

    if (b > c);

    {

        t = b;

        b = c;

        c = t;

    }

printf("%f,%f,%f\n", a, b, c);

将三个整数大小排序pro max

void LargToSm(int a, int b, int c)

    {

    int temp;

    if (a < b)

    {

        temp = a;

        a = b;

        b = temp;

    }

    if (a < c)

    {

        temp = a;

        a = c;

        c = temp;

    }

    if (b < c)

    {

        temp = b;

        b = c;

        c = temp;

        printf("%d%d%d", a, b, c);

    }

}

int main()

{

    int x, y, z;

    scanf_s("%d%d%d", &x, &y, &z);

LargToSm(x, y, z);

此处涉及两个变量的互换

如果没有临时变量t

假设a为5 b为6

a=b 运行后 a得到了b的值变成了6,但是b的值还是6

这时候再运行b=a,已经没有5了

原理相当于交换两杯水,需要一个空杯子

翁恺老师

常见表达形式

>

>=

<

<=

==等于

区分= ,a=b指b把值赋予a

而==就是条件中a等于b而不是赋值

!=是不等于的意思

&&为两边均满足

例如 a>b&&b>c

||两边满足一个

a>b||b>c

计算找钱plus

#include<stdio.h>

int main()

{

    int amount = 100;

   

    int price = 0;   

    printf("请输入价格:");

    scanf_s("%d", &price);

    printf("请输入票面:");

    scanf_s("%d", &amount);

    int change = amount - price;

    printf("the change is:%d\n", change);

    return 0;

用int去定义的话,输出部分如果有小数部分则只输出整数部分

计算身高

printf("请分别输入身高的英尺和英寸:"

        "如输入\"5 7\"表示5英尺7英寸:");

    double foot;

    double inch;

    scanf_s("%lf %lf", &foot, &inch);

    printf("身高为%lf米\n",

        ((foot + inch / 12) * 0.3048));输出部分也可以用一个列式

摄氏度华氏度的转化

    double h,s;

    scanf_s("%lf", &h);

    s = (h - 32) * 5 / 9.0;

    printf("%.2lf", s);   注意,在%和lf之间加.2为取小数点后两位的意思

浮点数概念

带小数的数叫做浮点数

确定点位的叫做定点数

Double是双精度浮点数

Float 是单精度浮点数

=+-这些都是运算符

算式中的量都是算子

计算时间差思路

第一步是先分别定义两个时间的小时和分钟

然后用scanf函数输入

第二步统一单位,将小时换算为分钟

第三步进行相减,用整数除法直接获得小时

用%取余获得分钟

int hour1, hour2, min1, min2;

    printf("请输入时间:");

    scanf_s("%d %d", &hour1, &min1);

    scanf_s("%d %d", &hour2, &min2);

    int t1 = hour1 * 60 + min1;

    int t2 = hour2 * 60 + min2;

    int t = t2 - t1;

    printf("时间差为%d小时%d分钟", t / 60,t % 60);

求平均数

注意,两个整数的平均数可能会出现一位小·数

因此要除以2.0

int a, b;

    printf("请输入两个整数:");

    scanf_s("%d %d", &a, &b);

    double c = (a + b) / 2.0;

    printf("平均数为:%lf", c);

运算符优先级

加号

单目不变

自右向左

减号

单目取负

自右向左

乘号

自左向右

除号

自左向右

取余

取余

自左向右

加号

自左向右

减号

自左向右

赋值

=

自右向左

越上面优先级越高

单目运算符的+-相当于数学中的正负号

赋值也是运算,也有结果

例如a=b=6

先进行6把值赋给b,然后才把得到6这个值的b赋予给a

赋值的优先级是最低的,先计算等号右边的部分

表达式不要写成一大串,最好拆开写

复合赋值运算

例如 total+=(sum+100)/2

相当于total=total+(sum+100)/2

total*=sum+12

注意,这时候要把右边算完才能进行复合运算

相当于在sum+12左右加了括号

Total=total*(sum+12)

“++””--”

相当于给一个变量+1或者-1

A++ 和 ++A 有什么区别呢

一个是前缀形式一个是后缀形式

结果不同

分别是a加1以前的值和a加1以后的值

比如a=10,a++就是10,但是副作用是a=11

在进行一次++a,++a=12,a也是12

找钱问题pro

int price = 0;

    int bill = 0;

    printf("请输入金额:");

    scanf_s("%d", &price);

    printf("请输入票面:");

    scanf_s("%d", &bill);

    if (bill > price)

    {

        printf("应该找您%d元\n", bill - price);

    }

    else

    {

        printf("你就这点钱???\n");

    }

鸡兔同笼

方法一:公式法

int n, m;

    scanf_s("%d %d", &n, &m);

    int r = m / 2 - n;

    int c = n - r;

    printf("%d %d", c, r);

    return 0;

#include<stdio.h>

int main()

{

关于VIP打折的问题(扩展)

    float finalprice(char isVIP,float count, float price);

    char vip;

    float exchangeCount, price, sum;

    printf("is vip?true input'T'or't',or the other key");

    scanf_s("%c", &vip);

    printf("please input the price");

    scanf_s("%c", &price);

    printf("please input the count");

    scanf_s("%c", &exchangeCount);

    sum = finalprice(vip, exchangeCount, price);

    printf("the total is:%f\n", sum);

    return 0;

}

float finalprice(char isVIP, float count, float price)

{

    if (isVIP == 't' || isVIP == 'T')

        return 0.7 * count * price;

    else

        return count * price;

}

初识const

Const用于定义常数,也就是说,定义的变量的值不能在后续的程序中被重新定义

例如以下问题

计算薪水

const double rate = 100;                 通过const设定标准

    const int standard = 40;

    double pay=0.0;

    int hour;

    printf("请输入工作小时数:");

    scanf_s("%d", &hour);

    printf("\n");

    if (hour > standard)

    {

        pay = rate * standard + (hour - standard) * (rate * 1.5);

    }

    else

    {

        pay = rate * standard;

    }

    printf("应付工资为%f\n", pay);

最近易错的点:

定义的变量没有设置初始值

Printf没有加f

Scanf函数里面忘记加&

判断是否为偶数

int a;

    scanf_s("%d", &a);

    if (a % 2 == 0)

    {

        printf("true");

    }

    else {

        printf("false");

    }

比较三个数大小plus

斐波那契数列

先来一个比较两个数的大小pro

#include <stdio.h>

int max(int x, int y)

{

此处运用了max函数,用于比较括号内的变量大小,难点在于两段式的代码,先定义max函数,比较大小时直接引用

    int z;

    if (x > y)

        z = x;

    else

        z = y;

    return(z);

}

int main()//主函数

{

    int max(int x, int y);

    int a, b;

    scanf("%d %d", &a, &b);

    int c;

    c = max(a, b);

    printf("max is %d", c);

    return 0;

}

写法二

int a, b, c;

scanf("%d %d", &a, &b);

c = max(a, b);

printf("最大的数为:%d", c);

下面切入正题

a>b成立的情况下

第一个判断:先比较a和b哪个比较大,哪个小踢掉哪个,这时候拿大的和c来比较

第二个判断:假设a比b大,a现在和c进行比较,如果发现a还是比c大,那么结果就是a

第三个判断:第二种判断中,如果a比c小,那么结果就是c

a>b不成立的情况下

第一个判断:比较b和c,谁大谁胜出

原理和打擂台差不多

那么用代码实现

int a, b, c;

    scanf_s("%d %d %d", &a, &b, &c);

    int max = 0;

    if (a > b)

    {

        if (a > c)

{

            max = a;                 此处易错点为大括号的包容关系

        }

        else

            max = c;

    }

    if (a < b)

    {

        if (b > c)

{

            max = b;

        }

        else                   else和最近的if匹配(编译器默认的)

                   所以要加大括号

            max = c;

    }

printf("the biggest is%d", max);

程序实验课

一个程序其实是由多个源文件组成

必须要有一个int main(主函数)

以上我写的程序都基本上是只有一个源程序文件

主函数是老大不能调用

其他函数都可以任意使唤

·预处理指令

·全局声明

·函数定义          #include<stdio.h>等

  

思路:第一步,判断是否x<0

是则直接输出,不是则继续判断

第二步,判断x是否==0

是则输出0,不是的话最后只能输出2x

分段函数

例如f(x)=-1;  x<0

         0;   x=0

               2x;  x>0

此处的代码运用了级联的if-else if

·让所有的else对齐

I模板:f(expl)

  St1;

  Else if(exp2)

  St2;

  Else

  St3;

代码为

Int f;

If(x<0){

f = -1;

} else if(x == 0);

f = 0;                            此处的else一一对齐

} else {

f = 2*x;

}

printf(“%d”, f ) ;       单一出口

再谈if else

易错点

·忘了加大括号

·if后面的分号

·错误使用==和=(赋值和相等)

·使人困惑的else

要尊重王宁!!!!根据王宁来解决问题

大括号里面的语句用tab缩进

这样写的代码比较瘦长

一般大企业都有自己的规范要求(企业文化)

多路分支

switch(控制表达式){

case 常量:常量如1,2,3,4

  语句

case 常量

  语句

default:

语句

}

switch-case

int type;

    scanf_s("%d", &type);

    switch ( type ) {

    case 1:

             printf("你好");

             break;

    case 2:

             printf("早上好");

             break;

    case 3:

假如输入3,则直接跳过了case1,2来到了3,运行完3里面的语句会继续往下跳,直到遇到了break,break是一个路牌

             printf("晚上好");

             break;

    case 4:

             printf("再见");

             break;

    default:

             printf("啊????");

}

循环

If和else具有局限性,如果想体现任意范围就不行了

这时候就需要循环了

模拟一下运行过程

x      n(循环一次n+1)

352    0

X的值回到while那一行

35     1

循环

3      2

3除以10等于0   结果n=3

不满足x>0,停止循环

输出结果

第一个循环代码,计算几位数

int x;

    int n = 0;

    scanf_s("%d", &x);

    n++;     n++即为n+1的意思

    x /= 10;

    while (x > 0) { 一直重复判断x是否大于0直到最后一位数

        n++;

        x /= 10;

    }

    printf("%d\n", n);

为什么while里面不能是x>=0呢

因为等于0的话,输出0的时候就是死循环了

计算log2x,计算x是2的几次方

错误举例

int x;

    int ret=0;                 为什么这个ret从0开始?

    scanf_s("%d", &x);    

    while (x > 1) {            为什么循环的条件是x>1?

        x /= 2;

        ret++;

    }

printf("log2 of %d is %d", x, ret);

输入16

此时的输出结果为log2 of 1 is 4

为什么x的值会变成1呢

因为x值结果循环后不满足x>1,结果为1

直接输出1

对策,计算之前先保留原始值

Do-while循环

Do

{

  <循环体语句>

}while(<循环条件>)

int x;

    scanf_s("%d", &x);

    int n = 0;

    do

    {

        x /= 10;

        n++;

    } while (x > 0);

printf("%d", n);

也可以把while当作“当”

当条件满足时,不断地循环循环体内的语句

倒计时发射

#include<stdio.h>

int main()

{

    int count = 3;    想设定倒计时的数值可以从这里输入

    while (count >=0) {

        printf("%d\n", count);

        count--;

    }

    printf("发射!\n");循环走了四轮

    return 0;

}

此处count—与循环体中printf的相对位置和运行的结果有很大的关系

休闲游戏——猜数游戏

让用户不断地去猜数,所以要用到循环

循环的条件最重要,以及循环终止的条件

1·让计算机随机想一个数

2·计数的变量const的初始化为0

3·用户输入一个数字a

4·const递增++

5·判断a和number的大小关系,如果a大则输出大,如果a小则输出小

6·如果a和number的大小不相等(循环的条件)则回到第三步

7·否则,程序输出“猜中”和次数,程序结束

计算机随机出一个数,用到了rand()

 X%n的结果是[0,n-1]的一个整数

代码如下

#include<stdio.h>  

#include<stdlib.h>

#include<time.h>                     计时

int main()

{

    srand(time(0));  

    int number = rand() % 100 + 1;   随机取一个1到100的数,加1使得值不取到0并且能取100

    int count = 0;                 初始值为0

    int a = 0;

    printf("我已经想好了一个0到100之间的数。");

    do {

        printf("猜猜这个1到100的数:");

        scanf_s("%d", &a);

        count++;                     猜数的所用次数加1

        if (a > number) {

            printf("你猜的数大了");

        }

        else if (a < number) {

            printf("你猜的数小了"); 对a和number的大小关系进行判断

        }

    } while (a != number);          如果a等于number,循环结束

    printf("太好了,你用了%d次就猜到了答案\n", count);

    return 0;

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值