A. 实验9_8_设计函数 void delcharfun(char *str,char ch)

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

问题描述:
设计函数 void delcharfun(char *str,char ch)实现从字符串str中删除指定的字符ch。同一字母的大、小写按不同字符处理。
输入与输出要求:
输入一个长度不超过100的非空字符串与一个字符,代表需要处理的字符串与需要从字符串中删除的字符。其中字符串中不会出现空格、换行符。输出删除指定字符以后的字符串,占一行。如果删除指定字符后字符串变为空串,则直接输出空行。

输入样例

abcABCabc#
b

输出样例

acABCac#

示例代码

#include <stdio.h>
#include <stdlib.h>

void delcharfun(char *str,char ch);

int main()
{
	char x[110];
	char del;
	gets(x);
	scanf("%c", &del);
	delcharfun(x, del);
	puts(x);
        return 0;
}

void delcharfun(char *str,char ch)
{
	for (int i = 0; str[i] != '\0'; i++)
	{
		if (str[i] == ch)
		{
			for (int j = i; str[j] != '\0'; j++)
			{
				str[j] = str[j + 1];
			}
			i--;
		}
	}
}

B. 实验10_4_设计函数char *locatesubstr

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

设计函数 char *locatesubstr(char *str1,char *str2),查找str2指向的字符串在str1指向的字符串中首次出现的位置,返回指向该位置的指针。若str2指向的字符串不包含在str1指向的字符串中,则返回空指针NULL。
注意这里必须使用指针而不是数组下标来访问字符串。
输入与输出要求:输入两个长度不超过500的非空字符串str1和str2,字符串中可能出现空格,以换行符结束。输出str1中返回指针后的所有字符;否则输出“NULL!”。

输入样例

didjfsd dabcxxxxxx
abc
aaaaabcaaa
xxx

输出样例

abcxxxxxx
NULL!

示例代码

#include <stdio.h>
#include <stdlib.h>

int nohave = 0;
char *locatesubstr(char *str1,char *str2);

int main()
{
	char a[510];
	char b[510];
	gets(a);
	gets(b);
	char *str = locatesubstr(a, b);
	if (nohave)
	{
		printf("NULL!");
	}
	else
	{
		puts(str);
	}
        return 0;
}

char *locatesubstr(char *str1,char *str2)
{
	for (int i = 0; str1[i] != '\0'; i++)
	{
		if (str1[i] == str2[0])
		{
			int right = 1;
			for (int j = 0; str2[j] != '\0'; j++)
			{
				if (str1[i + j] != str2[j])
				{
					right = 0;
				}
			}
			if (right)
			{
				return &str1[i];
			}
		}
	}
	nohave = 1;
}

C. 实验10_5_指针数组初步

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

已知一个总长度不超过10000的字符串,字符串中只包含大写字母“A—Z”、小写字母“a—z”和空格‘ ’。空格用于分割单词,空格的个数不超过1000个。你的任务是将字符串中用空格分隔的单词打印出来。
你要按照如下要求完成任务:
1.利用指针数组指向每个单词的开始位置。
2.把字符串中单词结束后的空格改为“\0”,然后使用指针数组将每个单词打印出来。
3.不可直接输出或使用二维数组输出单词。
输入与输出要求:输入一个字符串,满足题目描述,占一行。输出这个字符串中的单词,每个单词占一行。

输入样例

You are great
itisalongword

输出样例

You
are
great
itisalongword

示例代码

#include <stdio.h>
#include <stdlib.h>

void gaikongge(char *str);
void printstr(char *str);

int main()
{
	char x[10010];
	gets(x);
	gaikongge(x);
        return 0;
}

void gaikongge(char *str)
{
	int print = 0;
	for (int i = 0; str[i] != '\0'; i++)
	{
		if (str[i] == ' ')
		{
			str[i] = '\0';
			printstr(&str[print]);
			print = i + 1;
		}
	}
	printstr(&str[print]);
}

void printstr(char *str)
{
	puts(str);
}

D. 实验10_7_动态分配内存_1

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

