您的位置:首页 > 其它

处理方法整理(不断更新)

2015-12-27 18:57 423 查看

处理方法整理(不断更新)

 

终于做完了39课,确实学到了不少东西,这几课多次使用了编写程序时的各种技巧和算法,我觉得有必要做一个整理,将这些技巧罗列下来,方便以后查阅。

1.退出系统的功能

按N键退出,其他键继续。

char choice;
...
do
{
... //主程序
printf("按N键退出,其他键继续");
fflush(stdin);   //将输入缓冲清空,否则getchar()会读入之前录入中的回车等符号
choice=getchar();
}
while(choice!='N' && choice!='n'); //不管输入大小写,全算数
...


例:C初步37课-循环嵌套-大奖赛计分
#include <stdio.h>
#define n 10
int main( )
{
int i;
double ave, score, sum, max, min;
char choice;  //用于接受用户选择,字符型是合适的
do     //计算选手的成绩,至少1次,用do很自然,别的循环不用想
{
i=1;    //i代表评委的编号,其实这个变量名起得不好
max=-1;
min=11;
sum=0;
printf("请输入选手的成绩(0-10)\n");
do
{
printf("第 %d 位评委给分:", i);
scanf("%lf", &score);
sum+=score;
if(max<score)
max=score;
if(min>score)
min=score;
i++;
}while(i<=n);
//下面开始计算
ave = (sum-max-min)/(n-2);
printf("减去一个最高分: %.3f\n", max);
printf(", 减去一个最低分: %.3f\n", min);
printf("当前选手的最后得分是:%.3f\n", ave);
printf("******************* SUCCESS ***********************\n");
printf("按 N 退出,其他键继续....");
fflush(stdin);   //将输入缓冲清空,否则getchar()会读入之前录入中的回车等符号
choice=getchar();
}while(choice!='N' && choice!='n'); //不管输入大小写,全算数
return 0;
}


字符串版:

按xxx继续,其他键退出系统...
或者:任意键继续,按0000退出系统...等。

#include<string.h>

char key[20];

do
{
printf("按任意键继续,按0000退出系统...");
scanf("%s", key);
if (strcmp(key,"0000")==0)
{
printf ("程序已退出\n");
break;
}
else
{
...
...
}
}
while(1);


2.计数输出换行

这个常常会用到,做个记录

...
printf("%d ",n);  //此时输出一个东西,在它后面加技巧
if(i%10==0)   //10个换行或者改成5个
printf("\n");
i++;   //计数
...


例:C初步37课-循环嵌套-位乘大于位和计算

#include<stdio.h>
int main()
{
int i=1,n,k=1,s=0,m;
for(n=1;n<=100;n++)
{
k=1;
s=0;
m=n;
while(m>0)
{
k*=m%10;//循环取余,再累乘
s+=m%10;//循环取余,再累加
m=m/10;//小数点的位数变化
}
if(k>s)
{
printf("%d ",n);
if(i%10==0)
printf("\n");
i++;
}
}
printf("\n");
return 0;
}


3.求一个数的反序数

把数颠倒过来

...
m=0;
while(k>0)
{
m=m*10+k%10;  //m是将要求的反序数
k=k/10;  //k是原来的数
}
...


例:C初步39课-问题求解求素数-反序数
#include <stdio.h>
int main()
{
int n,m,k;
scanf("%d", &n);
k=n;
m=0;
while(k>0)
{
m=m*10+k%10;
k=k/10;
}
printf("%d的反序数是%d\n", n, m);
return 0;
}


4.分离各数

百位数分离,以前曾用过的一个技巧

c=n%10;  //个位数,
b=(n/10)%10;  //十位数
a=n/100;   //百位数
...

以此类推

例:C初步39课-问题求解-n=a!+b!+c!
#include <stdio.h>
int main()
{
int n,a,b,c,sum;
int i,f;
n=100;
while(n<1000)
{
c=n%10;  //个位数,
b=(n/10)%10;  //十位数
a=n/100;  //百位数
sum=0;  //注意:每次循环都要初始化
for(f=1,i=1;i<=a;++i)  f=f*i; //求 a!
sum += f;
for(f=1,i=1;i<=b;++i)  f=f*i; //求 b!
sum += f;
for(f=1,i=1;i<=c;++i)  f=f*i; //求 c!
sum += f; //此时sum的值为a!+b!+c!
if(sum==n)  //若条件成立,则 n 就是要找的数。
printf("%d ", n);
++n;  //考察下一个n
}
printf("\n");
return 0;
}


5.暂停输出,任意键继续

if(count%50==0)   //每输出50个方案暂停一次
{
printf("按任意键继续输出……\n");
getchar();
}


  例:C初步39课-项目四-换分币
#include <stdio.h>
int main()
{
int i,j,k,count=0;
for(i=0; i<=100; i++)
for(j=0; j<=50; j++)
for(k=0; k<=20; k++)
{
if(i+j*2+k*5==100)
{
++count;
printf("第 %d 种 -- 1分钱: %d, 2分钱: %d, 5分钱: %d\n", count, i, j, k);
if(count%50==0) //每输出50个方案暂停一次 { printf("按任意键继续输出……\n"); getchar(); }
}
}
return 0;
}


6.表示两两不同

if((a-b)*(a-c)*(b-c)!=0)//一个技巧:表示两两不同可以这样做
{
......
}

例:C初步40课-项目七-找数字(2)
(2)在下面的加法算式中,不同的符号代表不同的数字,相同的符号代表相同的数字。请设计程序求出"都、要、学、C"4个符号分别代表的数字。

