[TOC]
C代码复盘 数组 1. 1000以内的完数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include <stdio.h> int main () { int s; for (int i=2 ;i<=1000 ;i++){ s=0 ; for (int j=1 ;j<i;j++){ if (i%j==0 ) s+=j; } if (s==i){ printf ("%d is from" ,i); for (int j=1 ;j<i;j++) if (i%j==0 ) printf ("%d " ,j); printf ("\n" ); } } return 0 ; }
2. 100~200中所有的素数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <stdio.h> int main () { int leap=1 ,t=0 ; for (int i=101 ;i<=200 ;i++){ for (int j=2 ;j*j<=i;j++){ if (i%j==0 ){ leap=0 ; break ; } } if (leap==1 ){ printf ("%d " ,i); t++; } leap=1 ; } printf ("%d " ,t); }
3. 转置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <stdio.h> #include <string.h> int main () { int a[3 ][3 ]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 }; for (int i=0 ;i<3 ;i++){ for (int j=0 ;j<3 ;j++){ printf ("%d " ,a[i][j]); } printf ("\n" ); } for (int i=0 ;i<3 ;i++){ for (int j=0 ;j<i;j++){ int t=a[i][j]; a[i][j]=a[j][i]; a[j][i]=t; } } for (int i=0 ;i<3 ;i++){ for (int j=0 ;j<3 ;j++){ printf ("%d " ,a[i][j]); } printf ("\n" ); } return 0 ; }
4. 给定一个数组,判断有多少种不同的数字 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <stdio.h> #define N 10010 int s[N];int main () { int t=0 ; int a[10 ]={1 ,2 ,11 ,3 ,2 ,1 ,23 ,3 ,1 ,2 }; for (int i=0 ;i<10 ;i++){ if (s[a[i]]==0 ){ s[a[i]]=1 ; t++; } } printf ("一共有%d个不同的数字" ,t); return 0 ; }
5. 将一个整数存放到一个数组中。存放时按逆序存放。例如:483 存放 成”384”。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <stdio.h> #include <stdlib.h> void fun (char *a,int n) { int i; if ((i=n/10 )!=0 ) fun(a+1 ,i); *a=n%10 +'0' ; } char str[100 ]="" ;int main () { int a; scanf ("%d" ,&a); fun(str,a); puts (str); return 0 ; }
一年的第几天 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h> #include <string.h> int main () { int months[13 ]={0 ,31 ,28 ,31 ,30 ,31 ,30 ,31 ,31 ,30 ,31 ,30 ,31 }; int year,month,day; scanf ("%d%d%d" ,&year,&month,&day); if (year%4 ==0 &&year%100 !=0 ||year%400 ==0 ){ months[2 ]=29 ; } int s=0 ; for (int i=1 ;i<month;i++){ s+=months[i]; } s+=day; printf ("这一年是当年的第%d天" ,s); return 0 ; }
8进制转10进制 1 2 3 4 5 6 7 8 void fun (char s[100 ]) { int i=0 ,n=0 ; while (s[i]!='\0' ){ n=n*8 +s[i]-'0' ; i++; } printf ("%d" ,n); }
斐波那契数列前40项 1 2 3 4 5 6 7 8 9 10 11 12 13 #include <stdio.h> int main () { int f1=1 ,f2=1 ,f3; printf ("%d %d " ,f1,f2); for (int i=1 ;i<=38 ;i++){ f3=f1+f2; printf ("%d " ,f3); f1=f2; f2=f3; } return 0 ; }
最大公约数和最小公倍数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include <stdio.h> int max_ele (int a,int b) { int result=1 ,minn; minn=a<b?a:b; for (int i=minn;i>=1 ;i--){ if (a%i==0 &&b%i==0 ){ result=i; break ; } } return result; } int min_time (int a,int b) { int result,maxn; maxn=a>b?a:b; for (int i=maxn;i<=a*b;i++){ if (i%a==0 &&i%b==0 ){ result=i; break ; } } return result; } int main () { int a,b; scanf ("%d%d" ,&a,&b); printf ("%d\n%d" ,max_ele(a,b),min_time(a,b)); return 0 ; }
鞍点 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 #include <stdio.h> #include <stdlib.h> int main () { int a[5 ][5 ],rmax[5 ],cmin[5 ],rx[5 ],ry[5 ],cx[5 ],cy[5 ],t=0 ; for (int i=0 ;i<5 ;i++){ for (int j=0 ;j<5 ;j++){ scanf ("%d" ,&a[i][j]); } } for (int i=0 ;i<5 ;i++){ rmax[i]=a[i][0 ]; for (int j=0 ;j<5 ;j++){ if (rmax[i]<a[i][j]){ rmax[i]=a[i][j]; rx[i]=i; ry[i]=j; } } } for (int j=0 ;j<5 ;j++){ cmin[j]=100000 ; for (int i=0 ;i<5 ;i++){ if (cmin[j]>a[i][j]){ cmin[j]=a[i][j]; cx[j]=i; cy[j]=j; } } } for (int i=0 ;i<5 ;i++){ for (int j=0 ;j<5 ;j++){ if (rx[i]==cx[j]&&ry[i]==cy[j]){ printf ("%d %d %d\n" ,rx[i]+1 ,ry[i]+1 ,a[i][j]); } } printf ("\n" ); } return 0 ; } 方法二 #include <stdio.h> int main () { int m,n; int Array[10 ][10 ]; int i,j,b=0 ,c=0 ; scanf ("%d %d" ,&m,&n); for (i=0 ;i<m;i++) { for (j=0 ;j<n;j++) { scanf ("%d" ,&Array[i][j]); } } int max=0 ; int min=0 ; for (i=0 ;i<m;i++) { max=Array[i][0 ]; for (j=0 ;j<n;j++) { if (Array[i][j]>max) { max=Array[i][j]; b=j; } } min=Array[0 ][b]; for (int k=0 ;k<m;k++) { if (Array[k][b]<min) { min=Array[k][b]; c=k; } } if (min==max) { printf ("Array[%d][%d]=%d" ,c,b,Array[c][b]); break ; } } if (min!=max) { printf ("None" ); } return 0 ; }
杨辉三角形 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int main () { int a[10 ][10 ]={0 }; for (int i=0 ;i<10 ;i++){ a[i][0 ]=a[i][i]=1 ; } for (int i=2 ;i<10 ;i++){ for (int j=1 ;j<i;j++){ a[i][j]=a[i-1 ][j]+a[i-1 ][j-1 ]; } } for (int i=0 ;i<10 ;i++){ for (int j=0 ;j<=i;j++){ printf ("%d " ,a[i][j]); } printf ("\n" ); } return 0 ; }
删除数组中值为n的元素 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include <stdio.h> int m;void del_element (int num[],int n) ;int main () { int num[10 ]; int i,n; m=10 ; for (i=0 ;i<10 ;i++) scanf ("%d" ,&num[i]); printf ("please input n\n" ); scanf ("%d" ,&n); del_element(num,n); for (i=0 ;i<m;i++) printf ("%d " ,num[i]); return 0 ; } void del_element (int num[],int n) { int i,j; for (i=0 ;i<m;i++) if (num[i]==n){ for (j=i+1 ;j<m;j++) num[j-1 ]=num[j]; m--; i--; } }
指针 利用指针法,输出二维数组各元素 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <string.h> #include <stdio.h> #define N 3 #define M 4 int main () { int a[N][M]; int *p; int i,j; p=a[0 ]; for (int i=0 ;i<N;i++){ for (int i=0 ;i<M;i++){ scanf ("%d" ,p++); } } printf ("\n" ); p=*a; for (int i=0 ;i<N;i++){ for (int i=0 ;i<M;i++){ printf ("%d" ,*p++); } } printf ("\n" ); return 0 ; }
字符串 计算字符串子串出现次数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <iostream> #include <cstring> using namespace std ; int main () { char a[100 ],b[10 ]; int len1,len2,t=0 ; scanf ("%s%s" ,a,b); len1=strlen (a); len2=strlen (b); int i,j,k; for (i=0 ;i<=len1-len2;i++) { for (j=0 ,k=i;j<len2&&b[j]==a[k];j++,k++); if (j==len2) t++; } cout <<t; return 0 ; }
达芬奇密码解密 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> #include <string.h> int main () { char s[100 ],a[100 ]={0 }; printf ("密文:" ); scanf ("%s" ,s); int len=strlen (s); for (int i=0 ;i<len;i++){ if (s[i]>='A' &&s[i]<='Z' ){ a[i]='A' +'Z' -s[i]; }else if (s[i]>='a' &&s[i]<='z' ){ a[i]='a' +'z' -s[i]; } } printf ("原文:" ); printf ("%s" ,a); return 0 ; }
判断是否为回文串 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include <stdio.h> #include <string.h> int main () { char s[100 ]; scanf ("%s" ,s); int n=strlen (s); for (int i=0 ;i<n/2 ;i++){ if (s[i]!=s[n-i-1 ]){ printf ("不是回文串" ); } } printf ("是回文串" ); return 0 ; }
统计字母数字其他字符个数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> #include <string.h> int main () { char s[100 ],c; int i=0 ,j=0 ,k=0 ,m=0 ; while ((c=getchar())!='\n' ){ if (c>=65 &&c<=90 ||c>=97 &&c<=122 ) i++; else if (c>='0' &&c<='9' ) j++; else if (c==' ' ) k++; else m++; } printf ("字母%d个,数字%d个,空格%d个,其他字符%d个" ,i,j,k,m); return 0 ; }
查找 折半查找 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #include <stdio.h> #include <string.h> int main () { int a[15 ]={15 ,14 ,13 ,12 ,11 ,10 ,9 ,8 ,7 ,6 ,5 ,4 ,3 ,2 ,1 }; int t,s=-1 ; scanf ("%d" ,&t); int l=0 ,r=14 ; while (l<=r){ int m=(l+r)/2 ; if (a[m]==t){ s=m; break ; } else if (a[m]>t)l=m+1 ; else r=m-1 ; } if (s==-1 ) printf ("查无此数" ); else printf ("第%d个元素" ,s+1 ); return 0 ; }
排序 冒泡排序 1 2 3 4 5 6 7 8 9 10 11 void bubble_sort (int a[],int n) { for (int i=0 ;i<n-1 ;i++){ for (int j=0 ;j<n-i-1 ;j++){ if (a[j]>a[j+1 ]){ int t=a[j]; a[j]=a[j+1 ]; a[j+1 ]=t; } } } }
选择排序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 void selection_sort (int a[], int len) { int i,j; for (i = 0 ; i < len - 1 ; i++) { int min = i; for (j = i + 1 ; j < len; j++) if (a[j] < a[min]) min = j; if (min!=i){ int t=a[min]; a[min]=a[i]; a[i]=t; } } }
文件 1. 合并磁盘A,B (各存放一行字母),放到C中 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 #include <stdio.h> #include <stdlib.h> int main () { FILE *fp; char a[100 ]; if ((fp=fopen("A.txt" ,"r" ))==NULL ) { printf ("can't open file!\n" ); exit (0 ); } int i=0 ; a[i]=fgetc(fp); while (a[i]!=EOF) { putchar (a[i]); i++; a[i]=fgetc(fp); } putchar ('\n' ); fclose(fp); if ((fp=fopen("B.txt" ,"r" ))==NULL ) { printf ("can't open file!\n" ); exit (0 ); } a[i]=fgetc(fp); while (a[i]!=EOF) { putchar (a[i]); i++; a[i]=fgetc(fp); } a[i]='\0' ; putchar ('\n' ); fclose(fp); int n=i; int j,k,t; for (i=0 ;i<n-1 ;i++) { for (j=i+1 ;j<n;j++) { if (a[i]>a[j]) { t=a[i]; a[i]=a[j]; a[j]=t; } } } if ((fp=fopen("C.txt" ,"w" ))==NULL ) { printf ("can't open file!\n" ); exit (0 ); } i=0 ; while (i<n) { fputc(a[i],fp); putchar (a[i]); i++; } fclose(fp); putchar ('\n' ); return 0 ; }
2. 文件处理:姓名输入 下面程序的功能是从键盘接受姓名(例如:输入”ZHANG SAN”),在文件”try.dat”中查 找,若文件中已经存入了刚输入的姓名,则显示提示信息;若文件中没有刚输入的姓名,则将该 姓名存入文件。要求:
⑴若磁盘文件”try.dat”,已存在,则要保留文件中原来的信息;若文件”try.dat” 不存在,则在磁盘上建立一个新文件;
⑵当输入的姓名为空时(长度为 0),结束程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #include <stdio.h> #include <stdlib.h> #include <string.h> int main () { FILE *fp; int flag; char name[30 ],data[30 ]; if ((fp=fopen("try.dat" ,"a+" ))==NULL ){ printf ("can't open" ); exit (0 ); } do { printf ("enter name" ); gets(name); if (strlen (name)==0 ) break ; strcat (name,"\n" ); rewind(fp); flag=1 ; while (flag&&(fgets(data,30 ,fp))!=NULL ){ if (strcmp (data,name)==0 ){ flag=0 ; } } if (flag){ fputs (name,fp); }else { printf ("data error" ); } }while (ferror(fp)==0 ); fclose(fp); return 0 ; }
3. 文件处理:检索关键字 以字符流形式读入一个文件,从文件中检索出六种C语言的关键字,并统计、 输出每种关键字在文件中出现的次数。本程序中规定:单词是一个以空格或’\t’、 ‘\n’结束的字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 #include <stdio.h> #include <string.h> FILE *cp; char fname[20 ], buf[100 ];int num;struct key { char word[10 ]; int count; }keyword[]={ "if" , 0 , "char" , 0 , "int" , 0 , "else" , 0 , "while" , 0 , "return" , 0 }; char *getword (FILE *fp) { int i=0 ; char c; while ((c=getc(fp)) != EOF && (c==' ' ||c=='\t' ||c=='\n' )); if (c==EOF) return (NULL ) ; else buf[i++]=c; while ((c = fgetc(fp))!=EOF&& c!= ' ' && c!= '\t' && c!= '\n' ) buf[i++] = c; buf[i]= '\0' ; return (buf); } void lookup (char *p) { int i; char *q, *s; for (i=0 ;i<num;i++){ q = &keyword[i].word[0 ] ; s=p; while ( *s && (*s==*q) ){ s++; q++; } if ( *s==*q ){ keyword[i].count++; break ; }} return ; } int main () { int i; char *word; printf ("Input file name:" ); scanf ("%s" , fname); if ((cp=fopen(fname, "r" )) ==NULL ) { printf ("File open error: %s\n" , fname); return 0 ; } num = sizeof (keyword)/sizeof (struct key); while ((word=getword(cp))!=NULL ) lookup(word); fclose(cp); for (i=0 ;i<num;i++) printf ("keyword:%-20scount=%d\n" ,keyword[i].word,keyword[i].count); return 0 ; }
4. 文件处理:读入二进制 下面程序的功能是将从终端上读入的 10 个整数以二进制方式写入名为”bi.dat”的新文件 中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <stdio.h> #include <stdlib.h> FILE *fp; int main () { int i, j; if ((fp=fopen("bi.dat" , "wb" )) == NULL ) exit (0 ); for ( i=0 ;i<10 ;i++){ scanf ("%d" , &j ); fwrite(&j,sizeof (int ), 1 , fp); } fclose(fp); return 0 ; }
5. 文件处理:字符串大小写转换 下面程序的功能是键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母, 输出到文件 test.txt 中,然后从该文件读出字符串并显示出来。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <stdio.h> #include <string.h> #include <stdlib.h> int main () { char str[100 ]; int i=0 ; FILE *fp; if ((fp=fopen("test.txt" , "w" ))==NULL ) { printf ("Can't open the file.\n" ); exit (0 ); } printf ("Input a string:\n" ); gets(str); while (str[i]){ if (str[i]>= 'a' &&str[i]<= 'z' ) str[i]= str[i]-32 ; fputc(str[i],fp); i++; } fclose(fp); fp=fopen("test.txt" ,"r" ); fgets(str,strlen (str)+1 ,fp); printf ("%s\n" ,str); fclose(fp); return 0 ; }
数据结构部分 将a和b两个链表合并,链表包括学号,成绩,按学号升序排列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 void Merge (LinkList A,LinkList B,LinkList &C) { LNode *p=A->next; LNode *q=B->next; C=A; C->next=NULL ; LNode *r=C; while (p!=NULL &&q!=NULL ){ if (p->data<q->data){ r->next=p; p=p->next; r=r->next; }else { r->next=q; q=q->next; r=r->next; } } r->next=NULL ; if (p!=NULL )r->next=p; if (q!=NULL )r->next=q; }