c语言典型问题处理方法小结_c语言常见错误小结

其他工作总结 时间:2020-02-28 20:10:30 收藏本文下载本文
【www.daodoc.com - 其他工作总结】

c语言典型问题处理方法小结由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c语言常见错误小结”。

优秀文档,精彩无限!

c语言典型问题处理方法小结

一、循环问题(1)、数论问题

1、求素数

for(i=2;i

if(a%i==0)

第一个if判断是否能被2,3,4„„

break;

直到本身整除。

if(a==i)

第二个if判断是否只能被本身整除。

printf(“yesn”);

else printf(“non”);素数概念:

对于某个整数a>1,如果它仅有平凡约数1和a,则我们称a为素数(或质数)。整数 1 被称为基数,它既不是质数也不是合数。整数 0 和所有负整数既不是素数,也不是合数。

2、求最大公约数和最小公倍数 a、if(a>b)

{

t=a;

a=b;

b=t;

}

for(i=a;i>=1;i--)

if(a%i==0&&b%i==0)

break;

printf(“largest common divisor:%dn”,i);

printf(“least common multiple:%dn”,(a*b)/is);b、辗转相除法求解

a1=a;

b1=b;

while(a%b!=0)

{

t=a%b;

a=b;

b=t;

}

printf(“largest common divisor:%dnleast common

multiple:%d”,b,a1*b1/b);

3、求完数

一个数如果恰好等于它的因子之和,这个数就称为“完数”。

例如:6的因子为1、2、3,而6=1+2+3,因此6是“完数”。

优质文档,精彩无限!

优秀文档,精彩无限!

for(a=1;a

{

s=0;

注意S=0所放的位置

for(i=1;i

if(a%i==0)

{

s+=i;

if(s>=a)

break;

}

if(s==a)

printf(“%dt”,a);

}

4、分解质因数

将一个整数写成几个质因数的连乘积,如: 输入36,则程序输出36=2*2*3*3。解

一、main()看似简单,但要自己完整地写出来还真不{ 容易!!

int a,z,i;竟然还动用了goto语句,正好可以熟悉一

clrscr();下goto语句的用法!!

scanf(“%d”,&a);

loop: for(z=2;z

if(z%i==0)到for语句,这是for语句仍

break;从2初始化。

if(z==i)从2开始的原则不变,变的判断是否为a的质因数

if(a%z==0)是a的值。

{

k++;

用计数器来解决每行输入不

if(k==1)

同的问题。

printf(“%d=%d”,a1,z);

else

printf(“*%d”,z);

a/=z;

goto loop;

} } } 解二: main(){

int n, k=2, isfirst=1;

printf(“Input n=”);

scanf(“%d”,&n);

优质文档,精彩无限!

优秀文档,精彩无限!

while(k

if(n%k==0)

{ if(isfirst){ printf(“%d=%d”, n, k);isfirst=0;}

else printf(“*%d”,k);

n/=k;

}

else k++;

printf(“n”);}

5、从键盘输入两个整数,输出这两个整数的商的小数点后所有1000位整数

for(i=1;i

主要体会除法运算中小数形成的原因

{

解决这类题目从本质出发

t=a%b;

printf(“%d”,t*10/b);

a=t*10;

}

printf(“n”);

6、编程计算并输出两个带分数的差。带分数就是由一个整数和一个真分数合成的数,两个带分数(整数、分子、分母均大于0)从键盘输入,且带分数1大于带分数2,输入格式为:整数1[分子1/分母1],整数2[分子2/分母2]。差要求化简,整个输出样式为(如差为整数,则无分数部分,如差的整数为0,则无整数部分):

整数1[分子1/分母1]-整数2[分子2/分母2]=整数[分子/分母] 例如:输入:12[6/35],8[3/5] 输出:12[6/35]-8[3/5]=3[4/7] 又如:输入:6[2/3],4[12/18]

输出:6[2/3]-4[12/18]=2 又如:输入:9[7/8],9[3/8]

输出:9[7/8]-9[3/8]=[1/2]

main(){

int z1,fz1,fm1,fz1x,z2,fz2,fm2,fz2x,z,fz,fm,fzx,i;

scanf(“%d[%d/%d],%d[%d/%d]”,&z1,&fz1,&fm1,&z2,&fz2,&fm2);

fz1x=z1*fm1+fz1;

fz2x=z2*fm2+fz2;

fm=fm1*fm2;

fz=fz1x*fm2-fz2x*fm1;

优质文档,精彩无限!

优秀文档,精彩无限!

for(i=fm;i>=2;i--)

if(fm%i==0&&fz%i==0)

{

fz/=i;

fm/=i;

}

z=fz/fm;

fzx=fz%fm;

if(fzx==0)

printf(“%d[%d/%d]-%d[%d/%d]=%dn”,z1,fz1,fm1,z2,fz2,fm2,z);

else if(z==0)

printf(“%d[%d/%d]-%d[%d/%d]=[%d/%d]n”,z1,fz1,fm1,z2,fz2,fm2,fzx,fm);

else

printf(“%d[%d/%d]-%d[%d/%d]=%d[%d/%d]n”,z1,fz1,fm1,z2,fz2,fm2,z,fzx,fm);}

(2)近似问题

1、书P122习题4-6 #include “math.h”

注意千万不要忘记添加 main()

#include “math.h” {

float x,j=1,k,s,so;

int n;

scanf(“%f”,&x);

s=x;

so=x+1;

for(n=1;fabs(s-so)>1e-6;n++)

{

for(k=1;k

j*=k;

so=s;

if(n%2!=0)

s-=x*x*x/((2*n-1)*j);

else

s+=x*x*x/((2*n-1)*j);

}

printf(“%fn”,s);

2、解方程问题:

编程用二分法求解方程x3+4x2-10=0的解。#include “math.h” main()

优质文档,精彩无限!

优秀文档,精彩无限!

{

float x,x1=1,x2=4,f1=-1,f;

/*f1=x1*x1*x1+4*x1*x1-10;*/ 可以省略此句

while(fabs(x2-x1)>1e-6)

{

x=(x1+x2)/2;

f=x*x*x+4*x*x-10;

if(f>0)

x2=x;

else

x1=x;

}

printf(“%fn”,x);}(3)枚举法(4)数列问题

二、数组问题(1)排序问题

1、从小到大排序 main(){ int a[10],i,j,t;for(i=0;i

for(i=1;i

for(j=0;j

if(a[j]>a[j+1])

{ t=a[j+1];a[j+1]=a[j];a[j]=t;

} for(i=0;i

2、从大到小排序 main(){ int a[10],i,j,t;for(i=0;i

scanf(“%d”,&a[i]);for(i=1;i

for(j=9;j>=i;j--)

可以用/*if(f*f1

注意排序问题:

1、须迅速,熟练,无差错 经常插入在程序中间

2、现使用最大数下沉冒泡法 还可以使用最小数上浮冒泡法

3、j控制前面一个数和后面一个数一一比较。由于是最大数下沉,i+1后j仍要从0开始。

4、i控制这样的操作一共要做多少次

5、注意i j的控制次数

现使用最大数上浮冒泡法 还可使用最小数下沉冒泡法

优质文档,精彩无限!

优秀文档,精彩无限!

if(a[j]>a[j-1])

{

t=a[j-1];

a[j-1]=a[j];

a[j]=t;

} for(i=0;i

三、字符或字符串输入输出问题(1)字符打印

1、打印* 此类题的溯源为书P122 4.11(1),其他题都是它的拓展

a、* ** *** ****

解题要点:

此类题关键在于找到每行要打印的个数和行数的关系。此题j==i b、**** *** j==n-i+1 ** *

for(i=1;i

一共要输出的行数

{

for(j=1;j

每行要打印的*数

printf(“*”);

printf(“n”);

}

c、for(i=1;i

一共要输出的行数

{

*

for(j=1;j

控制空格数

**

printf(“ ”);***

for(k=1;k

每行要打印的*数 ****

printf(“*”);解题要点:

printf(“n”);在出现空格的时候,在找到每行要打印的‘*’个数和行数的关系后,还应找到

} 空格和行数的关系,分不同的参数进行循环。此题k==i j==n-i d、j==i-1 k==n-i+1

优质文档,精彩无限!

优秀文档,精彩无限!

**** ***

**

for(i=1;i

*

{ e、for(j=1;j

*

printf(“ ”);

*** *****

for(k=1;k

printf(“*”);

printf(“n”);

}

*

for(i=1;i

***

{ *****

for(j=1;j

printf(“ ”);*****

for(k=1;k

***

printf(“*”);

*

printf(“n”);

}

2、打印9*9乘法表

解题要点:注意寻找行与列的规律。i*j i代表列 j代表行

3、九九乘法表 123

24… …

814、杨晖三角形 1 11111 10 51 20 15 6(2)字符串打印问题

优质文档,精彩无限!

for(i=1;i

for(j=1;j

printf(“%-3d ”,i*j);

printf(“n”);

} 注意输出格

式的控制

1、A B C D E Z Z A B C D E

E Z A B C D

D E Z A B C

C D E Z A B

B C D E Z A

gets(a);for(i=1;i

{ 优秀文档,精彩无限!for(i=1;i

a[i][1]=1;

{

a[i][i]=1;

t=a[5];

}

for(j=5;j>0;j--)

for(i=3;i

a[j]=a[j-1];

for(j=2;j

a[0]=t;

a[i][j]=a[i-1][j-1]+a[i-1][j];

for(k=0;k

注意交换过程和

printf(“%c”,a[k]);

把所有的数后移

printf(“n”);

}

2、输入一字符串小写换大写

char a[81];

int i;

gets(a);

for(i=0;a[i]!='';i++)

if(a[i]>='a'&&a[i]

a[i]-=32;

puts(a);

3、逆序输出

gets(a);

c=strlen(a);

for(i=0;i

{

t=a[i];

a[i]=a[c-1-i];

a[c-1-i]=t;

}

puts(a);for(int i=n;i>=0;i--)

cout

4、如输入:ab1

@3,;z

输出:ab1

@3,;z

gets(a);

while(a[0]==' ')

for(i=0;a[i]!='';i++)

a[i]=a[i+1];

一位的方法

注意点:

1、int i,不要误打成char i2、a[i]!=’’不要误打成i!=’’

3、逻辑与&&

4、单引号内表示字符

5、不加单引号的字符型数据为其ASCII码 注意此问题的思想方法: 要求一组数的逆序实质就是将其对称换位

蓝色部分可以简写为绿色部分 注意点:

1、‘= =’

2、while语句的使用处体会

3、全面考虑问题 优质文档,精彩无限!

优秀文档,精彩无限!

for(i=0;a[i]!='';i++)if(a[i]==' '&&a[i+1]!=' ')

printf(“n”);

else if(a[i]==' '&&a[i+1]==' ')

{

for(k=i;a[k]!='';k++)

a[k+1]=a[k+2];

i--;

}

else printf(“%c”,a[i]);

5、输入3个字符串,按从小到大排序输出这3个字符串。使用一个两维数组贮存多个字符串 char a[81][81];

int i,j;

注意:如何使用一个两维数组贮存多个

for(i=0;i

字符串

gets(a[i]);

for(i=0;i

puts(a[i]);

6、输入一个整数n和一个字符串str,计算并输出n进制数str的值。注意:

如输入:71、scanf(“%d%s”,&n,str)其中%s为字符串格式 则输出:13

(16)7=(13)102、逐个给字符串赋值的方法见书140页。如输入:16

3A

不可for(i=0;a[i]!=’’;i++)则输出:58

(3A)16=(58)103、str[i]=str[i]-'A'+10;

4、pow函数 #include “stdio.h”

5、任何进制转为十进制的方法 #include “math.h” main(){

char str[81];

int n,i,s=0,t;

clrscr();

scanf(“%d%s”,&n,str);

for(i=0;str[i]!='';i++)

if(str[i]='A')

str[i]=str[i]-'A'+10;

else

str[i]=str[i]-'0';

t=strlen(str);

for(i=0;str[i]!='';i++)

s+=str[t-i-1]*pow(n,i);

printf(“%d”,s);}

优质文档,精彩无限!

优秀文档,精彩无限!

编写程序,将一个十进制正整数转换成十六进制数。

注意类比 #include main(){ char a[20];int x,i=0,j;clrscr();scanf(“%d”,&x);while(x){

if(x%16>=10&&x%16

a[i]=x%16-10+'A';

else

a[i]=x%16+'0';

x=x/16;

i++;

} for(j=i-1;j>=0;j--)

printf(“%c”,a[j]);

printf(“n”);}

7、输入一个字符串,将其中的缩写形式展开,并输出展开后的该字符串。所谓展开缩写形式就是将其中由大小写字母或数字构成的形如“a-f”、“U-Z”、“3-8” 的形式展开成为 “abcdef”、“UVWXYZ”、“345678”,若出现“f-a”、“A-7”、“9-5”等形式则不予理睬。例如:

输入:qwe246e-hA-d$-%4-7A-Dz-xp-R4-0 输出:qwr246efghA-d$-%4567ABCDz-xp-R4-0 main(){

char a[81];

int i,c,s,k,t;

gets(a);

for(i=0;a[i]!='';i++)

if(a[i]=='-')

if(a[i-1]='A'&&a[i+1]='a'&&a[i+1]='0'&&a[i+1]

{

注意:

s=strlen(a);

1、必须在结尾处加上结束标记,才能实现

c=a[i+1]-a[i-1];

puts语句。

t=i+c-2;

2、加上结束标记后for(i=0;a[i]!='';i++)语

句才能实现。优质文档,精彩无限!

3、逻辑&&与逻辑||的优先级。

4、s=strlen(a)摆放的位置。

优秀文档,精彩无限!

for(k=s-1;k>i;k--)a[k+c-2]=a[k];a[s-1+c-2+1]='';

for(;i

a[i]=a[i-1]+1;

}

puts(a);}

补充:

循环:

求:a+aa+aaa+…..的值 #include void main(){ int a,n,i=1,sn=0,tn=0;cout>a>>n;while(i

tn=tn+a;

sn+=tn;

a*=10;i++;} cout

两个乒乓球队进行比赛,各出3人。甲队为A,B,C;已对是X,Y,Z;已经抽签决定比赛名单。有人向队员大厅比赛的名单。A说他不和X比,C说他不和X,Z比。请编程序找出3对赛手的名单。#include void main(){ char i,j,k;for(i='X';i

for(j='X';j

if(i!=j)

for(k='X';k

if(i!=k&&j!=k)

if(i!='X'&&k!='X'&&k!='Z')

cout

B--“

C--”

优质文档,精彩无限!

优秀文档,精彩无限!

枚举

口袋中有红,黄,蓝,白,黑5种颜色的球若干。每次从口袋中任意取出3歌,问得到3种不同颜色球的可能取法,输出每种排列的情况。#include #include

//在C语言中不用加这句 void main(){enum color{red ,yellow ,blue,white, black};color pri;int i,j,k,n=0,loop;for(i=red;i

for(j=red;j

if(i!=j)

{

for(k=red;k

if((k!=i)&&(k!=j))

{

n++;

cout

//setw是输出格式的限定

for(loop=1;loop

{

switch(loop)

{

case 1:pri=color(i);break;

case 2:pri=color(j);break;

case 3:pri=color(k);break;

default:break;

}

switch(pri)

{

case red:cout

case yellow:cout

case blue:cout

case white:cout

case black:cout

default:break;

}

}

cout

}

}

cout

优质文档,精彩无限!

优秀文档,精彩无限!

数组:

不用strcat函数,编写程序,将两个字符串串接起来。

#include using namespace std;void main(){ int i=0;char a[20],b[10];gets(a);gets(b);for(i=0;i

if(a[i]=='')break;for(int j=0;j

输入一行字符,统计其中有多少个单词,单词之间用空格分开。#include using namespace std;void main(){ char string[100];int i,num=0,word=0;char c;gets(string);for(i=0;(c=string[i])!='';i++)

if(c==' ')word=0;

else if(word==0)

{word=1;num++;} cout

给出年,月,日,计算该日是该年的第几天 #include using namespace std;void main(){ int sum_day(int,int);

//函数声明

int leap(int year);

//函数声明

int year,month,day,days;cout>year>>month>>day;

优质文档,精彩无限!

优秀文档,精彩无限!

cout=3)days++;//若是闰年,且在3月以后,则加一天

cout

day+=day_tab[i];return(day);} int leap(int year){ int leap;leap=year%4==0&&year%100!=0||year%400==0;return(leap);}(这道题虽然用了你们不考的函数调用,但是相信你还是看的懂的,这道题主要是体现了知识的综合运用)

杨辉三角(不做了,相信你会的吧)

求3*4矩阵中的最大最小元素(用循环,也不难)

输入一个矩阵的各个元素,求转置矩阵(用循环进行赋值,然后再定义个矩阵,然后进行赋值,例如:若a矩阵为2*3,则for(i=0;i

for(j=0;j

b[j][i]=a[i][j];)

输出魔方阵,就是每一行每一列和对角线数字之和相等。(方阵阶数由终端输入,但只需是奇数即可)#include #include void main(){ int a[16][16],i,j,k,p=1,n;while(p==1){

cout

cin>>n;

优质文档,精彩无限!

优秀文档,精彩无限!

if((n!=0)&&(n

for(j=1;j

a[i][j]=0;

j=n/2+1;

a[1][j]=1;

for(k=2;k

{

i--;j++;

if(in)

{i=i+2;j--;}

else

{if(in)j=1;}

if(a[i][j]==0)

a[i][j]=k;

else

{i=i+2;j--;a[i][j]=k;}

}

for(i=1;i

{for(j=1;j

cout

cout

} }(这道题目当时觉得很有难度,刚刚看到时没有思路)

优质文档,精彩无限!

考前典型问题的处理方法

考前典型问题的处理方法学习问题篇1Q:怎样才能最高效的利用好考练卷子?虽说在不停的刷题,可是我感觉会做的还是会,不会做的还是不会。没思路的还是没思路,就算是老师今天讲了这类......

考前典型问题的处理方法

刀豆文库小编为你整合推荐3篇考前典型问题的处理方法,也许这些就是您需要的文章,但愿刀豆文库能带给您一些学习、工作上的帮助。......

APG典型故障处理小结

APG典型故障处理小结1、故障:intelligent networks management interface分析:此告警表明文件系统在处理intelligent networks management interface(INM)接口连接时出错。此时......

打印机问题处理方法

墨盒是喷墨打印机的重要组成部分,它的好坏将直接影响喷墨打印机的打印效果,同时墨盒也是比较容易出现故障的部件。1.打印头的清洗方法喷墨打印机在长时间不用或使用一段时间后,......

问题学籍处理方法

问题学籍处理方法一、暂时只处理问题学籍的数据。1、身份证件号不存在(学生身份证不在公安部户籍系统中!) a、身份证号错误,在问题学籍处理变更。b、与原件比对未发现错误,确认有......

下载c语言典型问题处理方法小结word格式文档
下载c语言典型问题处理方法小结.doc
将本文档下载到自己电脑,方便修改和收藏。
点此处下载文档

文档为doc格式

热门文章
点击下载本文