C语言郝斌老师视频学习笔记(按照自己掌握情况做的重点笔记)

【暂时还不熟练的程序学生信息系统、冒泡、链表】

12P

1、运行第二个程序要点close workplace
2、要移植程序只要拷贝文件 *.cpp

16P

1、程序运行:编译,链接生成一个.exe的可执行文件 然后点 !请求cpu执行这个文件

17P

1、枚举是复合数据类型

18P

int = 3;//3最终是存放在内存中,程序终止之后3所占的空间被释放掉

19P

1、变量的本质是内存条中的一段空间

20P

1、当软件运行完毕后,操作系统将回收该内存空间,但操作系统
并不清空该内存空间中遗留下来的数据(即垃圾数据),所以我们通常为变量、数组分配好内存后要初始化。

进制:

                                                         【10】                              【17】
1、二进制:逢二进一(0,1,10,11,100,101,110,111,1000,1001,1010,1011,1100,1101,1110,1111,10000,10001)
2、十进制:逢十进一(0,1,2, 3,  4,  5,  6,  7,  8,    9,   10 ,11, 12, 13, 14,  15, 16,  17)即通过8421码与二进制来记忆
3、八进制:逢八进一(0,1,2, 3,  4,  5,  6,  7,  10,  11,  12, 13, 14, 15, 16,  17,  20, 21)
4、16进制:逢16进一(0,1,2, 3,  4,  5,  6,  7,  8,    9,   A,   B,   C,   D,  E,    F,   10,  11,...1F,20,...2F)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
【重点】
【总结】十进制快速转二进制:

  1. 8421码(适用数值较小)
  2. 先转为十六进制,再将每一位数值分别以二进制的每四位换算,左边不够位补零

例1:

二进制:0101
十进制:5
三进制:12

例2:

12F + 1  =130  //逢十六进一       

例3:

五进制24的十进制为:2*5+4=14

例4:

    #include <stdio.h>
    int main(void)
    {
   
        int i = 0x32c;//等于12+2*16+3*16*16

        printf("i=%d\n",i);
        /*
            printf的用法
            %d表示以十进制输出
            %x或者%X表示以十六进制输出
            %o表示以八进制输出(!注意:这里与常量的整数八进制【0数字】区分开来,八进制数字前面是零不是字母o)
        */
        return 0;
    }

33P

例1、

    #include <stdio.h>
    int main(void)
    {
   
        int x = 47;
        
        printf("%x\n",x);//输出2f
        printf("%X\n",x);//输出2F
        printf("%#X\n",x);//输出0X2F
        printf("%#x\n",x);//输出0x2f
        
        printf("i = %d, j = %d\n",j, k);//推荐

        return 0;
    }

39P

【scanf】

1、用法一:scanf("输入控制符",输入参数);
   用法二:scanf("非输入控制符输入控制符",输入参数);//这里的非输入控制符必须原样输入

2、%输出\输入控制符&取地址符

3、使用scanf之前最好先使用printf提示用户以什么样的方式来输入

4、scanf中尽量不要使用非输入控制符,尤其是不要用\n

5、应该编写代码对用户的非法输入做适当的处理【即清除前面遗留下来的垃圾数据】

    while ((ch = getchar())  ! = '\n')
        continue;

44P

1. C语言对真假的处理
    非零是真
    零是假

2.  真是1表示
    假是0表示

49P

3.5%2 是不可以这样写的,数学上要求除数和被除数是整数

53P

1.if的范围问题:

    if (表达式)
        语句A;
        语句B;
    解释:if默认只能控制语句A的执行或不执行
            if无法控制语句B的执行或不执行
            或者说:语句B一定会执行

总结:if默认的只能控制一个语句的执行或不执行

2.

if  (表达式)
    {
    语句A;
    语句B;
    }
此时if可以控制语句A和语句B

由此可见:

if默认只能控制一个语句的执行或不执行
如果想控制多个语句的执行或不执行
就必须把这些语句用{}括起来

54P

1、如果新建文件时,软件会自动会添加后缀名.cpp  或 .c  。所以如果命名中含有符号点(.)则会编译等功能用不了则要手动加后缀才行

55P

1、调试错误且出现错误时按F4可以找到错误原因
2、全选代码之后按住alt然后按F8即可格式化代码

59P

1、程序 = 算法(解决方法的步骤) + 语言(C、java)  //所以一个问题上来先写他的解题思路(用伪代码写完在转化成语言代码)

60P

1、如何看懂一个程序,分三步:

  • (1)流程

  • (2)每个语句的功能

  • (3)试数

    eg:1/1+1/2+3+…+1/100

    #include <stdio.h>
    int main(void)
    {
   
        int i;
        float sum = 0;
        for(i = 1;i <= 100;i++)
            sum = sum + 1/(float)i;//float必须用%f输出
            //更简单的写法是:sum = sum + 1.0/i
        printf("sum = %f\n",sum);
        return 0;
    }		

