章2循环
使用常量预定义,提高可读性,易修改
C标准库:https://www.runoob.com/cprogramming/c-standard-library.html
判断完全平方数:if(sqrt(n)==(int)sqrt(n))
浮点差错解决
浮点运算会产生误差:1.floor(m+0.5)四舍五入2.用平方枚举代替开方避开误差
乘法溢出:及时取模,除得更小
浮点数误差例,不会完全等于10:
#include<stdio.h>
int main(){
double i;
for(i=0;i!=10.0;i+=0.1)
printf("%.1lf\n",i);
return 0;
}
计时函数
会计入输入时间
Time.h
printf("time=%.2lf\n",(double)clock()/CLOCKS_PER_SEC);
避免输入时间方法:
命令行参数代替键盘输入:echo 20|exename
或赋初值
Scanf循环
Scanf返回成功输入变量个数:空格回车不计次数。结束输入Windows:ctrl+Z,Linux:ctrl+D
判断有效输出例:
#include<stdio.h> #include<time.h> int main(){ int a,i=0; int min,max,sum=0; double avr; scanf("%d",&a); sum+=a; min=a; max=a; while(scanf("%d",&a)==1){ sum+=a; if(a<min)min=a; if(a>max)max=a; i++; } avr=sum/i; printf("%d %d %.3lf\n",min,max,avr); return 0; } |
使用输入文件
使用输入文件:输入输出重定向
(与标准答案)文件比较:Windows-fe,Linux-diff
用文件输入测试,比赛提交标准IO(在编译器中定义-DLOCAL,不用临时删除预定义):
条件编译宏#ifdef
标识符;#else;#endif
重定向:
#define LOCAL #include<stdio.h> #include<time.h> int main(){ #ifdef LOCAL freopen("data.in","r",stdin); freopen("data.out","w",stdout); #endif int a,i=0; while(scanf("%d",&a)==1){ printf("a=%d\n",a); } return 0; } |
直接文件读写:
1.Dos下\n就能换行,但在win下要\r\n才会回.
2.改变打开方式为r、w可能可以\n
间习题2.2
#include<stdio.h> int main(){ FILE *fin, *fout; fin=fopen("data.in","rb"); fout=fopen("data.out","wb"); int a,i=0; while(fscanf(fin,"%d",&a)==1){ } fclose(fin); fclose(fout); return 0; } |
重定向法无法同时进行标准输入输出;fopen版改标准输入输出:FILE *fin=stdin,fout=stdout且不调用fopen,fclose:
重定向文件流为标准输入输出:
#include<stdio.h> int main(){ FILE *fin, *fout; // fin=fopen("data.in","rb"); // fout=fopen("data.out","wb"); fin=stdin; fout=stdout; int a,i=0; while(fscanf(fin,"%d",&a)==1){ fprintf(fout,"a=%d\n",a); } // fclose(fin); // fclose(fout); return 0; } |
长整型(64位):
long long,输入、出:Linux-%lld,MinGW-%I64d(大i)
C++
要在C++中使用C语言头文件:文件名前加c后去.h,加using namespace std;
C++:头文件用iotream,cin>>a>>b;,cout<< a<<”\n”;也有返回值
#include<cstdio> using namespace std; int main(){ int a,b; while(scanf("%d%d",&a,&b)==2)printf("%d\n",a+b); return 0; } |
#include<iostream> using namespace std; int main(){ int a,b; while(cin>>a>>b)cout<<a+b<<"\n"; return 0; } |
C++文件读写:
头文件fstream
#include<fstream> using namespace std; ifstream fin("data.in"); ofstream fout("data.out"); int main(){ int a,b; while(fin>>a>>b)fout<<a+b<<"\n"; return 0; } |
文件流重定向到屏幕:
#include<fstream> #include<iostream> using namespace std; //ifstream fin("data.in"); //ofstream fout("data.out"); #define fin cin #define fout cout int main(){ int a,b; while(fin>>a>>b)fout<<a+b<<"\n"; return 0; } |
输出格式
charch[20];printf("%*.*s\n",m,n,ch);可以在语句之外对参数m和n赋值,从而控制输出格式。
C++控制小数位数以及头文件:
<<fixed<<setprecision
<iomanip>
习题
2.1位数
#include<stdio.h> //#define LOCAL int main(){ #ifdef LOCAL freopen("data.in","r",stdin); freopen("data.out","w",stdout); #endif int n,i=1; scanf("%d",&n); while(n/10!=0){ n/=10; i++; } printf("%d",i); return 0; } |
2.2水仙花
#include<stdio.h> int main(){ int n,a,b,c; FILE *fin,*fout; fin=fopen("data.in","rb"); fout=fopen("data.out","wb");
for(a=1;a<10;a++){ for(b=0;b<10;b++){ for(c=0;c<10;c++){ n=a*100+b*10+c; if(n==(a*a*a+b*b*b+c*c*c)){ // printf("%d\n",n); fprintf(fout,"\r\n%d",n); } } } } fclose(fin); fclose(fout); return 0; } |
2.3韩信点兵
#include<stdio.h> int main(){ int n,a,b,c; FILE *fin,*fout; fin=stdin; fout=stdout; fscanf(fin,"%d%d%d",&a,&b,&c); for(n=10;n<100;n++){ if((n%3==a)&&(n%5==b)&&(n%7==c)){ fprintf(fout,"%d",n); return 0; } } fprintf(fout,"No answer"); return 0; } |
2.4倒三角形
运算式不能省略乘号
#include<cstdio> using namespace std; int main(){ int n,i,j=1; scanf("%d",&n); for(;n>0;n--){ for(i=0;i<j;i++){ printf(" "); } for(i=0;i<(2*n-1);i++){ printf("#"); } printf("\n"); j++; } return 0; } |
2.5统计
#include<fstream> using namespace std; ifstream fin("data.in"); ofstream fout("data.out"); int main(){ int n,a[10],m,i,cou=0;
fin>>n; for(i=0;i<n;i++){ fin>>a[i]; } fin>>m; for(i=0;i<n;i++){ if(a[i]<m)cou++; } fout<<cou; return 0; } |
2.6调和级数
C++控制小数位数以及头文件
<<fixed<<setprecision
<iomanip>
#include<iostream> #include<iomanip> using namespace std; int main(){ int n,i; float sum=0; cin>>n; for(i=1;i<=n;i++){ sum+=1.0/i;
} cout<<fixed <<setprecision(3)<<sum<<endl; return 0; } |
2.7近似计算
注意除法两边是小数,否则编码不同
#include<iostream> #include<fstream> using namespace std; #define fin cin #define fout cout int main(){ int i; float n,res=0; for(i=1;;i++){ n=1.0/(2*i-1); // fout<<n<<endl; if(n<(1/1000000))break; if((i%2)!=0){ res+=n; }else{ res-=n; } } fout<<res; return 0; } |
2.8子序列的和
直接i*i有可能溢出
#include<stdio.h> int main(){ int n,m,i; float res=0.0; scanf("%d%d",&n,&m); for(i=0;(n+i)<=m;i++){ res+=(1.0/(n+i))*(1.0/(n+i)); } printf("%.5f",res); } |
2.9分数化小数
#include<iostream> #include<iomanip> using namespace std; int main(){ int a,b,c; double res=0.0; cin>>a>>b>>c; res=1.0*a/b; cout<<fixed<<setprecision(c)<<res; return 0; } |
C解法: printf的特殊用法:对于m.n的格式可以用如下方法表示 charch[20];printf("%*.*s\n",m,n,ch); 两个*定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数m和n。这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式。#include<stdio.h>intmain(){ inta,b,c; scanf("%d%d%d",&a,&b,&c); printf("%.*lf\n",c,(double)a/b); return0;} |
2.10排列
#include<stdio.h> int main(){ int a[9],i; for(a[0]=1;a[0]<9;a[0]++){ for(a[1]=1;a[1]<9;a[1]++){ if(a[0]!=a[1]) for(a[2]=1;a[2]<9;a[2]++){ if((a[0]!=a[2])&&(a[1]!=a[2])){ // a[3]=2*a[0]; a[6]=3*a[0]; a[4]=2*a[1]; a[7]=3*a[1]; a[5]=2*a[2]; a[8]=3*a[2]; if(a[6]<=9&&(a[7]<=9)&&(a[8]<=9)){ printf("abc:"); for(i=0;i<3;i++){ printf("%d",a[i]); } printf(" "); printf("def:"); for(i=3;i<6;i++){ printf("%d",a[i]); } printf(" "); printf("ghi:"); for(i=6;i<9;i++){ printf("%d",a[i]); } printf("\n"); } } } } } } |