[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;//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++)//找出第i行最大值
{

if(Array[i][j]>max)
{
max=Array[i][j];
b=j;//将最大值的列数赋值给b
}
}
min=Array[0][b];
for(int k=0;k<m;k++)//找出每行最小值
{

if(Array[k][b]<min)
{
min=Array[k][b];
c=k;//将最小的行数赋值给c
}
}
if(min==max)//判断该点是否为鞍点
{
printf("Array[%d][%d]=%d",c,b,Array[c][b]);
break;//if ture,输出鞍点
}
}
if(min!=max)//根据题目要求,没有鞍点输出None
{
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>
/*
1. 打开a文件,读取a的数据,暂时存起来char,str[Maxn]
2. 打开b文件,读取b的数据,暂时存起来char,str[Maxn]
3. 排序
*/
int main(){
FILE *fp;
char a[100];
if((fp=fopen("A.txt","r"))==NULL)//打开 test1 文件
{
printf("can't open file!\n");
exit(0);
}
int i=0;
a[i]=fgetc(fp);//把 fp 所指向的文件 test2 中的第一个字符读入到数组a[0]
while(a[i]!=EOF)//若第一个字符不是结束符 EOF,则继续把指针 fp 指向的文件test1 中的字符逐个读入到数组 a,直至遇到标识符 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);//把 fp 所指向的文件 test2 中的第一个字符读入到数组a[0]
while(a[i]!=EOF)//若第一个字符不是结束符 EOF,则继续把指针 fp 指向的文件test1 中的字符逐个读入到数组 a,直至遇到标识符 EOF 结束循环
{
putchar(a[i]);
i++;
a[i]=fgetc(fp);
}
a[i]='\0';
putchar('\n');
fclose(fp);

int n=i;//此时 n 为数组 a 的长度
int j,k,t;
for(i=0;i<n-1;i++)//对数组 a 进行直接选择排序
{
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);//在循环里,这条语句把数组 a 的所有字符写到文件指针变量fp 所指向的文件 C.txt 中
putchar(a[i]);//在循环里,这条语句把数组 a 的所有字符显示到屏幕上i++;
i++;
}
fclose(fp);//关闭文件 test3,防止它被误用
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;
}