文件扩展名保存
C语言的文件扩展名为.c,C++的文件扩展名为.cpp
保存成.cpp文件因为C++向下兼容C
头文件
C++的标准中stdio.h更推荐使用等价写法cstdio
#include<stdio.h>和#include<cstdio>等价
standard input output h为head的缩写
#include<math.h>和#include<cmath>等价
#include<string.h>和#include<cstring>等价
输入与输出
cin和cout消耗的时间比scanf和printf多得多
注:不要在同一个程序中同时使用cout和printf有时候会出问题
%d是int型的输出格式
%f是float和double型的输出格式
%.1f保留一位小数输出
%.2f保留两位小数输出
%c是char型的输出格式
%s是字符串常量的输出格式
scanf("%d",&n);
数据类型 | 格式符 | 举例 |
int | %d | scanf("%d",&n); |
long long | %lld | scanf("%lld",&n); |
float | %f | scanf("%f",&fl); |
double | %lf | scanf("%lf",&db); |
char | %c | scanf("%c",&c); |
字符串(char数组) | %s | scanf("%s",str); |
只有str前面没有取地址运算符&,这是因为数组名称本身就代表了这个数组第一个元素的位置
注:只有%c会把空格按字符读入,其他格式符是以空格换行为结束标志的
数据类型 | 格式符 | 举例 |
int | %d | printf("%d",n); |
long long | %lld | printf("%lld",n); |
float | %f | printf("%f",fl); |
double | %f | printf("%f",db); |
char | %c | printf("%c",c); |
字符串(char数组) | %s | printf("%s",str); |
%md
printf("%5d",a) //不足5位的前面用空格填充,大于5位的直接输出
%0md
print("%05d",a) //不足5位的前面用0填充,大于5位的直接输出
%.mf 浮点数保留m位小数
getchar putchar 注:getchar能识别换行符并储存为字符
输入输出单个字符
#include<stdio.h>
int main(){
char c1,c2,c3;
c1=getchar();
getchar();
c2=getchar();
c3=getchar();
putchar(c1);
putchar(c2);
putchar(c3);
return 0;
}
输入数据:abcd
输出结果:acd
常用math函数
fabs(double x) 对double型变量取绝对值
floor(double x) ceil(double x) 向下取整和向上取整,返回类型为double
pow(double r,double p) 函数返回r的p次方
sqrt(double x) 算术平方根
log(double x) 返回double型变量以自然对数为底e的对数
logab=logeb/logea
round(double x) 四舍五入
选择结构
if{
}else if{
}else{
}
switch
int a=1,b=2;
switch(a+b){
case 2:
printf("%d\n",a)
break;
case 3:
printf("%d\n",b)
break;
case 4:
printf("%d\n",a+b)
break;
default:
printf("sad story\n")
字符与字符串
char c1='z' , c2='j' ,c3 = 117; //把字符变量赋值给字符常量
printf("%c%c%c",c1,c2,c3);
输出结果:zju
char str1[25] = "Wo chao ai ni de" ; //把字符串常量赋值给字符数组
print("%s",str1);
输出结果:wo chao ai ni de
变量名: 1>不能是C语言标识符
2>第一个字符必须是字母或下划线
3>区分大小写
运算符
/ 当被除数和除数都是整数时,得到的结果也是整数(向下取整)
( ? :)是C语言中唯一的三目运算符
int a = 3;b = 5;
int c = a > b ? 7 : 11; //a>b成立返回7,不成立则返回11
printf("%d\n",c);
输出结果:11
n/=m+1 ; //n = n/(m+1)
数组
输入a[0],并将数组中后续元素都赋值为前一个元素的两倍
int main(){
int a[10];
scanf("%d",&a[0]);
for(int i=0;i<10;i++){
a[i]=a[i-1]*2;
}
for(int i=0;i<10;i++){
printf("a[%d]=%d",i,a[i]);
}
return 0;
}
冒泡排序
int main(){
int a[10]={3,1,4,5,2};
for(i=1;i<=4;i++){
for(j=0;j<5-i;j++){
if( a[j]>a[j+1]){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=a[temp];
}
}
for(int i=0;i<5;i++){
printf("%d",a[i]);
}
二维数组
#include<stdio.h>
int main(){
int a[3][3],b[3][3],c[3][3];
for(i=0;i<3;i++){
for(j=0;j<3;j++){
scanf("%d",&a[i][j]);
scanf("%d",&b[i][j]);
c[i][j]=a[i][j]+b[i][j];
printf("%d\n",c[i][j]);
}
}
}
注:如果数组比较大(大概10^6级别),则需要将其定义在主函数的外面,以为函数内部申请的局部变量是系统栈,允许申请的空间小;函数外部申请的全局变量来自静态存储区,空间大。
memset——对数组中的每一个元素赋相同的值
memset(数组名,值,sizeof(数组名));
注:需要添加头文件#include<string.h>
字符数组
1.字符数组的初始化
#include<stdio.h>
int main(){
char str[15] = {'G','o','o','d',',','s','t','o','r','y','!'};
for(int i=0;i<11;i++){
printf("%c",str[i]);
}
return 0;
}
输出结果:Good,story!
字符数组也可直接通过赋值字符串来完成初始化 (仅限于初始化这样做)
char str[15] = "Good story!";
注:字符数组的末尾是\0,所以字符数组的长度一定要比实际字符长度多一
用scanf和gets输入时会自动在末尾加上\0,而用其他输入如getchar就需要手动输入\0,否则putchar和printf无法识别字符串末尾,而出现乱码
string.h头文件包含了许多用于字符数组的函数
strlen(字符数组名) //字符个数
strcmp() //返回两个字符串大小比较的结果(按字典序 返回1,-1,0)
strcpy(str1,str2) //把字符串2复制给字符串1
strcat(str1,str2) //把一个字符串2接到另一个字符串1后面
sscanf和sprintf在stdio.h头文件下
sscanf(str,"%d",&n); //把str的内容以%d的格式传输到n中(从左至右)
sprintf(str,"%d",n); //把n的内容以%d的格式传输到数组中(从右至左)
#include<stdio.h>
int main(){
int n;
char str[100]="1,2,3";
sscanf(str,"%d",&n);
printf("%d",n);
return 0;
}
输出结果:123
#include<stdio.h>
int main(){
int n=233;
char str[100];
sprintf(str,"%d",n);
printf("%d",str);
return 0;
}
输出结果:233
注:支持其他格式 如:"%d:%lf,%s" 及正则表达式