开发工具选择下载:vc 6、vc 2012 、Dev c++ (建议)、codeblock(推荐)
Dev c++ 下载地址:https://sourceforge.net/projects/orwelldevcpp/
codeblocks 下载地址:https://sourceforge.net/projects/codeblocks/
前言
C语言历程及其基础知识点与基础典型问题解决
1、C语言起源和发展历史
产生:1972-1973
产生地址:美国贝尔实验室
创始人:Dennis.M.Ritchie a&&Ken.Thompson
目的:改写UNIX操作系统
发展历程: 1983 ANSI C ;1987 ANSI C 87;1994 C99
2、程序设计语言
第一代语言:机器语言
第二代语言:汇编语言
第三代高级语言:
结构化语言 :Fortran Basic C Pascal
面向对象 OO:Aglo simula67 Ada SmallTalk C++ Java Python Javascript C#
3.C语言关键字
32个
auto 、 break 、 case 、char 、const、 continue 、default 、 do、double、 else 、enum 、extern 、 float 、for 、goto 、if 、 int 、 long 、 register 、return 、short 、signed 、 sizeof 、static、 struct 、switch 、typedef 、 unsigned 、union 、void 、 volatile 、 while
4.推荐书籍
《C primer Plus 》 人民邮电
《C与指针》 人民邮电
《The C programmming language 》 机械工业
《C 专家编程》
《C陷阱与缺陷》 人民邮电
《C科学与艺术》 机械工业
5.cpp结构
#include <stdio.h> //头文件
int main() //主函数
{
printf("welcome c! \n"); // 主体内容
return 0; // 返回值
}
6.数据类型
数据类型 | 名称 | 32位占字节 | 67位 | 取值范围 |
bool | 布尔型 | 1 | 1 | true, false |
char | 字符型 | 1 | 1 | -128 ~ 127 |
unsigned char | 无符号字符型 | 1 | 1 | 0~255 |
short | 短整型 | 2 | 2 | -32768~ 32767 |
unsigned short | 无符号短整型 | 2 | 2 | 0 ~65535 |
int | 整型 | 4 | 4 | -2147483648 ~ 2147483647 |
unsigned int | 无符号整型 | 4 | 4 | 0 ~ 4294967295 |
long | 长整型 | 4 | 8 | -- |
long long | 长整型 | 8 | 8 | -2^64 ~ 2^64-1 |
unsigned long | 无符号长整型 | 4 | 8 | -- |
float | 单精度浮点型 | 4 | 4 | 范围:-2^128 ~ 2^128 精度:6 ~ 7位有效数字 |
double | 双精度浮点型 | 8 | 8 | 范围:-2^1024 ~ 2^1024 精度:6 ~ 7位有效数字 |
long double | 拓展精度浮点型 | 8 | 8 | 范围:-2^1024 ~ 2^1024 精度:6 ~ 7位有效数字 |
point | 指针地址 | 4 | 8 |
C语言的数据类型 包括 :char、 unsigned char 、 int 、unsigned int 、short 、unsigned short 、long unsigned、 long 、float 、double 、long double
7.数据存储 进制转换
7.1 n进制:逢n进一
二进制 B ;八进制 O;十进制 D; 十六进制 H;
7.2 进制转换的计算:
1011B 二进制 1011
二进制转换为十进制
二进制转换为八进制
二进制转换为十六进制
十进制转换为八进制
十进制转换为十六进制
同样反转亦可
八进制与十六进制相互转换借助二进制
十进制 | 二进制 | 八进制 | 十六进制 |
0 | 0000 | 0 | 0 |
1 | 0001 | 1 | 1 |
2 | 0010 | 2 | 2 |
3 | 0011 | 3 | 3 |
4 | 0100 | 4 | 4 |
5 | 0101 | 5 | 5 |
6 | 0110 | 6 | 6 |
7 | 0111 | 7 | 7 |
8 | 1,000 | 10 | 8 |
9 | 1,001 | 11 | 9 |
10 | 1,010 | 12 | A |
11 | 1,011 | 13 | B |
12 | 1,100 | 14 | C |
13 | 1,101 | 15 | D |
14 | 1,110 | 16 | E |
15 | 1,111 | 17 | F |
7.3 进制输出
#include <stdio.h>
#include <stdlib.h> // _itoa()
int main()
{
char s[32];//二进制打印使用
int a = 0b1011;//二进制 ob或 0B开头,数字为0或1
//int b = 0B421;//错误二进制
_itoa(a,s,2);
/*
itoa函数原型:char *itoa( int value, char *string,int radix)
功能:将整形数据value转化成需要的进制radix,然后将之以字符串的形式存放在string中;
返回值:转化成对应进制后的字符串的地址,也可以不使用返回值;
它的三个参数依次为:
value:需要转化的整形数据;
string:转化成对应进制后的字符串的地址;
radix :需要转化的进制(我这里需要转化为2进制,所以填2);
*/
printf("二进制为:%s\n",s); //int 类型 2进制打印比较特殊
printf("八进制为:%o\n",a); //int 类型 8进制 %o
printf("十进制为:%d\n",a); //int 类型 十进制 %d
printf("十六进制为:%X\n",a); // int 类型 16进制 %x或者%X(大写字母)
short c = 017;//八进制 0 开头 ,数字为0,1,2,3,4,5,6,7
_itoa(c,s,2);
printf("二进制为:%s\n",s);
printf("八进制为:%ho\n",c); //short 类型 8进制 %ho
printf("十进制为:%hd\n",c); //short 类型 十进制 %hd
printf("十六进制为:%hx\n",c); // short 类型 16进制 %hx或者%hX
long d = 0xff;//16进制 0x 或者0X 开头 ,数字为0,1,2,3,4,5,6,7,8,9,a(A),b,c,d,e,f
_itoa(d,s,2);
printf("二进制为:%s\n",s);
printf("八进制为:%lo\n",d); //long 类型 8进制 %lo
printf("十进制为:%ld\n",d); //long 类型 十进制 %ld
printf("十六进制为:%lx\n",d); // long 类型 16进制 %lx或者%lX
return 0;
}
printf("%x\n", x); //输出结果是: 2f
printf("%X\n", x); //输出结果是: 2F
printf("%#X\n", x); //输出结果是: 0X2F %#X推荐使用
printf("%#x\n", x); //输出结果是: 0x2f
8.signed 与 unsigned
8.1 区别
字符型 与 无字符型 :存储的数据是否有符号位
例如:符号型 符号位为0和1 0表示正数;1表示复数。
8.2 原码,补码,反码
正数的原码、补码、反码相同。
负数 原码 ,反码(符号位不变,其他位置取反),补码(反码末尾+1)
1字节 = 8位 ; 1 Byte = 8bit
例如: int i = -10; 变量i为int 类型占据4个字节,int类型默认是字符型
8.3 三码取值范围
8位字符型二进制 :
原码:【-127—— 127】;反码:【-127——127】;补码:【-128——127】
(+0= -0 1000000多出来,0的补码唯一)
8.4 输出格式
进制输出 | short | int | long | unsigned short | unsigned int | unsigned long |
OTC | %ho | %o | %lo | %ho | %o | %lo |
DEC | %hu | %d || %u | %ld | %hu | %u | %lu |
HEX | %hx || %hX | %x ||%X | %lx ||%lX | %hx || %hX | %x ||%X | %lx || %lX |
9.一元二次方程简单版本
#include <stdio.h>
#include <math.h>
int main()
{
double a,b,c; // 一元二次方程的所有系数
scanf("%lf%lf%lf",&a,&b,&c);
double delta = b*b-4*a*c;
double x1,x2;
if (delta >0)
{
x1 = (-b+sqrt(delta))/(2*a);
x2 = (-b-sqrt(delta))/(2*a);
printf("方程的解为:%lf ,%lf",x1,x2);
}
else if (delta ==0)
{
x1=x2 = -b /(2*a);
}
else
{
printf("无实数解!");
}
return 0;
}
10.代码编码规范
变量命名规则:驼峰规则 ,字母下划线开头,组成包括字母、下划线、数字
变量使用; 代码同等级缩进; ;代码注释; 括号范围
11. 数据运算、逻辑运算
加减乘除、取余,复合运算等
除法运算:int/int = int;int/float(double)=float(double)
# include <stdio.h>
int main(void)
{
int i;
float sum = 0;
for (i=1; i<=100; ++i)
{
sum = sum + 1.0/i; //是OK的 推荐使用
//sum = sum + (float)(1/i); 这样写是不对的
//也可以这样写: sum = sum + 1 / (float)(i); 不推荐
}
printf("sum = %f\n", sum); //float必须用%f输出
return 0;
}
取余与暖:运算对象必须为整数,结构Wie整除后的余数,余数的符号与被除数相同。
例如13%-3=1 ;-13% 23 = 13
&& 且运算 ,A || B,A为真,B则不执行,否则B执行,A,B全假时,总体为假。
复合运算:-=;+=;/=;*=
i++ 返回i后加1; ++i 加1 后返回执行结果;i++, ++i 在总体求结果是一样的。
i-- 与 -- i 类似。
12.scanf 、printf
12.1 scanf
1)单值读取,多值读取,格式化输入
使用 & 获取它们的地址,scanf 会根据地址把读取到的数据写入内存
int i; # 整数决定 %d ,其他包括%c、%d、%f、%s
scanf("m=%d",&i); //输入时按照m=整数输入
float j;
scanf("%f",&j);
char a,b,c;
scanf("%c %c %c ",&a,&b,&c); //空格或者回车,中途输入时
int d;
scanf("%d\n",&d);// \n 不推荐使用,产生问题
2)格式控制符
scanf() 读取字符串时以空格为分隔,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串
格式控制符 | 说明 |
---|---|
%c | 读取一个单一的字符 |
%hd、%d、%ld | 读取一个十进制整数,并分别赋值给 short、int、long 类型 |
%ho、%o、%lo | 读取一个八进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型 |
%hx、%x、%lx | 读取一个十六进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型 |
%hu、%u、%lu | 读取一个无符号整数,并分别赋值给 unsigned short、unsigned int、unsigned long 类型 |
%f、%lf | 读取一个十进制形式的小数,并分别赋值给 float、double 类型 |
%e、%le | 读取一个指数形式的小数,并分别赋值给 float、double 类型 |
%g、%lg | 既可以读取一个十进制形式的小数,也可以读取一个指数形式的小数,并分别赋值给 float、double 类型 |
%s | 读取一个字符串(以空白符为结束) |
3)字符串输入、输出
putchar函数是字符输出函数,其功能是在终端(显示器)输出单个字符。其函数原型为:
putchar(int ch) ;ch表示要输出的字符内容,返回值作用为:如果输出成功返回一个字符的ASC码,失败则返回EOF即-1
getchar函数的功能是接收用户从键盘上输入的一个字符。其一般调用形式为:
getchar(); getchar会以返回值的形式返回接收到的字符.
char c; /*定义字符变量c*/
c=getchar(); /*将读取的字符赋值给字符变量c*/
// 字符串定义
char str1[]="this is a string !";
char *str2="this is a string too.";
#include <stdio.h>
int main()
{
char str1[5];
gets(str1); // 输入字符串
puts(str1); // 输出字符串,自动换行
printf("%s\n",str1);
//char *str2="hello";
//puts(str2);
return 0;
}
12.2 printf
printf (%[flag][width][.precision]type
1)flag
标志字符 | 含 义 |
---|---|
- | - 表示左对齐。如果没有,就按照默认的对齐方式,默认一般为右对齐。 |
+ | 用于整数或者小数,表示输出符号(正负号)。如果没有,那么只有负数才会输出符号。 |
空格 | 用于整数或者小数,输出值为正时冠以空格,为负时冠以负号。 |
# |
|
2)width 表示最小输出宽度,也就是至少占用几个字符的位置;例如,%-9d
中 width 对应 9,表示输出结果最少占用 9 个字符的宽度。
3).precision 表示输出精度,也就是小数的位数。
- 当小数部分的位数大于 precision 时,会按照四舍五入的原则丢掉多余的数字;
- 当小数部分的位数小于 precision 时,会在后面补 0。
4)type 表示输出类型,比如 %d、%f、%c、%lf,type 就分别对应 d、f、c、lf;再如,%-9d
中 type 对应 d。
13.选择结构
13.1 if
1.选择条件
if (3)
printf("AAAA\n"); //会输出
if (0)
printf("BBBB\n"); //不会输出
if (0 == 0)
printf("CCCC\n"); //会输出
return 0;
2. if ;else if ; else
# include <stdio.h>
int main()
{
float score; //score分数
printf("请输入您的考试成绩: ");
scanf("%f", &score);
if (score > 100)
printf("这是做梦!\n");
else if (score>=90 && score<=100) //不能写成 90<=score<=100
printf("优秀!\n");
else if (score>=80 && score<90)
printf("良好!\n");
else if (score>=60 && score<80)
printf("及格!\n");
else if (score>=0 && score<60)
printf("不及格! 继续努力!\n");
else
printf("输入的分数过低,不要如此自卑!\n");
return 0;
}
3.嵌套选择;分层选择
//1到100之间所有的能被3整除的数字之和
#include <stdio.h>
int main()
{
int i;
int sum = 0;
for (i=3;i<101;++i)
{
if(i%3==0)
{
sum+=i;
}
printf("sum=%d\n",sum);
}
return 0;
}
13.2 swtich
13.3
14.读懂程序
如何看懂一个程序,分三步:
1. 流程
2. 每个语句的功能
3. 试数
如何学习一些需要算法的程序【如何掌握一个程序】
1. 尝试自己去编程解决它
但要意识到大部分人都是自己无法解决的,这时不要气馁, 也不要自卑, 如果十五分钟还想不出来, 此时我建议您就可以看答案了
2. 如果解决不了, 就看答案
关键是把答案看懂, 这个要花很大的精力,也是我们学习的重点,看懂一个程序要分三步: 流程、每个语句的功能、 试数
3. 看懂之后尝试自己去修改程序,并且知道修改之后程序的输出结果的含义
不建议看懂程序之后就立即自己敲程序
4. 照着答案去敲
5. 调试错误
6. 不看答案,自己独立把答案敲出来
7. 如果程序实在无法彻底理解
15.互换数字、排序数字
15.1 两位数字互换
# include <stdio.h>
int main()
{
int i =3,j=4;
int temp;
printf("i=%d,j=%d\n",i,j);
temp=i;
i=j;
j=temp;
printf("i=%d,j=%d\n",i,j);
return 0;
}
15.2 交换数值排序3个数
# include <stdio.h>
int main()
{
void swap(int ,int);
int a,b,c;
int t;
scanf("%d %d %d",&a,&b,&c);
printf("初始数据:%d %d %d\n", a, b, c);
if (a<b)
{
t=a;
a=b;
b=t;
}
printf("排序数据:%d %d %d\n", a, b, c);
if (a<c)
{
t=a;
a=c;
c=t;
}
printf("排序数据:%d %d %d\n", a, b, c);
if (b<c)
{
t=b;
b=c;
c=t;
}
printf("排序数据:%d %d %d\n", a, b, c);
return 0;
}
15.3 dev c++ debug 设置
打断点,开始调试,控制台同步操作
16.循环结构
16.1 for
# include <stdio.h>
/*
求1到100之间的奇数之和
求1到100之间的奇数的个数
求1到100之间的奇数的平均值
求1到100之间的奇数之和, 再求1到100之间的偶数之和
*/
int main(void)
{
int i;// 当前数据
int odd_sum=0; // 偶数之和
int even_sum=0; // 奇数之和
int odd_count=0; // 偶数个数
int even_count=0; // 奇数个数
for(i=1;i<101;i++)
{
if(i%2==0)
{
odd_sum+=i;
odd_count++;
}
else
{
even_sum+=i;
even_count++;
}
}
printf("1-100内偶数个数:%d,偶数总和:%d\n",odd_count,odd_sum);
printf("1-100内奇数个数:%d,奇数总和:%d,奇数平均数:%d\n",even_count,even_sum,even_sum/even_count);
return 0;
}