BUPT计导作业11.20~12.4字符串、数组、指针代码参考

坐标:BUPT;OJ:Excited OJ (BOJ-V4)
好多小伙伴问我要源码,我有时也不是很方便,所以把我现在还能看到题目的几次练习的源码发出来,大家可以一起相互学习,欢迎交流、讨论!
直接抄袭代码是禁止的哦~~
(如果不是左爷班的可能题目会有些不同……)
PS:本人蒟蒻orz

第八次练习

主要与字符串处理有关,相关易错点:

  • 没有吸收字符串后的'\n'
  • 字符数组开的不够大,'\0' 没有存入
  • 没有使用strlen(char*)函数,使得多余部分被处理

A.身份证号码最后一位

#include <stdio.h>

int a[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char c[12]="10X98765432";
char s[19];
int t,sum;

int main(void)
{
	scanf("%d",&t);
	for (int i=1; i<=t; i++)
	{
		scanf("%s",s);
		sum=0;
		for (int j=0; j<17; ++j)
			sum+=a[j]*(s[j]-'0');
		printf("%d\n",sum);
		if (c[sum%11]==s[17])
			printf("right\n");
		else
			printf("wrong\n");
	}
	return 0;
}
/*
2
34052419800101001X
310105199412049278
*/

PS:一个一个特判的,我佩服你们

B.括号匹配

#include <stdio.h>
#include <string.h>

char s[105];
int cnt;

int main(void)
{
	scanf("%s",s);
	int len=strlen(s);
	for (int i=0; i<len; i++)
	{
		if (s[i]=='(')
			cnt++;
		if (s[i]==')')
			cnt--;
		if (cnt<0)
			break;
	}
	if (cnt)
		printf("parentheses do not match!\n");
	else
		printf("parentheses match!\n");
	return 0;
}

PS:注意)(是要判错的就OK了

C.字母统计

#include <stdio.h>
#include <string.h>

int upper[27];
int lower[27];
char s[105];

int main(void)
{
	scanf("%s",s);
	int len=strlen(s);
	for (int i=0; i<len; ++i)
	{
		if (s[i]>='A' && s[i]<='Z')
			upper[s[i]-'A']++;
		if (s[i]>='a' && s[i]<='z')
			lower[s[i]-'a']++;
	}
	for (int i=0; i<26; ++i)
		if (upper[i]!=0)
			printf("The character %c has presented %d times.\n",i+'A',upper[i]);
	for (int i=0; i<26; ++i)
		if (lower[i]!=0)
			printf("The character %c has presented %d times.\n",i+'a',lower[i]);
	return 0;
}

D.字符串加密

#include <stdio.h>
#include <string.h>

char s[105],up[27],lo[27];

int main(void)
{
	scanf("%s",s);
	int len=strlen(s);
	for (int i=0; i<len; i++)
		if (s[i]=='Z' || s[i]=='z')
			s[i]+='a'-'z';
		else
			s[i]++;
	scanf("%s",up);
	scanf("%s",lo);
	for (int i=0; i<len; ++i)
	{
		if (s[i]>='A' && s[i]<='Z')
			s[i]=up[s[i]-'A'];
		if (s[i]>='a' && s[i]<='z')
			s[i]=lo[s[i]-'a'];
	}
	printf("%s",s);
	return 0;
}
/*
IlovelanguageC
OPDGHSTABNRYZCQJKLMIXEFUVW
hpzaeongxrbcljwtskfymdqiuv
NltqolpwgdpgoG
*/

PS:没什么好说的,仔细看题

第九次练习

这一次就是经典三大排序+二分查找
emmmm这要怎么错……肯定都能AK但还是自己打一遍练练手熟吧

A.冒泡排序

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
void swap(int* a, int* b)
{
	int t=*a;
	*a=*b;
	*b=t;
}
int main(void)
{
	int n;
	scanf("%d",&n);
	int a[n];
	For(i,1,n)
		scanf("%d",&a[i]);
	bool ok;
	for (int i=n-1; i>=1; i--)
	{
		ok=true;
		For(j,1,i)
			if (a[j]>a[j+1])
			{
				swap(&a[j],&a[j+1]);
				ok=false;
			}
		if (ok==true)
			break;
	}
	For(i,1,n)
		printf("%d ",a[i]);
	return 0;
}

B.插入排序

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>
#define For(i,a,b) for (int i=(a); i<=(b); ++i)

int main(void)
{
	int n,i,j,k,temp;
	scanf("%d",&n);
	int a[n];
	For(i,1,n)
		scanf("%d",&a[i]);
	For(i,2,n)
	{
		for (j=i-1; j>=0; j--)
			if (a[j]<a[i])
				break;
		if (j!=i-1)
		{
			temp=a[i];
			for (k=i-1; k>j; k--)
				a[k+1]=a[k];
			a[k+1]=temp;
		}
		For(i,1,n)
			printf("%d ",a[i]);
		printf("\n");
	}
	return 0;
}

C.选择排序

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
void swap(int* a, int* b)
{
	int t=*a;
	*a=*b;
	*b=t;
}
int main(void)
{
	int n,i,j,k;
	scanf("%d",&n);
	int a[n];
	For(i,1,n)
		scanf("%d",&a[i]);
	For(i,1,n-1)
	{
		k=i;
		For(j,i+1,n)
			if (a[j]<a[k])
				k=j;
		if (k!=i)
			swap(&a[i],&a[k]);
		For(i,1,n)
			printf("%d ",a[i]);
		printf("\n");
	}
	return 0;
}

D.二分查找

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
const int N=2e6+5;
int a[N];
int n,m,t;
int bs(int x)
{
   int mid;
   int l=1, r=n;
   while(l<=r)
   {
	    mid=(l+r)/2;
	    if (x==a[mid])
	    	return mid-1;
	    else 
			if(x<a[mid])
		    	r=mid-1;
		    else
		    	l=mid+1;
	}
	return -1;
}
int main(void)
{
	scanf("%d%d",&n,&m);
	For(i,1,n)
		scanf("%d",&a[i]);
	For(i,1,m)
	{
		scanf("%d",&t);
		printf("%d ",bs(t));
	}
	return 0;
}
/*
15
20
-293 -213 -23 0 1 5 11 23 56 67 87 273 999 2132 10000
-23 -99999 0 999 953 67 56 44 33 87 -293 23 11 273 -213 2132 10000 87654 1 5
*/

第十次练习

好像这次的题需要稍微想想?
记住OJ采用的是“黑盒测试”,我们不必过多展示技巧,能A了就完了(在没有助教人工阅卷的情况下)
Keep It Simple and Stupid

  • 数组开小了当然就会越界,越界就会RE
  • 如果编译器不能初始化变长数组,请用memset(void *a, int element, sizeof(a))函数
  • 函数在调用二维数组时,列必须不为变量
  • 不会的话打全局变量就完了(逃)

A.矩阵转置

#include <stdio.h>
#define For(i,a,b) for (int i=(a); i<=(b);++i)
int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int a[m+1][n+1];
	For(i,1,m)
		For(j,1,n)
			scanf("%d",&a[i][j]);
	For(i,1,n)
	{
		For(j,1,m)
			printf("%d ",a[j][i]);
		printf("\n");
	}
	return 0;
}
/*
3 5
5 5 5 5 5
3 3 3 3 3
1 1 1 1 1
*/