试数过程:

1->  i = 1   1<=100   成立
    sum = 0+1/1.00 = 1    ++i      i = 2
2->  i =2    2<=100   成立
    sum = 1+1/2.0         ++i      i = 3
3->  i = 3   3<=100   成立
    sum = 1+1/2.0+1/3.0   ++i      i = 4

2、如何学习一些需要算法的程序【如何掌握一个程序】

(1)尝试自己去编程解决它

  • 但要意识到大部分人都是自己无法解决的,这是不要气馁,
  • 如果十五分钟还是想不出来,此时我建议您就可以看答案了

(2)如果解决不了,就看答案

  • 关键是把答案看懂,这个要花很大的精力,也是我们学习的重点
  • 看懂一个程序要分三步:流程、每个语句的功能、试数

(3)看懂之后尝试自己去修改程序,并且知道修改之后程序的不同输出结果的含义

  • 不建议看懂程序之后就立即自己敲程序

(4)照着答案去敲

(5)调试错误

(6)不看答案,自己独立把答案敲出来

(7)如果程序实在无法彻底理解,就把它背会,不过无法彻底理解的程序很少

72P

【浮点数的存储所带来的问题:】

1、float 和 double 都不能保证可以精确的存储一个小数,因为存储的是数值的近似值

举例:
float i = 99.9;
printf("%f\n",i);
最终在Vc++6.0的输出结果是:99.900002
因为浮点数无法准确存储,所以就衍生出来两个编程问题:
举例1:有一个浮点型变量x,如何判断x的值是否为零
    
if(|x-0.000001| <= 0.000001)    //加=是因为x=0时等号成立
    是零
else
    不是零

总结:x与一个非常小的值的差的绝对值小于等于这个值就表示x等于0

2、eg:本程序不对,因为循环中【更新的变量】(i)不能定义成浮点型

        float i;
        float sum = 0;
        for(i=1.0; i<=100;++i)
        {
   
                sum = sum + 1/i
        }

3、求1~100的奇数的平均数

    #include <stdio.h>
    int main(void)
    {
   
        int i;
        int sum = 0;
        int cnt = 0;
        float avg;//average的缩写
        
        for(i=1;i<101;++i)
        {
   
            if(i%2 == 1)
            {
   
                sum+=i;
                cnt++;
            }
        }
        avg = 1.0*sum/cnt;//1.0默认double类型,赋给float会丢失精度
        printf("cnt = %d\n",cnt);
        printf("sum = %d\n",sum);
        printf("avg = %f\n",avg);

        return 0;
    }

74P

4、多层for循环嵌套使用执行顺序

在这里插入图片描述

75P

1.十进制转r进制:除r取余,直至商为0,余数倒序排列

2. 1/2=0; 1%2=1;

76P

1.前自增和后自减的异同:

  • 相同:最终都使i的值加1
  • 不同:
    前自增整体表达式的值是i加1之后的值
    后自增整体表达式的值是i加1之前的值

2.为什么会出现自增

代码更加精炼、自增的速度更快

3.学习自增要明白的几个问题

1.我们编程时应该尽量屏蔽掉前自增和后自增的差别
2.自增表达式最好不要作为一个更大的表达式的一部分来使用
或者说
i++和++i单独成一个语句,不要把它作为一个完整复合语句的一部分来使用
如:
int m = i++ + ++i + i + i++;//这样写不但是不规范的代码,而且是不可移植的代码
printf("%d %d %d",i++,i++,i);//同上

78P

1.逗号表达式:

  • 格式:(A,B,C,D)
  • 功能:从左到右执行,最终表达式的值是最后一项的值

83P

1.for和while的比较

  • for和while可以相互转换
    即:
    for(1;2;3)
    A;
    等价于
    1while(2)
    {
   
        A;
        3;
    }
总结:虽然可以相互转换,但for的逻辑性更强,更不容易出错,推荐多使用for

84P

1.

12/10=1;    1/10=0;    10%12=10;     0%2=0;

2.斐波拉序列1,2,3,5,8…

#include <stdio.h>
int main(void)
{
   
    int n;
    int f1,f2,f3;
    int i;

    f1 = 1;
    f2 = 2;

    printf("请输入你需要的项的序列:");
    scanf("%d",&n);
    if (1 == n)
    {
   
        f1 = 1;
    }
    else if(2 == n)
    {
   
        f2 = 2;
    }
    else
    {
   
        for(i=3;i<=n;i++)
        {
   
            f3 = f2 + f1;
            f1 = f2;
            f2 = f3;
        }
    }
    printf("%d\n",f3);
    return 0;
}
  • 试数:假如 n = 6
