处理方法整理(不断更新)
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; }
相关文章推荐
- Toast
- 常见的网络编程面试题
- SSH无密码登录要使用公钥与私钥
- 数值优化(Numerical Optimization)学习系列-序列二次规划和内点法(SQP、Interior-Point)
- HDU 5603 树状数组
- Java8新特性——接口的默认方法和类方法
- 数值优化(Numerical Optimization)学习系列-二次规划(Quadratic Programming)
- 数值优化(Numerical Optimization)学习系列-惩罚和增广拉格朗日方法(Augmented Lagrangian Methods)
- HDU 5600 || HDU 5601 思维
- 解决C2143语法错误: 缺少“;”(在“<end Parse>”的前面)
- 1001. A+B Format (20)
- Android JNI技术, NDK开发
- 数值优化(Numerical Optimization)学习系列-非线性约束最优化(Nonlinear Constrained Optimization)
- MPI和MapReduce
- Redux系列01:从一个简单例子了解action、store、reducer
- java枚举使用
- 福建省赛--Problem E The Longest Straight(标记+二分)
- centOS下卸载samba
- 数值优化(Numerical Optimization)学习系列-线性规划(Linear Programming)
- gdb 常用调试命令