B.推销员的便条

#include <stdio.h>
int main()
{
	float t[5]={0};
	float a[6][5]={0};
	int n,y,x;
	float v;
	scanf("%d",&n);
	for (int i=1; i<=n; ++i)
	{
		scanf("%d%d%f",&y,&x,&v);
		a[x][y]+=v;
		t[y]+=v;
	}
	for (int i=1; i<=5; ++i)
	{
		float sum=0;
		for (int j=1; j<=4; j++)
		{
			printf("%.1f\t",a[i][j]);
			sum+=a[i][j];
		}
		printf("%.1f\n",sum);
	}
	float total=0;
	for (int i=1; i<=4; i++)
	{
		printf("%.1f\t",t[i]);
		total+=t[i];
	}
	printf("%.1f",total);
	return 0;
}
/*
4
1 1 35.6
1 2 23.1
1 1 89.3
4 5 22.6
*/

PS:一定要好好看题TAT,亏我还给他打了那么好看的一张带表头的表……

C.列最小元素

#include <stdio.h>
#define For(i,a,b) for (int i=(a); i<(b); ++i)
int main()
{
	int m,n;
	scanf("%d%d",&m,&n);
	int a[m][n];
	For(i,0,m)
		For(j,0,n)
			scanf("%d",&a[i][j]);
	int x[n];
	For(j,0,n)
	{
		x[j]=a[0][j];
		For(i,1,m)
			x[j]=(a[i][j]<x[j])?a[i][j]:x[j];
	}
	For(i,0,n)
		printf("%d ",x[i]);
	return 0;
}
/*
3 4
22 45 56 30
19 33 45 38
20 22 66 40
*/

