问c语言编程题?
编程实现:
假设一维数组A中原有的存储内容是小写字母,要求将其数组元素转换为数字形式。
例如:原数组A[20]中内容为{a,c,b,e,t,a,t,c,c,b……},转换后为{0,1,2,3,4,0,4,1,1,2……},
转换规则是:
a------0 c------1 b------2 e------3 t------4
要求:
(1)数组长度要大于等于10;
(2)原数组A中的内容要求屏幕输入,但最多使用10个不同的小写字母,转换后的数组中的元素只使用0到9十个数字;
(3)使用数字的最大值等于转换规则的数目-1,例如原数组为{x,y,x……},则转换后为{0,1,0……},如果输出为{1,3,1……},则视为输出结果错误;
(4)输出转换后的数组,同时给出转换规则。
第二题
求划分:
在上题的基础上可以得到一个整型数组,数组元素的取值从0开始,如
a={0,1,2,0,1,1……}
要求求解上述数组的划分,算法如下:
1.选取数组元素中的最大值max和最小值min
2.建立max-min+1个数组或字符串,将第i元素a[i]放到第a[i]-min个数组或字符串中,
3.输出建立的max-min+1中每个数组中包含的元素的下角标;
例如:a={0,1,2,0,1,1,2,3,1,0}
输出结果为:
{0,9}
{1,4,5,8}
{2,6}
{7}
术语尽量低级简单 求大神帮忙!!万分感谢
先给你第一题的,百度知道的这个编辑器真的不适合粘贴代码
#include<stdio.h>
#include<string.h>
#define MAX_ARRAY_SIZE 1024
#define MAX_MAP_SIZE 10
/* 输入数组,连续输入,如:aedabcdaeas */
int inputArray(char *buff) {
int len = 0;
/* 使用fgets来防止缓冲区溢出 */
if (NULL == fgets(buff, MAX_ARRAY_SIZE, stdin)) {
return 0;
}
len = strlen(buff);
/* fgets 返回的数据可能是换行符结尾的,也可能不是,对换行符结尾的进行处理 */
if (buff[len - 1] == '\n') {
buff[len - 1] = '\0';
len -= 1;
}
return len;
}
int processArray(int len, char *chars, char *map) {
/* 保存反向映射便于查找 */
int tmap[128];
int maplen = 0;
int i = 0;
char *p = chars;
memset(tmap, -1, sizeof(int) * 128);
for (i = 0; i < len; i++) {
if (*p > 'z' || *p < 'a') {
return -*p;
}
if (tmap[*p] == -1) {
if (maplen >= MAX_MAP_SIZE) {
return -1;
}
tmap[*p] = maplen;
map[maplen] = *p;
maplen += 1;
}
*p = '0' + tmap[*p];
p++;
}
return maplen;
}
int main() {
/* 用于输入的字符数组 */
char buff[MAX_ARRAY_SIZE];
/* 用于保存转换规则的数组 */
char map[MAX_MAP_SIZE];
/* 保存字符数组长度 */
int len = 0;
int maplen = 0;
int i = 0;
len = inputArray(buff);
if (len <= 0) {
puts("Cancelled");
} else if (len < 10) {
puts("Not enough 10 chars");
} else {
maplen = processArray(len, buff, map);
if (maplen >= 0) {
puts("转换结果:");
for (i = 0; i < len; i++) {
printf("%c ", buff[i]);
}
puts("");
puts("映射规则:");
for (i = 0; i < maplen; i++) {
printf("%c -> %d\n", map[i], i);
}
puts("");
} else if (maplen == -1) {
puts("Different Chars count is OverLimit of 10");
} else if (maplen <= -2) {
printf("Unexpected char %c\n", -maplen);
}
}
return 0;
}
执行结果:
第一题审题关键:题目中的转换规则就是字母在数组中第一次出现的顺序(顺序是从0开始自增)。
(注意数字是自增数(重复字母不自增,不同字母才自增),不是第一次出现的下标,因为题目有条件:使用数字的最大值等于转换规则的数目-1)
因此代码需要实现以下功能:
一、数组输入,需要有验证(验证输入的是否是小写,可嵌套循环判断)。
二、遍历数组,生成规则列表,可用数组char B[10]和int C[10]来记录规则,B数组是字母, C是该字母对应的顺序(顺序用变量自增)。比如数组char A[10]={a,b,a,d,e,f,d,g,j,k};循环每个元素,和数组B中对比,存在就跳过,不存在就将该字母记录到B中,并将顺序变量自增后记录到C数组对应的下标元素。
三、循环AB两个数组,通过对比,把数组A中元素替换成对应C中数字(或用新数组a来保存替换结果,原因见下)。
(注意:A是字符数组,c是整型数组,把数字直接存放到A,打印输出的时候按整型打印,实际就是把数字当成ASCII码保存了,打印数字就打印ASCII码。或者一开始就把A定义成字符串数组,最后把数字用ltoa()转换成字符串再存放到A中,打印用%s格式打印)。
如要接第二题整型a数组,这里可直接把对比结果保存在int a[10]数组中(和原数组A分开)。这样a可直接用于第二题。
第二题审题:根据上题的a内容定义n个数组(n=a中最大值-a中最小值+1),之后按照题目要求填充这几个数组,最后打印即可