xdoj

xdoj

用于复习

字符串数组练习

处理字符串

问题描述
从键盘输入一个字符串,将该字符串按下述要求处理后输出:
将ASCII码大于原首字符的各字符按原来相互间的顺序关系集中在原首字符的左边,
将ASCII码小于等于原首字符的各字符按升序集中在原首字符的右边。

输入说明
输入一行字符串,字符串c不长度超过100.

输出说明
输出处理后的一行字符串

输入样例
aQWERsdfg7654!@#$hjklTUIO3210X98aY

输出样例
sdfghjkla!#$0123456789@EIOQRTUWXYa

#include<stdio.h>
#include<string.h>
int main()
{
   
	char c[100], left[100], right[100],string[100];
	int i, j,k,l;
	char t;
	void sort(char* str, int n);

	gets_s(c, 100);
	t = c[0];
	for (i = 1, j = 0, k = 0; i < strlen(c); i++)
	{
   
		if (c[i] > t)
			left[j++] = c[i];
		else
			right[k++] = c[i];
	}
	sort(right, k);
	for (i = 0, l = 0; i < j; i++)
		string[l++] = left[i];
	string[l++] = t;
	for (i = 0; i < k; i++)
		string[l++] = right[i];
	string[l] = '\0';
	puts(string);
}


void sort(char* str, int n)
{
   
	int i, j;
	char t;
	for (i = 1; i < n; i++)
	{
   
		for (j = 0; j < n - i; j++)
		{
   
			if (str[j] > str[j + 1])
			{
   
				t = str[j];
				str[j] = str[j + 1];
				str[j + 1] = t;
			}
		}
	}
}

寻找最长的行

问题描述
寻找若干行文本中最长的一行

输入说明
输入为多个字符串(每个字符串长度不超过100个字符),每个字符串占一行,输入的行为“end”时表示输入结束

输出说明
输出其中最长的一行长度后换行再输出最长行的内容,如果最长行不止一个,则输出其中的第一行。

输入样例

abce
abdf dlfd
***end***

输出样例
9
abdf dlfd

#include<stdio.h>
#include<string.h>
int main()
{
   
	char s[100], end[100];
	int len, max;
	gets_s(s, 100);
	strcpy(end, s);
	max = strlen(s);
	while (strcmp(s, "***end***"))
	{
   
		gets_s(s, 100);
		len = strlen(s);
		if (len > max)
		{
   
			max = len;
			strcpy(end, s);
		}
	}
	printf("%d\n", max);
	puts(end);
}

字符串压缩

问题描述
有一种简单的字符串压缩算法,对于字符串中连续出现的同一个英文字符,用该字符加上连续出现的次数来表示(连续出现次数小于3时不压缩)。
例如,字符串aaaaabbbabaaaaaaaaaaaaabbbb可压缩为a5b3aba13b4。
请设计一个程序,将采用该压缩方法得到的字符串解压缩,还原出原字符串并输出。

输入说明
输入数据为一个字符串(长度不大于50,只包含字母和数字),表示压缩后的字符串

输出说明
在一行上输出解压缩后的英文字符串(长度不超过100),最后换行。

输入样例
a5b3aba13b4

输出样例
aaaaabbbabaaaaaaaaaaaaabbbb

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

int main()
{
   
	char a[50],ch;
	int i,j,num;
	num = 0;
	gets_s(a, 50);
	for (i = 0; i < strlen(a); i++)
	{
   
		if (isalpha(a[i]))
		{
   
			ch = a[i];
			putchar(ch);
			num = 0;
		}
		else
		{
   
			num = num * 10 + (a[i]-'0');
			if (isdigit(a[i + 1]))
				continue;
			else
			{
   
				for (j = 0; j < num-1; j++)
					putchar(ch);
			}
		}
	}
}

一维二维数组练习

0-1矩阵

问题描述
查找一个只包含0和1的矩阵中每行最长的连续1序列。

输入说明
输入第一行为两个整数m和n(0<=m,n<=100)表示二维数组行数和列数,其后为m行数据,每行n个整数(0或1),输入数据中不会出现同一行有两个最长1序列的情况。

输出说明
找出每一行最长的连续1序列,输出其起始位置(从0开始计算)和结束位置(从0开始计算),如果这一行没有1则输出两个-1,然后换行。

输入样例
5 6
1 0 0 1 1 0
0 0 0 0 0 0
1 1 1 1 1 1
1 1 1 0 1 1
0 0 1 1 0 0

输出样例
3 4
-1 -1
0 5
0 2
2 3

#include<stdio.h>
int main()
{
   
	int n, m, num[100][100],i,j;
	int start, end, * p1 = &start, * p2 = &end;
	void find(int* n, int len, int* p1, int* p2);
	scanf("%d %d", &n, &m);
	for (i = 0; i < n; i++)
	{
   
		for (j = 0; j < m; j++)
			scanf("%d", &num[i][j]);
	}
	for (i = 0; i < n; i++)
	{
   
		find(num[i], m, p1, p2);
		printf("%d %d\n", start, end);
	}
}