D.寻找鞍点

#include <stdio.h>
#include <stdbool.h>
int m,n;
int a[100][100]={0};
bool ismin(int x,int y)
{
	for (int i=0; i<m; i++)
		if (a[i][y]<a[x][y])
			return false;
	return true;
}
int main()
{
	scanf("%d%d",&m,&n);
	int max[m];
	for (int i=0; i<m; i++)
	{
		int maxn=0;
		for (int j=0; j<n; j++)
		{
			scanf("%d",&a[i][j]);
			if (a[i][j]>maxn)
			{
				maxn=a[i][j];
				max[i]=j;
			}
		}
	}
	for (int i=0; i<m; ++i)
	{
		if (ismin(i,max[i]))
		{
			printf("The saddle point is (%d,%d)=%d.",i,max[i],a[i][max[i]]);
			return 0;
		}
	}
	printf("There is no saddle point in the matrix.");
	return 0;
}
/*
4 5
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
*/

PS:其实此题要调用函数的话,应该先求列,再求行……
但是在机考时这些是无所谓的,只要能A就完了!
好吧我承认我打的丑QAQ

E.矩阵变换

#include <stdio.h>
typedef long long ll;
int a[100][100];
ll b[100];
const ll INF=1e6+5;
int n;
void print(int x[],int size)
{
	for (int i=0; i<size; ++i)
		printf("%d ",x[i]);
	printf("\n");
}
int main()
{
	scanf("%d",&n);
	for (int i=0; i<n; i++)
		for (int j=0; j<n; j++)
		{
			scanf("%d",&a[i][j]);
			b[i]+=a[i][j];
		}
	for (int j=0; j<n; j++)
	{
		ll min=INF*n;
		int p=0;
		for (int i=0; i<n; ++i)
		{
			if (b[i]<min)
			{
				min=b[i];
				p=i;
			}
		}
		print(a[p],n);
		b[p]=INF*n;
	}
	return 0;
}
/*
3
5 5 5
3 3 3
1 1 1
*/

PS:你也可以选择写函数,有很多同学问我题的时候是写的函数,只要注意一些细节就好了
题目中矩阵元素到1e6了,范围还是100个,如果用int存怕是要溢出

F.蛇形矩阵

话说这个题特别像我初中参加NOIP时的T3……
当时我还不知道什么是矩阵呢QAQ

#include <stdio.h>

int main()
{
	int n;
	scanf("%d",&n);
	int a[n+1][n+1];
	int num=1;
	int x=1,y=1,p=1;
	for( ; num<=n*n; ++num)
	{
		a[x][y]=num;
		if (y==1&&x!=n || y==n)
		{
			a[++x][y]=++num;
			p=-p;
			x+=p;
			y-=p;
			continue;
		}
		if (x==1&&y!=n || x==n)
		{
			a[x][++y]=++num;
			p=-p;
			x+=p;
			y-=p;
			continue;
		}
		x+=p;
		y-=p;
	}
	for (int i=1; i<=n; i++)
	{
		for (int j=1; j<=n; j++)
			printf("%d ",a[i][j]);
		printf("\n");
	}
	return 0;
}

