CC++学习总结笔记.docx
《CC++学习总结笔记.docx》由会员分享,可在线阅读,更多相关《CC++学习总结笔记.docx(245页珍藏版)》请在冰豆网上搜索。
CC++学习总结笔记
#include
#defineN20
main()
{
chars[N][N],i,j,k,m;
if(N%2==0)
m=N/2;
else
m=N/2+1;
for(k=0;kfor(i=k;ifor(j=k;jif(i==k||i==N-k-1||j==k||j==N-k-1)
s[i][j]='A'+k;
for(i=0;i{
for(j=0;jprintf("%c",s[i][j]);
printf("\n");
}
}
求负数平均数:
#include
main()
{
inta[7]={1,-2,9,-4,-7,2,0},i,k=0;floats=0.0;
for(i=0;i<7;i++)
printf("%d",a[i]);
printf("\n");
for(i=0;a[i]!
=0;i++)
if(a[i]<0)
{s+=a[i];k++;}
printf("%6.4f",s/k);
}
小写改大写
#include
main()
{
inti;chara[20];
gets(a);
for(i=0;a[i]!
='\0';i++)
if(a[i]>='a'&&a[i]<='z')
a[i]=a[i]-32;
puts(a);
}
第13套题(必须是main函数在上面,fun函数段再下面,要不然会出错)
#include
longfun(inta,intn)
{inti;longs,t=0;
for(i=0;it=t*10+a;
s=t;
for(i=1;i{
t=t/10;
s=s-t;
}
returns;
}
main()
{
inta,n;
scanf("%d%d",&a,&n);
printf("a=%d,n=%d",a,n);
printf("\n");
printf("%ld\n",fun(a,n));/*必须是ld,不能是l*/
}
解法二(不调用子函数)
#include
main()
{
inta,n,i;longs,t=0;
scanf("%d%d",&a,&n);
printf("a=%d,n=%d",a,n);
printf("\n");
for(i=0;it=t*10+a;
s=t;
for(i=1;i{
t=t/10;
s=s-t;
}
printf("%ld\n",s);
}
第18套
#include
#include/*该句必须写上去,要不然函数中的cos,fabs函数将无来源调用,这一点要非常注意*/
main()
{
doublex0,x1=0.0;
do
{
x0=x1;
x1=cos(x0);
}while(fabs(x0-x1)>=1e-6);
printf("root=%f\n",x1);
}
注意区别,后者为正确结果
第30套——删除前导*号
解法一(调用子函数)
#include
voidfun(char*a)
{
char*p=a,*s;
while(*p=='*')
p++;
for(s=p;*s!
='\0';s++)
*a++=*s;
*a='\0';
}
main()
{
chara[80];/*此处不能定义为*a*/
gets(a);
fun(a);/*此处不得直接写成puts(fun(a));必须得分两步写*/
puts(a);
}
解法二(未调用子函数)
#include
#include
main()
{
inti,k=0;chars[20],*p,*r;
gets(s);
p=s;
while(*p=='*')
p++;
for(r=p;*r!
='\0';r++)
s[k++]=*r;
s[k]='\0';
puts(s);
}
循环左移
#include
#include
main()
{
inti,j,n,m;chara[20],t;
gets(a);
n=strlen(a);/*要用到strlen函数的话就要用到字符串库函数*/
scanf("%d",&m);
for(i=0;i{t=a[0];
for(j=0;ja[j]=a[j+1];
a[n-1]=t;
}
puts(a);
}
注意必须是先输入字符串数组,再输入m值
二维矩阵转置:
#include
#include
#defineM3/*这一句是在main函数之前*/
main()
{
inta[M][M]={{1,2,2},{4,1,6},{1,3,2}},b[M][M],i,j,k;
printf("beforemotivated:
\n");
for(i=0;i{for(j=0;jprintf("%d",a[i][j]);
printf("\n");/*注意大花括号的位置,以及printf(“\n”);这一句的位置,每一行结尾转行*/
}
for(i=0;ifor(j=0;jb[i][j]=a[i][j]+a[j][i];
printf("aftermotivated:
\n");
for(i=0;i{for(j=0;jprintf("%d",b[i][j]);
printf("\n");
}
}
#include
#include
main()
{
inti,n,k=0;chars[20],*p;
gets(s);
n=strlen(s);
p=s;
for(i=0;iif(p[i]%2==0||i%2!
=0)
s[k++]=p[i];
s[k]='\0';
puts(s);
}
删除字符串中某些字符:
解法一
#include
#include
main()
{
inti,n,k=0;chars[20],*p;
gets(s);
n=strlen(s);
p=s;
for(i=0;i{if(p[i]%2!
=0&&i%2==0);
else
{s[k++]=p[i];
s[k]='\0';
}
}
puts(s);
}
解法二(主要是红色字体部分内容不同)
#include
#include
main()
{
inti,n,k=0;chars[20],*p;
gets(s);
n=strlen(s);
p=s;
for(i=0;i{if(p[i]%2==0||i%2!
=0)
s[k++]=p[i];
s[k]='\0';
}
puts(s);
}
数组前m位输出
#include
main()
{
ints[7]={1,2,3,4,5,6,7},i,m;
for(i=0;i<7;i++)
printf("%d",s[i]);
printf("\n");
scanf("%d",&m);
for(i=0;iprintf("%d",s[i]);
printf("\n");
}
求1-1/2+1/3-1/4+···求前m项的和
#include
main()
{
inti,m,fg=1;doubles=0.0,s1;
scanf("%d",&m);
for(i=1;i<=m;i++)
{
s1=i*fg;
fg=fg*(-1);
s+=1.0/s1;
}
printf("%2.4f\n",s);/*2.4前面的数字2代表包括总位数,前面的数字只要不超过6就能得到正确结果,后面的数字4代表小数点后的位数,即保留几位小数,此处与printf("%.4f\n",s);效果一样*/
}
注意这个结果不是顶行输出的,与8.4前面的数字8有关
判断几组数据的大小
#include
#include
main()
{
inti,a,b,n;
scanf("%d",&n);
for(i=0;i{
scanf("%d%d",&a,&b);
if(a>b)printf("Text%d:
>\n",i+1);
if(a
<\n",i+1);
if(a==b)printf("Text%d:
=\n",i+1);
}
}
第一套选择题
解法一(答案)
#include
#include
main()
{
inti=2,fg=1;doubles=0.0,s1=0.75,t;
while(s1>1e-3)
{
s=s+fg*s1;
t=2*i;
s1=(t+1)/(t*t);
fg=fg*(-1);
i++;
}
printf("theresultis:
%f\n",s);
}
解法二(为什么有这种差别呢?
求解答)
#include
#include
main()
{
inti=1,fg=1;doubles=0.0,s1,t;
do
{
t=2*i;
s1=(t+1)/(t*t);
s=s+fg*s1;
fg=fg*(-1);
i++;
}
while(s1>1e-3);
printf("theresultis:
%f\n",s);
}
解法三(带子函数段)
#include
#include
doublefun(doublee)
{
inti=1,fg=1;doubles=0.0,s1,t;
do
{
t=2*i;
s1=(t+1)/(t*t);
s=s+fg*s1;
fg=fg*(-1);
i++;
}
while(s1>e);
returns;
}
main()
{
doublee;
scanf("%le",&e);/*此处红色字体%le不能写成%f,这里scanf函数与printf函数使用规则不同,scanf函数读取double型数据是用%le,printf函数显示double型数据是用%f,注意区别*/
printf("%f\n",fun(e));
}
【实现十进制到二进制的转换】:
#include
main()
{
intk=0,i;longt,s1;charp[20],ch;
scanf("%ld",&t);
do
{
s1=t%2;
t=t/2;
p[k++]=s1+'0';
}
while(t>0);
p[k]='\0';
for(i=0;i{
ch=p[i];
p[i]=p[k-1-i];
p[k-1-i]=ch;
}
puts(p);
}
【二进制到十进制的转换】:
#include
#include
main()
{
inti,j,n,k;longt=0;chars[20];
gets(s);
n=strlen(s);
for(i=0;i{
k=1;
for(j=1;j<=n-1-i;j++)
k=k*2;
t=t+k*(s[i]-'0');
}
printf("%ld\n",t);
}
【实现16进制到10进制的转换】:
#include
#include
main()
{
inti,j,n,k;longt=0;chars[20];
gets(s);
n=strlen(s);
for(i=0;i{
k=1;
for(j=1;j<=n-1-i;j++)
k=k*16;
if(s[i]>='0'&&s[i]<='9')
t=t+k*(s[i]-'0');
if(s[i]>='A'&&s[i]<='G')
t=t+k*(s[i]-55);/*例如16进制中的’A’代表10进制中的10,而字符’A’对应的ASCII值为65,其他的’B’…一直到’F’都可以依此类推*/
}
printf("%ld\n",t);
}
【实现10进制到16进制的转换】:
#include
#include
main()
{
intk=0,i;longt,s1;charp[20],ch;
scanf("%ld",&t);
do
{
s1=t%16;
t=t/16;
if(s1>=1&&s1<=9)
p[k++]=s1+'0';
if(s1>=10&&s1<=15)
p[k++]=s1+55;
}
while(t>0);
p[k]='\0';
for(i=0;i{
ch=p[i];
p[i]=p[k-1-i];
p[k-1-i]=ch;
}
puts(p);
}
【2进制转化为8进制】:
思路:
2进制→10进制→8进制
#include
#include
main()
{
inti,j,n,k,m=0;longt=0,s1;chars[20],p[20],ch;
gets(s);
n=strlen(s);
for(i=0;i{
k=1;
for(j=1;j<=n-1-i;j++)
k=k*2;/*蓝色字体2如果变为8,则可以实现8进制到10进制的转换*/
t=t+k*(s[i]-'0');
}
printf("%ld\n",t);
do
{
s1=t%8;/*这两句顺序不能颠倒,否则会导致结果错误,即必须是先求余,后求商如果是先求商后求余的话,即按照"t=t/8;s1=t%8"的顺序执行,后一句中s1=t%8中的t已经改变*/
t=t/8;
p[m++]=s1+'0';/*m用于统计二进制数的位数,在此二进制数是作为字符串的形式输出的*/
}
while(t>0);
p[m]='\0';
for(i=0;i{
ch=p[i];
p[i]=p[m-1-i];
p[m-1-i]=ch;
}
puts(p);
}
【2进制转化为16进制】:
思路与2进制转化为8进制相似
#include
#include
main()
{
inti,j,n,k,m=0;longt=0,s1;chars[20],p[20],ch;
gets(s);
n=strlen(s);
for(i=0;i{
k=1;
for(j=1;j<=n-1-i;j++)
k=k*2;/*蓝色字体2如果变为8,则可以实现8进制到10进制的转换*/
t=t+k*(s[i]-'0');
}
printf("%ld\n",t);
do
{
s1=t%16;/*这两句顺序不能颠倒,否则会导致结果错误,即必须是先求余,后求商如果是先求商后求余的话,即按照"t=t/16;s1=t%16"的顺序执行,后一句中s1=t%16中的t已经改变*/
t=t/16;
if(s1>=1&&s1<=9)
p[m++]=s1+'0';
if(s1>=10&&s1<=15)
p[m++]=s1+55;/*m用于统计二进制数的位数,在此二进制数是作为字符串的形式输出的*/
}
while(t>0);
p[m]='\0';
for(i=0;i{
ch=p[i];
p[i]=p[m-1-i];
p[m-1-i]=ch;
}
puts(p);
}
【从母字符串中查找子字符串的个数】:
解法一
#include
#include
main()
{
inti,j,k=0,n1,n2;chars[100],p[100],q[100];
gets(s);
gets(p);
n1=strlen(s);
n2=strlen(p);
for(i=0;i{
for(j=0;jq[j]=s[i+j];/*动态保存字符串数组q,以便与子字符串p比较*/
q[n2]='\0';
if(strcmp(q,p)==0)
k++;
}
printf("%d\n",k);
}
解法二(注意首先定义字符串s,p的长度要足够长,如定义为100。
若定义为20,当从输入设备输入的字符串的长度超过20的时候,会出现错误)
#include
#include
main()
{
inti,j,k=0,tag,n1,n2;chars[100],p[100];
gets(s);
gets(p);
n1=strlen(s);
n2=strlen(p);
for(i=0;i{
tag=1;
for(j=0;jif(p[j]!
=s[i+j])
tag=0;
if(tag==1)k++;
}
printf("%d\n",k);
}
【自己研究的小课题】
#include
#include
voidfun1(chars1[100])
{
char*s=s1,*p;
while(*s=='*')
s++;
for(p=s;*p!
='\0';p++)
*s1++=*p;
*s1='\0';
}
voidfun2(chars2[100])
{
intk=0;char*s=s2,*p;
while(*s!
='\0')
s++;
s--;
while(*s=='*')
s--;
*(s+1)='\0';
}
main()
{
inti;chars1[100],s2[100];
printf("Beforetransfered(s1):
");
gets(s1);
printf("Beforetransfered(s2):
");
gets(s2);
fun1(s1);
fun2(s2);
printf("Aftertransfered(s1):
");
puts(s1);
printf("Aftertransfered(s2):
");
puts(s2);
printf("Afterlinked(s1+s2):
");
puts(strcat(s1,s2));
}
【自己研究小课题】
将Excel中的列标变换为10进制数:
AAA→703
#include
#include
main()
{
inti,j,n;longs1=0,k;chars[100];
gets(s);
n=strlen(s);
for(i=0;i{k=1;
for(j=1;j<=n-1-i;j++)
k=k*26;
s1=s1+(s[i]-64)*k;
}
printf("%ld\n",s1);
}
703→AAA(当输入的数字为26的倍数时,会出现错误,其他的某些情况也会出现错误,有待进一步考察)
#include
#include
main()
{
intk=0,i;longt,s,s1;charp[20],ch;
scanf("%ld",&t);
do
{
s1=t%26;
t=t/26;
p[k++]=s1+64;
}
while(t>0);
p[k]='\0';
for(i=0;i{
ch=p[i];
p[i]=p[k-1-i];
p[k-1-i]=ch;
}
puts(p);
}
求最大公约数:
(1也可以是最大公约数,而且注意运行程序时最好切换输入法为英文输入法,要不然会出现死循环)
#include
#include
main()
{
inta,b,i,k=0,s[100];
printf("请输入两个正整数:
");
scanf("%d,%d",&a,&b);
while(a<=0||b<=0)
{
printf("请重新输入两个正整数:
");
scanf("%d,%d",&a,&b);
}
for(i=1;i<=a&&i<=b;i++)
if(a%i==0&&b%i==0)
s[k++]=i;
printf("最大公约数:
%d\n",s[k-1]);/*该数组最后一个元素必为最大公约数*/
}
求最小公倍数:
#include
#include
main()
{
inti,a,b,t;
printf("请输入两个正整数:
");
scanf("%d,%d",&a,&b);
while(a<=0||b<=0