[plain] view
plaincopyprint?





              C    

          学  C    

      要  学  C    

+ 都  要  学  C    

________________    

  2   0   0   8   

提示:让计算机解奥数题。穷举"都、要、学、C"4个符号分别代表的数字(从0到9),然后进行组合,如果组合起来符合规则(不同的符号代表不同的数字,相同的符号代表相同的数字,且使等式成立),则为正解。
[参考解答]

[cpp] view
plaincopyprint?





#include <stdio.h>  

int main()  

{  

    int dou,yao,xue,c,s;//变量这样取,比用i,j,p,q之类的要清晰得多  

    for(dou=1; dou<3; dou++)  

        for(yao=0; yao<10; yao++)  

            for(xue=0; xue<10; xue++)  

                for(c=0; c<10; c++)  

                    if((dou-yao)*(dou-xue)*(dou-c)*(yao-xue)*(yao-c)*(xue-c)!=0)//一个技巧:表示两两不同可以这样做  

                    {  

                        s=4*c+3*xue*10+2*yao*100+dou*1000;  

                        if(2008==s)  

                            printf("都:%d 要:%d 学:%d C:%d\n", do, yao, xue, c);  

                    }  

    return 0;  



7.改变数字顺序
代码:
#include<stdio.h>
int main()
{
int a[6],i,j,k,m;
for (i=0 ; i<6 ; i++)
scanf ("%d",&a[i]);
for (i=5 ; i>=0; i--)
{
k=a[5];
for (j=4; j>=0; j--)
a[j+1]=a[j] ;
a[0]=k;
for (m=0 ; m<6 ; m++)
printf("%d ",a[m]);
printf("\n");
}
return 0;
}

#include<stdio.h>
#define N 7
int main()
{
int a
= {12,9,16,5,7,2,1},k,s;
printf("\n初始数组:\n");
for (k=0; k<N; k++)
printf("%4d",a[k]);
for (k=0; k<N/2; k++)
{
s=a[k];
a[k]=a[N-k-1];
a[N-k-1]=s;
}
printf("\n交换后的数组:\n");
for (k=0; k<N; k++)
printf("%4d",a[k]);
return 0;
}


8.冒泡排序法
代码:
for (i=0; i<n-1; i++)
for(j=0; j<n-i-1; j++)
if (salary[j]>salary[j+1])
{
t=salary[j];
salary[j]=salary[j+1];
salary[j+1]=t;
}


9.字符串处理例

9.1.删除字符/复制指定字符:
一个小的算法
#include <stdio.h>
int main( )
{
char a[]="Hello World";
int i,j;
for(i=j=0; a[i]!='\0'; i++)
if(a[i]!='l')
a[j++]=a[i];
a[j]='\0';
puts(a);
return 0;

结果:只复制 l 以外的字符,效果是删除了字符串的的l

9.2.倒序输出(部分)字符串:
#include <stdio.h>
int main( )
{
char b[]="ADCEBADEFG";
char *chp=&b[9];
while(--chp>&b[2])
putchar(*chp);
putchar('\n');
return 0;
}

9.3
#include <stdio.h>
int main( )
{
char s[]="ABCD",*p;
for(p=s+1; p<s+4; p++)
printf("%s\n",p);
return 0;
}

9.4
#include <stdio.h>
int main( )
{
char *s="12134211";
int v[4]= {0,0,0,0} ;
int k,i;
for(k=0; s[k]; k++)
{
switch(s[k])
{
case '1':
i=0;break;
case '2':
i=1;break;
case '3':
i=2;break;
case '4':
i=3;break;
}
v[i]++;
}
for(k=0; k<4; k++)
printf("%d",v[k]);
return 0;
}


9.5
大小写转换
#include <stdio.h>
int main( )
{
int n=0;
char str[80]="Beijing-China 2008";
printf("%s\n",str);
while(str
!='\0')
str[n++]=(str
>='a'&&str
<='z')?(str
-'a'+'A'):str
;
printf("%s\n",str);
return 0;
}


#include <stdio.h>
#include<string.h>
char cchar(char ch)
{
if (ch>='A'&&ch<='Z')
ch=ch-'A'+'a';
return ch;
}
int main()
{
char s[]="ABC+abc=defDEF",*p=s;
while(*p)
{
*p=cchar(*p);
p++;
}
printf("%s\n",s);
return 0;
}


9.6倒序
#include <stdio.h>
#include<string.h>
void fun(char *p, int n)
{
char *i,*j,t;
for (i=p,j=p+n-1; i<j; i++,j--)
{
t=*i;
*i=*j;
*j=t;
}
}
int main()
{
char s[]="1234567890";
fun(s,strlen(s));
puts(s);
return 0;
}


9.7删除指定字符
#include <stdio.h>
#include<string.h>
void  del (char *s,char c )
{
int i,j;
for (i=j=0; s[i]!='\0'; i++)
if (s[i]!=c)
s[j++]=s[i];
s[j]='\0';
}
int main()
{
char s[]="the c language";
del(s,'a');
puts(s);
return 0;
}

10.二维数组

10.1计算每行的最小数
#include <stdio.h>
int main( )
{
int x[2][3]= {5,4,6,7,8,9};
int m[2],i,j;
for (i=0; i<2; i++)
{
m[i]=x[i][0];
for(j=1; j<3; j++)
if(x[i][j]<m[i])
m[i]=x[i][j];
}
for (i=0; i<2; i++)
printf("%d\n", m[i]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: