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

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

 

终于做完了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 plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.               C    
  2.           学  C    
  3.       要  学  C    
  4. + 都  要  学  C    
  5. ________________    
  6.   2   0   0   8   
提示:让计算机解奥数题。穷举"都、要、学、C"4个符号分别代表的数字(从0到9),然后进行组合,如果组合起来符合规则(不同的符号代表不同的数字,相同的符号代表相同的数字,且使等式成立),则为正解。
[参考解答]
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.     int dou,yao,xue,c,s;//变量这样取,比用i,j,p,q之类的要清晰得多  
  5.     for(dou=1; dou<3; dou++)  
  6.         for(yao=0; yao<10; yao++)  
  7.             for(xue=0; xue<10; xue++)  
  8.                 for(c=0; c<10; c++)  
  9.                     if((dou-yao)*(dou-xue)*(dou-c)*(yao-xue)*(yao-c)*(xue-c)!=0)//一个技巧:表示两两不同可以这样做  
  10.                     {  
  11.                         s=4*c+3*xue*10+2*yao*100+dou*1000;  
  12.                         if(2008==s)  
  13.                             printf("都:%d 要:%d 学:%d C:%d\n"do, yao, xue, c);  
  14.                     }  
  15.     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[N]= {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[n]!='\0')  
        str[n++]=(str[n]>='a'&&str[n]<='z')?(str[n]-'a'+'A'):str[n];  
    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;  
} 

















  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值