PS:无非两种操作撞到边界了蛇要下移或者右移,没撞到的时候走一个对角
我知道你们肯定有比我打的好看的orz

第十一次练习

题目太水,练练手就完了
注意:

  • 当你分不清指针数组还是数组指针,指针这玩意到底怎么用时:
  • 不要打函数了(雾)
  • 看看编译器给你的建议
  • 使用搜索工具看一段例程

A.删除字符

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
int main()
{
	char s[105];
	char c;
	scanf("%s",s);
	getchar();
	scanf("%c",&c);
	int len=strlen(s)-1;
	For(i,0,len)
	{
		if (s[i]!=c)
			printf("%c",s[i]);
	}
	return 0;
}

PS:这个题打的太水……主要是 太懒 这样打的快
就问题的同学们来看,如果采用for循环遍历数组的话,记得在删除字符后,i(index)需要 - -,相当于你的检查光标回退了一格;如果你RE了,请你把数组开大一点试试

B.子字符串查找

没水,打的指针2333

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
char* strstr(char* s1, char* s2)
{
	int len1=strlen(s1), len2=strlen(s2);
	For(i,0,len1-1)
	{
		if(s1[i]==s2[0])
		{
			bool flag=true;
			int j=1;
			while (flag && j<len2)
			{
				flag=(s1[i+j]==s2[j]);
				j++;
				if (i+j>=len1)
					flag=false;
			}
			if (flag)
				return s1+i;
		}
	}
	return NULL;
}
int main()
{
	char s1[505],s2[505];
	gets(s1);
	gets(s2);
	if (strstr(s1,s2))
	{
		puts(strstr(s1,s2));
	}
	else
		printf("NULL!");
	return 0;
}
/*
didjfsd dabcxxxxxx
abc
*/

C.指针数组

又打水了2333

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
int main()
{
	char s[10005];
	gets(s);
	int len=strlen(s)-1;
	int a[1005];
	int cnt=-1;
	For(i,0,len)
	{
		if (s[i]==' ')
		{
			s[i]='\0';
			cnt++;
			a[cnt]=i;
		}
	}
	puts(s);
	For(i,0,cnt)
		puts((char*)(s+a[i]+1));
	return 0;
}
/*
You are great
You
are
great
*/

D.一维数组动态内存

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
int main()
{
	int *a,n;
	scanf("%d",&n);
	a=(int*)malloc(sizeof(int)*n);// 建立长度为n的动态整型数组
	For(i,0,n-1)
	{
		scanf("%d",&a[i]);
		a[i]=-10*a[i];
	}
	For(i,0,n-1)
		printf("%d ",a[i]);
	free(a);//释放动态内存
	return 0;
}

E.二维数组动态内存

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define For(i,a,b) for (int i=(a); i<=(b); ++i)
int main()
{
	int **a,n,m;
	scanf("%d%d",&n,&m);
	a=(int **)malloc(sizeof(int *)*n);//建立长度为n的动态指针数组
	For(i,0,n-1)
		a[i]=(int *)malloc(sizeof(int)*m);//建立长度为m的一维整型数组
	For(i,0,n-1)
		For(j,0,m-1)
		{
			scanf("%d",&a[i][j]);
			a[i][j]=-10*a[i][j];
		}
	For(i,0,n-1)
	{
		For(j,0,m-1)
			printf("%d ",a[i][j]);
		printf("\n");
	}
	For(i,0,n-1)
		free(a[i]);
	free(a);//释放动态内存
	return 0;
}

老师怕你不会写都把源码放在题目里了2333

最后祝大家机考AK,rating(哪来的rating) 成绩++ !
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值