有一个程序求高手帮忙修改一下,小弟实在分数紧张。解决后必加分感谢

zhangyongnihao1 2009-06-27 12:33:20
#include <stdio.h>
#include <string.h>

#define MAX_NUM (100)
#define MAX_LEN (4)

enum
{
I, V, X, L, C, N
};


char *roam1[] = {"", "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix" };
char *roam10[] = {"", "x", "xx", "xxx", "xl", "l", "lx", "lxx", "lxxx", "xc", "c" };

int total[N];

unsigned int inputs[MAX_NUM];
int nums = 0;

int input()
{
printf("Input:\n");

while (1)
{
scanf("%u", &inputs[nums]);
if (inputs[nums] == 0)
{
return 0;
}
else if (inputs[nums] <= 100)
{
nums++;
}
}

return 0;
}

int count(int n)
{
char sz_roam[32];
int i, j;

memset(total, 0, sizeof(total));

for (i = 1; i <= inputs[n]; i++)
{
sprintf(sz_roam, "%s%s", roam10[i / 10], roam1[i % 10]);

for (j = 0; sz_roam[j]; j++)
{
switch (sz_roam[j])
{
case 'i':
total[I]++;
break;
case 'v':
total[V]++;
break;
case 'x':
total[X]++;
break;
case 'l':
total[L]++;
break;
case 'c':
total[C]++;
break;
}
}
}
return 0;
}

int output()
{
int n;

printf("\nOutput:\n");
for (n = 0; n < nums; n++)
{
count(n);
printf("%u: %d i, %d v, %d x, %d l, %d c\n", inputs[n], total[I], total[V], total[X], total[L], total[C]);
}

return 0;
}

int main()
{
input();
output();

getchar();
return 0;
}
这个程序在运行时没有错误但是就是不能输出所要的结果,
这道题大致就是吧所出入的数字改换成罗马字符,在统计相应罗马字符个数
比如输入1就是‘i’,2就是‘i’‘ii’,5就是从‘i’‘ii’到‘iv’‘v’十就是自‘i’到‘x’,50是‘l’100是‘c’
统计出现的‘i v x c 的个数然后输出。
...全文
105 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
logiciel 2009-06-29
  • 打赏
  • 举报
回复
函数input没有对输入数据个数nums进行范围检查。当nums==MAX_NUM后再读入数据将使inputs的下标超出范围.
zhangyongnihao1 2009-06-28
  • 打赏
  • 举报
回复
上面的题的意思就是当你输入的是5时统计的是1 2 3 4 5 中所有i v x l c的个数,而不是只统计一个数字 。我想大家都理解错了吧。
logiciel 2009-06-27
  • 打赏
  • 举报
回复
6楼ljljlj的代码是正确的,我刚才也做了类似的修改.

LZ代码的主要错误是:

1 在函数output中已经对输入个数循环,而在函数count中又进行了类似的循环

2 在函数count中的计算对象不是输入数据inputs[n]而是循环变量i.

建议LZ在输入时还加以下语句进行提示:

else if (inputs[nums] <= 100)
{
nums++;
}
else //加以下提示
{
printf("This input number is ignored as it is > 100\n");
}
geekblizzarddc 2009-06-27
  • 打赏
  • 举报
回复
请楼主举个例子说明错误在哪?
geekblizzarddc 2009-06-27
  • 打赏
  • 举报
回复
运行结果貌似没错啊
ljhhh0123 2009-06-27
  • 打赏
  • 举报
回复
sorry,我刚才理解成统计所有的罗马字符出现的次出,
这次改成你输入的每个数字含的各罗马字符出现的次出。
#include <stdio.h>
#include <string.h>

#define MAX_NUM (100)
#define MAX_LEN (4)

enum
{
I, V, X, L, C, N
};


char *roam1[] = {"", "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix" };
char *roam10[] = {"", "x", "xx", "xxx", "xl", "l", "lx", "lxx", "lxxx", "xc", "c" };

int total[N];

unsigned int inputs[MAX_NUM];
int nums = 0;

int input(void)
{
printf("Input:\n");

while (1)
{
fflush(stdin);
scanf("%u", &inputs[nums]);
if (inputs[nums] == 0)
{
return 0;
}
else if (inputs[nums] <= 100)
{
nums++;
}
}

return 0;
}

int count(int n)
{
char sz_roam[32];
int i, j;

memset(total, 0, sizeof(total));

i = inputs[n];
sprintf(sz_roam, "%s%s", roam10[i / 10], roam1[i % 10]);

for (j = 0; sz_roam[j]; j++)
{
switch (sz_roam[j])
{
case 'i':
total[I]++;
break;
case 'v':
total[V]++;
break;
case 'x':
total[X]++;
break;
case 'l':
total[L]++;
break;
case 'c':
total[C]++;
break;
}
}
printf("%u: %d i, %d v, %d x, %d l, %d c\n", inputs[n], total[I], total[V], total[X], total[L], total[C]);

return 0;
}

int output(void)
{
int n;

printf("\nOutput:\n");
for (n = 0; n < nums; n++)
{
count(n);
}

return 0;
}

int main()
{
input();
output();

//getchar();
return 0;
}
ljhhh0123 2009-06-27
  • 打赏
  • 举报
回复
我删了你的几个不必要的循环,和一个每次都把以前的数都清0的memset.
#include <stdio.h>
#include <string.h>

#define MAX_NUM (100)
#define MAX_LEN (4)

enum
{
I, V, X, L, C, N
};


char *roam1[] = {"", "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix" };
char *roam10[] = {"", "x", "xx", "xxx", "xl", "l", "lx", "lxx", "lxxx", "xc", "c" };

int total[N];

unsigned int inputs[MAX_NUM];
int nums = 0;

int input(void)
{
printf("Input:\n");

while (1)
{
fflush(stdin);
scanf("%u", &inputs[nums]);
if (inputs[nums] == 0)
{
return 0;
}
else if (inputs[nums] <= 100)
{
nums++;
}
}

return 0;
}

int count(int n)
{
char sz_roam[32];
int i, j;



i = inputs[n];
sprintf(sz_roam, "%s%s", roam10[i / 10], roam1[i % 10]);

for (j = 0; sz_roam[j]; j++)
{
switch (sz_roam[j])
{
case 'i':
total[I]++;
break;
case 'v':
total[V]++;
break;
case 'x':
total[X]++;
break;
case 'l':
total[L]++;
break;
case 'c':
total[C]++;
break;
}
}

return 0;
}

int output(void)
{
int n;

printf("\nOutput:\n");
for (n = 0; n < nums; n++)
{
count(n);
}
printf("%u: %d i, %d v, %d x, %d l, %d c\n", inputs[n], total[I], total[V], total[X], total[L], total[C]);

return 0;
}

int main()
{
input();
output();

//getchar();
return 0;
}
ltc_mouse 2009-06-27
  • 打赏
  • 举报
回复
是不是输入格式不对? 这个程序是可以输入一串数字(数字之间以空格、回车分隔)的,以0结尾~ 即,输入0之后,才开始输出...
zhangyongnihao1 2009-06-27
  • 打赏
  • 举报
回复
我也觉得没问题,我就是输了一个两位的数
子啊就是不出结果啊
qqwx_1986 2009-06-27
  • 打赏
  • 举报
回复

char sz_roam[32];
int i, j;

memset(sz_roam, 0, sizeof(sz_roam));
ltc_mouse 2009-06-27
  • 打赏
  • 举报
回复
楼主是用什么数,没有得到正确结果呢? 算法似乎没有问题啊...

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