已知正整数n,你要利用malloc函数动态开辟一个长度为n的整型数组,然后读取n个整数存入该数组中。再将这n个整数全部改为其相反数(例如10的相反数是-10,-10的相反数是10)的10倍,然后将其输出。最后你要利用free函数将该动态数组所占用的空间释放。
提示:malloc与free的使用,以下代码即建立了一个长度为n的整型动态数组,并释放:
int *a,n;
scanf(“%d”,&n);
a=(int * )malloc(sizeof(int) * n);// 建立长度为n的动态整型数组
free(a);//释放动态内存

输入为两行,第一行为一个正整数n,第二行为n个用空格分隔整数。测试用例保证所有整数可以用int存储,且为这n个整数申请内存不会超出内存限制。
输出只有一行,为用计算后的n个整数,这n个整数之间用一个空格分隔。

输入样例

10
1 2 3 4 5 6 7 8 9 10

输出样例

-10 -20 -30 -40 -50 -60 -70 -80 -90 -100

示例代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int *a,n;
	scanf("%d",&n);
	a=(int * )malloc(sizeof(int) * n);// 建立长度为n的动态整型数组
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	for (int i = 0; i < n; i++)
	{
		a[i] = -a[i] * 10;
	}
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	free(a);//释放动态内存
        return 0;
}

E. 实验10_7_动态分配内存_2

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

已知正整数n、m,你要利用malloc函数动态开辟一个n行、m列的整型二维数组,然后读取n*m个整数存入该数组中。再将这n*m个整数全部改为其相反数的10倍,然后将其输出。最后你要利用free函数将该动态数组所占用的空间释放。
提示:malloc与free的使用,以下代码即建立了一个n行m列的整型二维动态数组,并释放:
int **a,n ,m;
scanf(“%d%d”,&n,&m);
a=(int **)malloc(sizeof(int *)*n);//建立长度为n的动态指针数组
for(i=0;i<n;i++)
a[i]=(int *)malloc(sizeof(int)*m);//建立长度为m的一维整型数组
for(i=0;i<n;i++)
free(a[i]);
free(a);//释放动态内存

输入为两行,第一行为两个用空格分隔的正整数n,m,第二行为n*m个用空格分隔整数。测试用例保证所有整数可以用int存储,且为这n*m个整数申请内存不会超出内存限制。
输出按矩阵格式输出,具体见样例。

输入样例

3 4
1 2 3 4 5 6 7 8 9 10 11 12

输出样例

-10 -20 -30 -40
-50 -60 -70 -80
-90 -100 -110 -120

示例代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
	int **a,n ,m, i, j;
	scanf("%d%d",&n,&m);
	a=(int **)malloc(sizeof(int *)*n);//建立长度为n的动态指针数组
	for(i=0;i<n;i++)
	a[i]=(int *)malloc(sizeof(int)*m);//建立长度为m的一维整型数组
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			scanf("%d", &a[i][j]);
			a[i][j] = -a[i][j] * 10;
		}
	}
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < m; j++)
		{
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	for(i=0;i<n;i++)
	free(a[i]);
	free(a);//释放动态内存
        return 0;
}

F. 实验7_21_编码、解码数组

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

设有一个整型数组a中存放n个互不相同的整数,a中元素取值范围为0到n-1。a数组的编码定义如下:a[0]的编码为0,放入b[0];ai的编码为在a[0]、a[1]、…、a[i-1]中比a[i]的值小的数的个数,放入b[i]。例如:a[6]={4,3,0,5,1,2}时,则b[6]={0,0,0,3,1,2}。你有两个任务,任务一是编码,即已知n与数组a,求数组b;任务二是解码,即已知n与数组b,求数组a。
输入与输出要求:首先输入两个整数n和flag。n代表数组元素的个数(1<=n<=100),flag代表任务类型(flag=1代表编码任务,flag=2代表解码任务)。然后是n个整数,当flag=1时,这n个数即代表数组a的内容;当flag=2时,这n个数即代表数组b的内容。
输出n个整数,当flag=1时即为编码后数组b的内容,当flag=2时,即为解码后数组a的内容。每个整数用空格分开,最后一个整数后是换行符。

