/*块注释不允许嵌套使用*/
良好的编程风格:
良好的注释,整齐的缩进,适当的空行,适当位置的空格,每行最多只有一个语句。
算法的特征:
有穷性,确切性,可行性,一个算法有零个或多个输入、输出。
b,B,KB,MB,GB,TB,
一个字节有多大?
8位二进制,256个数
变量:内存中一块连续的内存空间
数据类型
int a=3;
int a;//a不确定是几。随机。是这块空间上一次的值
按下删除键,空间被释放,但是并没有被破坏或覆盖,所以cgx并不是真正的删除
变量名:
由字母,数字,下划线组成,不能以字母开头,不能以关键词命名
不用printf函数的时候可以用printf做变量名??!!!。。。
C语言:
VS系列:在一个代码段中,变量的定义语句必须放在执行语句之前。。(还好我是CB。)
不过cpp事儿就没那么多了
初始化:分配内存的同时指定一个初始值,如int a=3;
数据类型介绍:
负数是以补码的形式存储
计算过程分析:
64-12=
64-12+99+1-100=
64-12+99+1=
64+(99-12)反码+1(补码)。。
数据的溢出:
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
\n换行
\r回车
字符型是最小的整型
char型的数据在内存中保存的是字母的ASCII码
(美国信息交换标准代码)
大小写字母转换:
小写字母+(‘A’-‘a’)=大写字母
‘a’+1=‘b’;
十进制小数转二进制:3.25是11.01(整数部分除二取余,小数部分乘二取整)
二进制小数转换为科学计数法:11.01->1.101* 21
浮点数类型无法精确表示数值,
浮点数类型无法精确判等
原因:尾码无法精确存储,有舍去的部分
保证:|0.1+0.2-0.3|<=0.000001就行了
.
.
.
整形字面值:(默认int)
十进制
十六进制0x…或ox…
八进制0…(数字0开头)
1.3e10就是1.3*10的10次方
转义字符:
'\n','\\','\'','\"',
就是’\n’,’\’,’’’,’"’,
实型字面值,默认是double!!!
float f=3.14; //可能会警告
这样写:
float f=3.14f;
3.14是double
3.14f是float
555l是long型
555ll是long long型
100u就是unsigned int
给long long 型赋值最大值:
long long int a=0xffffffffffffffffll
字符型字面值:
‘\ddd’是三位8进制数代表的字符
‘\141’就是97在ascii中代表的字符 小a
‘\xhh’是两位16进制数代表的字符
‘\61’就是97,还是小a的意思
‘\077’可以写成’\77’
字符串字面值:
字符串在内存中存储时,会在末尾自动添加一个’\0’(结束符,表示字符串结尾)
“abc"就是’a’,‘b’,‘c’,’\0’.
""空字符串:就有一个’\0’
字符串长度:就是\0之前的字符的个数
\0的ascii值就是0
字符串字符个数:实际存储的个数
其中的’\n’为转义字符(换行符),计算字符串长度时只能计作一个字符
一个转义字符总是由反斜杠加其他字符组成的,单独的一个反斜杠不能作为任何合法的字符
当遇到转义字符’\0’时要看其后面是否还有数字,若有,则应将后面的数字(一至二位)与前面的’\0’相结合作为一个字符计入整个字符串的长度
举个例子:
(1) 字符串 “abc\n ”:其中的’\n’为转义字符(换行符),计算字符串长度时只能计作一个字符,所以 该字符串的长度为4 (而不是5)
(2) 字符串 “abc\n\’"" :其中有4个转义字符:’\n’(换行符)、’\’(反斜杠)、’’’(单引号)、’"’(双引号),所以 该字符串的长度为7 (而不是11)。
(3) 字符串 “abc\0xyz” :其中有一个转义字符’\0’,它是字符串结束符,所以,当用函数strlen来测试该字符串的长度时,结果 应该为3 (而不是7)。
(4) 字符串 “abc\0xy” :其中有一个转义字符’\’(反斜杠),这样,后面的字符串“0xy”照样计算,所以, 该字符串的长度为7 (而不是将第二个反斜杠与其后的0结合为一个转义字符’\0’,
若那样的话,第一个反斜杠将无法处理,因为一个转义字符总是由反斜杠加其他字符组成的,单独的一个反斜杠不能作为任何合法的字符)。
(5) 若将字符串“abc\0xy”改为 “abc\\0xy” :则其中有二个转义字符’\’(反斜杠)和’\0’(字符串结束符),这时,当用函数strlen来测试该字符串的长度时,结果 应该为4 (而不是7)。
(6) 若将字符串“abc\\0xy”改为 “abc\\061xy” :则其中有二个转义字符’\’(反斜杠)和 ‘\061’(ASCII码值等于061的字符,也即数字字符’1’) ,这时,当用函数strlen来测试该字符串的长度时, 结果应该为7 (而不是4或9)。所以,当遇到转义字符’\0’时要看其后面是否还有数字,若有,则应将后面的数字(一至二位)与前面的’\0’相结合作为一个字符计入整个字符串的长度。
若用printf(“abc\\061xy”);输出,则输出结果为:abc\1xy
48到57是0到9这些阿拉伯数字,所以,061是8进制,转化成10进制就是1+6*8=49,49就是ASCII的数字1.。。
字符串长度是5,字符个数是6
C语言运算符的优先级
%p打印指针
%e是float或double型
C语言scanf()和gets()及printf()和puts()的区别
1.scanf()
所在头文件:stdio.h
语法:scanf(“格式控制字符串”,变量地址列表);
接受字符串时:scanf(“%s”,字符数组名或指针);
2.gets()
所在头文件:stdio.h
语法:gets(字符数组名或指针);
两者在接受字符串时:
1.不同点:
scanf不能接受空格、制表符Tab、回车等;
遇到空格,scanf()就认为输入结束了
而gets能够接受空格、制表符Tab和回车等;
gets()遇到’\n’才认为是结束输入了
scanf :当遇到回车,空格和tab键会自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中。
gets:可接受回车键之前输入的所有字符**,并用’\0’替代 ‘\n’.**回车键不会留在输入缓冲区中
char a[10];
scanf("%s",a);
//从键盘输入字符串 asd df时,遇到空格,scanf()就认为输入结束了,所以a中存放的字符串是 ‘asd\0’。
char a[10];
gets(a);
//从键盘输入字符串 asd df时,gets()遇到’\n’才认为是结束输入了,所以a中存放的是’asd df\0’。
char a[10],b[10];
char c,d;
scanf("%s",a);
printf("a中保存的字符串为:%s\n",a);
c=getchar();
//输入asdf回车,因为scanf会将回车保留在缓冲区中,所以回车会紧接着被c取得而不需要再额外输入,所以a中存储的是’asdf\0’,字符c=’\n’。
gets(b);
printf("b中保存的字符串为:%s\n",b);
d=getchar();
// 接着输入as df回车,因为gets会将’\n’替换成’\0’,所以b字符串中保留的是’as df\0’,并且还是要继续输入d的值:
二、printf()和puts()的区别
相同点:
两者都属于stdio.h这个头文件
都能输出字符串
不同点:
puts()在输出字符串时会将’\0’自动转换成’\n’进行输出,
也就是说,
puts方法输出完字符串后会自动换行。
两种写法:
char ch=getchar();
相当于
scanf("%c",&ch);
输出符号用%+d
VS可能会输入有编译问题,在开头加一行
#pragma warning (disable:__);
就行了,__填报错的行数
鸡兔同笼
头a腿b
鸡c=(b-2*a) / 2
兔=a-c
十进制转换成二进制
#include<bits/stdc++.h>
using namespace std;
int han(int a)
{
if(a==0)
return 0;
else
{
han(a/2);
printf("%d",a%2);
}
}
int main()
{
int a;
cin>>a;
han(a);
return 0;
}
取余%的最终符号由左值决定
优先级:算术 > 关系 > 逻辑 > 赋值 > 逗号
算术运算符
赋值运算符
关系运算符
逻辑运算符
条件运算符
位运算符
&位与运算符:将两个数的 补码 按位进行 与运算
|位或运算符
~位非运算符:按位取反
^位异或运算符: 相同为0,不同为1
<< //左移,左乘右除
>>
一个数左移1位就是乘2!!!!!!!!!
一个数右移1位就是整除2!!!!!!!
负数位左移就会溢出
异或运算符: 相同为0,不同为1
Int a=0;
a的补码0000 0000 0000 0000 0000 0000 0000 0000
~a就是1111 1111 1111 … 1111是-1的补码
(
-1的原码1000 0000 … 0000 0001
-1的反码1111 1111 …1111 1110
)
~a就是-1
交换ab:
三个步骤:
a ^= b; //a’ =a ^ b;
b ^= a; //b’ = b ^ a’=b ^ a ^ b = a
a ^= b; //a’’ = a’ ^ b’
用C语言switch实现
[80,100]优
[60,80)良
[0,60)差
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a;
cin>>a;
int b;
if(a>=80 && a<=100)
b=1;
else if(a>=60 && a<80)
b=2;
else
b=3;
switch(b)
{
case 1:
cout<<"优";
break;
case 2:
cout<<"良";
break;
case 3:
cout<<"差";
break;
}
return 0;
}
for循环(初始表达式;条件表达式;循环表达式)
中断语句:
break
return 0;
continue;
//求一个数的补码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
//if(n==0)
//cout<<"0000 0000 0000 0000 0000 0000 0000 0000"<<endl;
//else if(n>0)
for(int i=31;i>=0;i--)
{
int a=n>>i&1;
cout<<a;
if(i%4==0)
cout<<' ';
}
cout<<endl;
/*
//负数也是这样算,不用分情况
else
{
n=-n;
n += 1;
cout<<'1';
for(int i=30;i>=0;i--)
{
int a=n>>i&1;
cout<<a;
if(i%4==0)
cout<<' ';
}
cout<<endl;
}
*/
return 0;
}
模板:
//求一个数的补码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=31;i>=0;i--)
{
int a=n>>i&1;
cout<<a;
if(i%4==0)
cout<<' ';
}
cout<<endl;
return 0;
}
随机点名系统
#include<bits/stdc++.h>
using namespace std;
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(0));
//rand()能随机选一个随机数
//printf("%d\n",rand()%9+1);//1-9
//printf("%d\n",rand()%12+1);//1-12
//return 0;
//随机出10以内加法题,写程序算分
int ans=0;
for(int i=1;i<=10;i++)
{
srand(time(0));
int a=rand()%10;
int b=rand()%10;
cout<<a<<" + "<<b<<" = ";
int s;
cin>>s;
if(s==a+b)
ans += 10;
}
cout<<ans;
return 0;
}
求最小公倍数:
//最小公倍数
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
int ma=max(a,b);
for(int i=ma; ;i++)
{
if(i%a==0 && i%b==0)
{
cout<<i;
break;
}
}
//cout<<a;
return 0;
}
//男神的做法
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,ma;
cin>>a>>b;
for(ma=a>b?a:b ; ma%a!=0 || ma%b!=0; ma++);
cout<<ma;
return 0;
}
//用所学知识写程序:123——>321,1200——>21
//题目限制n小于2de31次方-1
/*
//我的思路:
#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
int f=0;//判断0的出现
for(;;)
{
if(a==0)
break;
int b=a%10;//取末位
a /= 10;
if(b==0)
{
if(f==0)//此时的0是a末尾的0,不能输出
continue;
else//此时的0不是a末尾的0,要输出
printf("%d",b);
}
else
{
f=1;//末尾不是0就标记
printf("%d",b);
}
}
return 0;
}
*/
//男神的思路:
#include<stdio.h>
int main()
{
int n;
long long k=0;//一定要开long long类型
//要不,2147483647反过来,就超过int型的最大范围了
//如果n到long long 的话,还是用我的方法,按位输出比较好。。
scanf("%d",&n);
for(;n != 0;n /= 10)
k=k*10+n%10;
printf("%lld",k);
return 0;
}
do-while循环:先执行循环体,再判断条件,循环体至少执行一次
switch语句
一般形式:
switch(表达式){
case 常量表达式1: 语句1;
case 常量表达式2: 语句2;
…
case 常量表达式n: 语句n;
default: 语句n+1;
}
意思是先计算表达式的值,再逐个和case 后的常量表达式比较,若不等则继续往下比较,若一直不等,则执行default后的语句;若等于某一个常量表达式,则从这个表达式后的语句开始执行,并执行后面 所有 case后的语句。
冒泡排序:
#include<stdio.h>
int main()
{
int arr[10]={1,3,5,2,4,6,0,9,8,7};
//冒泡排序
for(int i=0;i<9;i++)
{
for(int j=0;j<9-i;j++)
{
if(arr[j]>arr[j+1])
{
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
for(int i=0;i<10;i++)
printf("%d ",arr[i]);
}
冒泡排序的优化:
#include<stdio.h>
int main()
{
int arr[10]={1,3,5,2,4,6,0,9,8,7};
//冒泡排序的优化
int flag;
for(int i=0;i<9;i++)
{
flag=0;
for(int j=0;j<9-i;j++)
{
//printf("%d %d\n",j,j+1);
if(arr[j]>arr[j+1])
{
flag=1;
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
if(flag==0)
break;
}
for(int i=0;i<10;i++)
printf("%d ",arr[i]);
}
1到30随机选择7个不同的数
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main()
{
int i,a;
srand(time(0));
int I[35]={0};
for(i=0;i<7;i++)
{
a=rand()%30+1;
if(I[a]==1)
i--;
else
{
I[a]=1;
printf("%d ",a);
}
}
return 0;
}
字符串长度:
字符个数:
//字符加密 +3
#include<stdio.h>
int main()
{
char s[]="wo jiao yan zu";
for(int i=0;s[i]!='\0';i++) //注意!!!!!!!'\0'啊
{
s[i] += 3;
printf("%c",s[i]);
}
return 0;
}
//大写转小写
#include<bits/stdc++.h>
using namespace std;
int main()
{
char str[10];
gets(str);
for(int i=0;str[i]!='\0';i++)
{
if(str[i]>=65 && str[i]<=90)
printf("%c",str[i]+32);
else
printf("%c",str[i]-32);
}
puts("");
return 0;
}
//判断两个字符串是否相等
#include<stdio.h>
int main()
{
char s1[100];
char s2[100];
gets(s1);
gets(s2);
int i,j;
for( i=0,j=0;s1[i]!='\0' && s2[j]!='\0';i++,j++)
{
if(s1[i]==s2[j])
continue;
else
break;
}
if(s1[i]=='\0' && s2[j]=='\0')
printf("YES");
else
printf("NO");
return 0;
}