C语言基础复习


开发工具选择下载: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位/64位 数据类型对比
数据类型名称32位占字节67位取值范围

bool

布尔型11       true, false 
char字符型11-128 ~ 127
unsigned char无符号字符型110~255
short短整型22-32768~ 32767
unsigned short无符号短整型220 ~65535
int整型44-2147483648 ~ 2147483647
unsigned int无符号整型440 ~ 4294967295

long

长整型

4

8

--

long long         长整型88-2^64 ~ 2^64-1
unsigned long无符号长整型48--
float单精度浮点型44

范围:-2^128 ~ 2^128

精度:6 ~ 7位有效数字

double双精度浮点型88

范围:-2^1024 ~ 2^1024

精度:6 ~ 7位有效数字

long  double拓展精度浮点型88

范围:-2^1024 ~ 2^1024

精度:6 ~ 7位有效数字

point指针地址48

 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

二进制转换为十进制   1\times 2^{0}$+$1\times2^{1}$+$0\times2^{2}$+$ 1\times2^{3}=11D

二进制转换为八进制      $(1) $1011\rightarrow 001$,$011$;(2) $001\rightarrow 1$,$011\rightarrow 3;(3)1011B\to13O

二进制转换为十六进制  \\(1) 1011\to0000,1011 ;(2)0000\to 0;1011\to 11;\\(3)1011B\to0,11H=BH

十进制转换为八进制 (1)11011B\to11D;(2)\frac{11}{8}=1...3;(3)11D\to13O

十进制转换为十六进制(1)1011B\to11D;(2)\frac{11}{16}=0...11;(3)11D\to11H=BH

同样反转亦可

八进制与十六进制相互转换借助二进制

 

进制对应表格
十进制二进制八进制十六进制
0000000
1000111
2001022
3001133
4010044
5010155
6011066
7011177
81,000108
91,001119
101,01012A
111,01113B
121,10014C
131,10115D
141,11016E
151,11117F

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类型默认是字符型

\\$positive number$:$+$10\to00000000,000000000,00000000,00001010\\ $negative number $:$-$10 \to100000000,00000000,00000000,00001010\\ $radix-minus-onecomplement$:$-$10\to11111111,11111111,11111111,11110101\\ $complement code$:$-$10\to11111111,11111111,11111111,11110110

8.3 三码取值范围

8位字符型二进制 :

原码:【-127—— 127】;反码:【-127——127】;补码:【-128——127】

(+0= -0 1000000多出来,0的补码唯一)

8.4  输出格式

符号/无符号 输出格式
进制输出shortintlongunsigned shortunsigned intunsigned 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

标志字符含  义
--表示左对齐。如果没有,就按照默认的对齐方式,默认一般为右对齐。
+用于整数或者小数,表示输出符号(正负号)。如果没有,那么只有负数才会输出符号。
空格用于整数或者小数,输出值为正时冠以空格,为负时冠以负号。
#
  • 对于八进制(%o)和十六进制(%x / %X)整数,# 表示在输出时添加前缀;八进制的前缀是 0,十六进制的前缀是 0x / 0X。
  • 对于小数(%f / %e / %g),# 表示强迫输出小数点。如果没有小数部分,默认是不输出小数点的,加上 # 以后,即使没有小数部分也会带上小数点。

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;
}

 

16.2 while

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kusasakey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值