- 1>    i=3     3<=6 成立 f3=1+2=3    f1=2    f2=3   
- 2>    i=4     4<=6 成立 f3=2+3=5    f1=3    f2=5   
- 3>    i=5     5<=6 成立 f3=3+5=8    f1=5    f2=8    
- 4>    i=6     6<=6 成立 f3=5+8=13   f1=8    f2=13   
- 5>    i=7     7<=6 不成立

89P

1.一元二次方程(do…while实现人机交互)

#include <stdio.h>
#include <math.h>
int main(void)
{
   
	double a, b, c;	
	double delta;
	double x1, x2;	
	char ch;

	do	
	{
   	
		printf("请输入一元二次方程的三个系数:\n");
		printf("a = ");
		scanf("%lf", &a);
		
		printf("b = ");
		scanf("%lf", &b);
		
		printf("c = ");
		scanf("%lf", &c);
		
		delta = b*b - 4*a*c;
		
		if (delta > 0)
		{
   
			x1 = (-b + sqrt(delta)) / (2*a);
			x2 = (-b - sqrt(delta)) / (2*a);
			printf("有两个解,x1 = %lf, x2 = %lf\n", x1, x2);
		}
		else if (0 == delta)
		{
   
			x1 = x2 = (-b) / (2*a);
			printf("有唯一解,x1 = x2 = %lf\n", x1, x2);
		}
		else
		{
   
			printf("无实数解!\n");
		}

		printf("您想继续么(Y/N): ");
		scanf(" %c", &ch);  //%c前面必须得加一个空格 原因略
	} while ('y'==ch || 'Y'==ch);
	
	return 0;
}

92P

1.break的用法

for (i=0;i<3;++i>)
{
    if(3>2)
    break;//break虽然是if内部语句,但break终止的却是for循环
    printf("嘿嘿!\n");//永远不会输出
}

for(i=0;i<=3;++i)
{
    for(j=1;j<=4;++j)
        break;//break只能终止最里面包裹它的那个循环
    printf("同志们好!\n");
}

3.break的用法

# include <stdio.h>
int main()
{
    
	int x=1, y=0, a=0, b=0;
	switch(x) // 第一个switch 
	{
     
	case 1:  
		switch(y)  // 第二个switch 
		{
     
		case 0:  
			a++; 
			break; //终止的是第二个switch  
		case 1:  
			b++; 
			break;
		}
		b = 100;
		break;   //终止的是第一个switch
	case 2: 
		a++;    
		b++;
		break;  
	}	
	printf("%d %d\n",a,b); //26行
	
	return 0;
}
//最终输出结果是:1,100

总结:

  • 在多层switch嵌套中,break只能最里面包裹它的switch
  • break不能直接用于if,除非if属于循环内部的一个字句

93P

1.continue的用法:

  • 用于跳过***本次循环***余下的语句,转去判断是否需要执行***下次***循环

96P

1.流程控制总测试

  • (1)
    在这里插入图片描述
  • (2)while默认控制一个语句
    在这里插入图片描述
  • (3)
    在这里插入图片描述
  • (4)
    在这里插入图片描述

99P

1.为什么需要数组

  • 为了解决大量同类型数据的存储和使用的问题
  • 为了模拟现实世界

101P

1.有关一维数组的操作

初始化
  • 完全初始化 int a[5] = {1,2,3,4,5}
  • 不完全初始化 int a[5] = {1,2,3} 未被初始化的自动为零
  • 不初始化,所有元素都是垃圾值 int a[5];
  • 清零 int a[5] = {0};
错误写法:
int a[5];
a[5] = {1,2,3,4,5};//错误
只有在定义数组的同时才可以整体赋值,
其他情况下整体赋值都是错误的

在这里插入图片描述

102P

1.二维数组的输出

for(i=0;i<3;i++)
{
    for(j=0;j<4;j++)
        printf("%d  ",a[i][j]);
    printf("\n");
}

103P

1.多维数组:

n维数组可以当作每个元素是n-1维数组的一维数组

106P

1.为什么需要函数

避免了重复性操作
有利于程序的模块化
  • 另:C语言中的模块化实质是以函数为基本单位(如下图示)
    在这里插入图片描述

107P

1.什么是函数

能够完成特定功能的独立的代码块

  • (1)
//max是函数的名字,i和j是形式参数,简称形参
//void表示函数没有返回值
#include <stdio.h>
void max(int i,int j)
{
   
	if(i>j)
		printf("%d\n",i);
	else
		printf("%d\n",j);
}

int main(void)
{
   
	int a, b, c, d, e, f;
	
	a = 1, b = 2; c = 3, d = 9, e = -5, f = 100;
	max(a,b);
	max(c,d);
	max(e,f);
	
	return 0;
}
  • (2)
# include <stdio.h>
int f(void)  //括号中的void表示该函数不能接受数据  int表示函数返回值是int类型的数据
{
   
	return 10; 
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值