【暂时还不熟练的程序学生信息系统、冒泡、链表】
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)
【重点】
【总结】十进制快速转二进制:
- 8421码(适用数值较小)
- 先转为十六进制,再将每一位数值分别以二进制的每四位换算,左边不够位补零
例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;
等价于
1;
while(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;