void find(int* n, int len, int* p1, int* p2)
{
   
	int i, count, max;
	for (i = 0,count=0,max=0; i < len; i++)
	{
   
		if (i != len - 1)
		{
   
			if (n[i] == 1)
				count++;
			else
			{
   
				if (count > max)
				{
   
					max = count;
					count = 0;
					*p1 = i - max;
					*p2 = i - 1;
				}
			}
		}
		else
		{
   
			if (n[i] == 1)
			{
   
				count++;
				if (count > max)
				{
   
					max = count;
					*p1 = i-max+1;
					*p2 = i;
				}
			}
			else
			{
   
				if (count > max)
				{
   
					max = count;
					*p1 = i - max;
					*p2 = i-1;
				}
			}
		}
	}
	if (max == 0)
	{
   
		*p1 = -1;
		*p2 = -1;
	}
}

等差数列

问题描述
 请写一个程序,判断给定整数序列能否构成一个等差数列。

输入说明
 输入数据由两行构成,第一行只有一个整数n(n<100),表示序列长度(该序列中整数的个数);
第二行为n个整数,每个整数的取值区间都为[-32768~32767],整数之间以空格间隔。

输出说明
 对输入数据进行判断,不能构成等差数列输出“no”,能构成等差数列输出表示数列公差(相邻两项的差)的绝对值的一个整数。

输入样例
样例1输入
6
23 15 4 18 35 11
样例2输入
5
2 6 8 4 10
输出样例
样例1输出
no
样例2输出
2

#include<stdio.h>
int main()
{
   
	int n, num[100], i,delta,flag=1;
	void sort(int* n, int l);
	scanf("%d", & n);
	for (i = 0; i < n; i++)
		scanf("%d", &num[i]);
	sort(num, n);
	delta = num[1] - num[0];
	for (i = 2; i < n; i++)
	{
   
		if (delta != num[i] - num[i - 1])
			flag = 0;
	}
	if (flag)
		printf("%d", delta);
	else
		printf("no");
}

void sort(int* n, int l)
{
   
	int i, j, t;
	for (i = 1; i < l; i++)
	{
   
		for (j = 0; j < l - i; j++)
		{
   
			if (n[j] > n[j + 1])
			{
   
				t = n[j];
				n[j] = n[j + 1];
				n[j + 1] = t;
			}
		}
	}
}

马鞍点

问题描述
若一个矩阵中的某元素在其所在行最小而在其所在列最大,则该元素为矩阵的一个马鞍点。
请写一个程序,找出给定矩阵的马鞍点。

输入说明
输入数据第一行只有两个整数m和n(0<m<100,0<n<100),分别表示矩阵的行数和列数;
接下来的m行、每行n个整数表示矩阵元素(矩阵中的元素互不相同),整数之间以空格间隔。

输出说明
在一行上输出马鞍点的行号、列号(行号和列号从0开始计数)及元素的值(用一个空格分隔),之后换行;
若不存在马鞍点,则输出一个字符串“no”后换行。

输入样例
4 3
11 13 121
407 72 88
23 58 1
134 30 62

输出样例
1 1 72

输入样例

2 2
1 1
1 1

输出样例

no

#include<stdio.h>
int main()
{
   
	//end用于确定马鞍点,t暂存最大最小值,index为最大最小值对应的横/纵坐标
	int n, m, i, j, num[100][100], end[100][100] = {
   0}, t,index,flag=0;
    
	scanf("%d %d", &n, &m);
	for (i = 0; i < n; i++)
	{
   
		for (j = 0; j < m; j++)
			scanf("%d", &num[i][j]);
	}
    //比较每列的数
	for (i = 0; i < n; i++)
	{
   
		t = num[i][0];
		index = 0;
        //flag用于确认有无最小值eg:(1,1,1,1)
		flag = 0;
		for (j = 0; j < m; j++)
		{
   
			if (num[i][j] < t)
			{
   
				t = num[i][j];
				index=j;
				flag = 1;
			}
		}
        //将num中最小值所在位置对应于end的数加一
		if(flag)
			end[i][index]++;
	}
    //比较每行的数
	for (j = 0; j < m; j++)
	{
   
		t = num[0][j];
        index=0;
        flag=0;
		for (i = 0; i < n; i++)
		{
   
			if (num[i][j] > t)
			{
   
				t = num[i][j];
				index = i;
                flag=1;
			}
		}
		//将num中最大值所在位置对应于end的数加一,也就是说end中为2的位置就是num的马鞍点
		if(flag)
			end[index][j]++;
	}
	//这里flag用于判断有无马鞍点
	flag = 0;
	for (i = 0; i < n; i++)
	{
   
		for (j = 0; j < m; j++)
		{
   
			if (end[i][j] == 2)
			{
   
				flag = 1;
				printf("%d %d %d", i, j, num[i][j]);
			}
		}
	}
	if (flag == 0)
		printf("no");
}

指针练习

成绩处理

描述
输入5个学生,4门课成绩,二维数组stu表示,行标表示学生,列标表示课程成绩.