输入样例

5
1
2 1 3 0 4
8
2
0 1 2 0 1 1 4 5

输出样例

0 0 2 0 4
3 6 7 0 2 1 4 5

示例代码

#include <stdio.h>
#include <stdlib.h>

void f1(int n);
void f2(int n);

int main()
{
	int n, flag;
	scanf("%d %d", &n, &flag);
	if (flag == 1)
	{
		f1(n);
	}
	else
	{
		f2(n);
	}
        return 0;
}

void f1(int n)
{
	int a[n], b[n];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	for (int i = 0; i < n; i++)
	{
		int count = 0;
		for (int j = i - 1; j >= 0; j--)
		{
			if (a[j] < a[i])
			{
				count++;
			}
		}
		b[i] = count;
	}
	for (int i = 0; i < n; i++)
	{
		printf("%d ", b[i]);
	}
}

void f2(int n)
{
	int a[n], b[n];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &b[i]);
	}
	a[0] = 0;
	int count = 0;
	for (int i = 1; i < n; i++)
	{
		a[i] = b[i];
		for (int j = 0; j < i; j++)
		{
			if (a[j] >= a[i])
			{
				a[j]++;
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
}

这里提供解密函数f2的另一种算法

void f2(int n)
{
	int a[n], b[n];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &b[i]);
	}
    int left[100] = {0};
    for (int i = 1; i < n; i++)
    {
        left[i] = left[i - 1] + 1;
    }
    for (int i = n - 1; i >= 0; i--)
    {
        int tmp = left[b[i]];
        for (int j = b[i]; j < i; j++)
        {
            left[j] = left[j + 1];
        }
        left[i] = tmp;
    }
    for (int i = 0; i < n; i++)
    {
        printf("%d ", left[i]);
    }
}

G. 实验7_24_数列复原

运行时间限制: 1000运行内存限制: 65536
作者: scshuanghai是否specialjudge: False

题目描述

有n个整数组成的数列(这n个整数互不相同,取值为1-n),原始数列中第一个数字是1,将1删除后把其后的两个数字放到数列的末尾,这时排在数列开头的数字是2,将2删除,取其后的两个数字放到数列的末尾,这时数列的开头是3,依次类推,直到把数列中所有的数字删除。如果剩下的数不足两个,那么就取一个数。
例如原始数列为“1 5 3 2 4”:
将1删除后,把其后的两个数字放到数列的末尾:2 4 5 3
将2删除后,把其后的两个数字放到数列的末尾:3 4 5
将3删除后,把其后的两个数字放到数列的末尾:4 5
将4删除后,把其后的两个数字放到数列的末尾:5
将5删除后,数列变为空。
你的任务是已知n,求出原始数列。比如上述数列,已知n=5,那么就要求出数列“1 5 3 2 4”。
输入与输出要求:首先输入1个整数n,n代表连续整数的个数。n的范围是1—200。输出n个整数,即原始数列。每个整数用空格分开,最后一个整数后是换行符。

输入样例

7
20

输出样例

1 7 5 2 4 6 3
1 12 8 2 15 17 3 9 13 4 19 10 5 16 14 6 11 20 7 18

示例代码

#include <stdio.h>
#include <stdlib.h>

void Arrayres(int n);

int main()
{
	int n;
	scanf("%d", &n);
	Arrayres(n);
        return 0;
}

void Arrayres(int n)
{
	if (n == 1)
	{
		printf("1");
	}
	else if (n == 2)
	{
		printf("1 2");
	}
	else
	{
		int place = 2;
		int Array[200] = {n - 2, n - 1, n, 0};
		int nn = n - 3;
		while (nn)
		{
			int x = Array[place - 1], y = Array[place];
			for (int i = place + 1; i >= 3; i--)
			{
				Array[i] = Array[i - 3];
			}
			Array[1] = x;
			Array[2] = y;
			Array[0] = nn--;
			place++;
		}
		for (int i = 0; i < n; i++)
		{
			printf("%d ", Array[i]);
		}
	}
}
分类: OJ代码