使用指针完成地址传递,主函数完成数组输入和输出。

分别编写函数aver()、fals()和well()完成:

  • 求第一门课的平均分;

  • 统计有2门以上课程不及格的同学人数;

  • 平均成绩在90分以上或者全部课程成绩在85分以上的同学视为优秀,统计人数,

输入说明
输入二维浮点型数组stu

输出说明
输出第一门课程平均分(保留1位小数)、2门以上不及格人数和成绩优秀人数,数据之间空一格。

输入样例
85 73 59 92
93 95 89 88
86 88 88 87
59 51 52 68
78 32 59 91

输出样例
80.2 2 2

#include<stdio.h>

int main ()
{
   
	float stu[5][4];
	int i,j;
	float aver(float (*n)[4]);
	int fals(float (*n)[4]);
	int well(float (*n)[4]);
	
	//二维数组输入 
	for(i=0;i<5;i++)
	{
   
		for(j=0;j<4;j++)
			scanf("%d",&stu[5][4]);
	}
	//输出 
	printf("%.1f %d %d",aver(stu),fals(stu),well(stu));

	return 0;
}

//(*n)[列数]是二维数组传参形式
float aver(float (*n)[4] )
{
   
	int i;
	//sum为总分,av为平均分 
	float sum=0,av;
	for (i = 0; i < 5; i++)
		sum += *(n + i)[0];
	av = sum / 5;
	return av;
}

int fals(float(*n)[4])
{
   
	//num为每个人低于60的个数,sum为人数 
	int i, j, num = 0, sum = 0;
	float* p =& n[0][0];
	//用p++是考虑到二维数组在我们考虑来是二维的,但是在内存中是一个连续的空间储存的 
	for (i = 0; i < 5; i++)
	{
   
		for (j = 0; j < 4; j++)
		{
   
			if (*p < 60)
				num++;
			p++;
		}
		if (num >= 2)
			sum++;
		num = 0;
	}
	return sum;
}

int well(float(*n)[4])
{
   
	//num是每人大于85的个数,sum是每人的总分,end是符合条件的人数 
	int i, j, num = 0, sum = 0,end=0;
	float* p = &n[0][0];
	for (i = 0; i < 5; i++)
	{
   
		for (j = 0; j < 4; j++)
		{
   
			sum += *p;
			if (*p >= 85)
				num++;
			p++;
		}
		if (sum >= 360 || num == 4)
			end++;
		sum = 0;
		num = 0;
	}
	return end;
}

元素放置

描述

  • 定义一个一维整形数组num[50],输入正整数m、n(2≤m≤n≤7),输入一个m*n整形矩阵(值小于100)

  • 编写函数place()完成矩阵元素S型放置,从小到大排列

  • 使用指针完成地址传递,主函数完成数组输入和输出。

输入说明
输入正整数m和n(2≤m≤n≤7),输入一个m*n整形矩阵,含m*n个元素(值小于100)。

输出说明
格式输出:按行输出处理后的矩阵,S型排列,%3d,每行换行,最后一行不换行。

输入样例
3 3

15 14 21 34 22 37 40 16 50

输出样例
16 15 14
21 22 34
50 40 37

提示
使用指针作形参,实现地址传递,S型排列,%3d,每行换行,最后一行不换行。

#include<stdio.h>
int main()
{
   
	int n, m, num[50],s[7][7], i, j;
	void sort(int* num, int n);
	void place(int* num, int n, int m,int(*s)[7]);

	scanf("%d %d", &n, &m);
    //虽然要求输入一个矩阵,但我觉得木的必要pia><!
	for (i 
  • 49
    点赞
  • 223
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
xdoj application是一个用于竞技编程训练和练习的平台。 首先,xdoj application提供了大量的编程题库,涵盖了各种语言和难度级别。这些题目既有经典的算法问题,也有实际应用的编程挑战,可以满足不同水平的程序员的需求。通过解题,程序员可以提高自己的编程能力和算法思维。 其次,xdoj application提供了在线的程序编译和运行环境。程序员可以直接在平台上编写和测试自己的代码,无需安装任何开发工具。这大大降低了环境配置的难度,让程序员能够更加专注于解决问题本身。 另外,xdoj application还支持代码提交和评测功能。程序员可以将自己的代码提交到平台上,系统会对其进行自动评测,并给出相应的反馈和评分。这样,程序员可以及时了解自己的代码是否正确并进行相应的优化。同时,平台上也会展示其他程序员的提交和评测结果,让程序员能够学习和借鉴其他人的解决思路和代码实现。 最后,xdoj application还提供了练习和比赛等功能。程序员可以选择不同类型的练习模式,根据自己的需求进行编程训练。同时,平台也会定期举办编程比赛,供程序员们进行交流和竞争。这些比赛既能检验程序员的编程水平,也能提供一种实战的机会,加深对编程知识的理解和应用。 总之,xdoj application是一个功能齐全且用户友好的竞技编程平台,能够帮助程序员提高编程能力、锻炼算法思维,并提供交流、学习和竞争的机会。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值