c题目

禽兽猿 2013-04-17 07:50:34
题目如下:编写函数
void written_amount(unsigned int amount,char *buffer);
它把amount表示的值转换为单词形式,并储存于buffer中。这个函数可以在一个打印支票的程序中使用。例如,如果amount的值是16312,那么buffer中存储的字符串应该是
SIXTEEN THOUSAND THREE HUNDRED TWELVE
有些值可以用两种不同的方法进行打印,例如,1200可以是ONE THOUSAND TWO HUNDRED或TWELVE HUNDRED。你可以选择一种你喜欢的模式。
代码如下,不知道哪里错了,刚学的东西,很多不理解,可能有不要的代码,如果可以简写代码页帮忙看下,谢谢~
#include<stdio.h>
#include<string.h>
#include<math.h>
#define B 1000000000
#define M 1000000
#define T 1000
#define H 100
char *unit(int n);
char *teen(int n);
char *ty(int n);
char *nchar(int n);
void amount_string(int n, char *buffer);
static char *number_string1[10] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight",
"nine"};
static char *number_string2[10] = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen",
"eighteen", "ninteen"};
static char *number_string3[8] = {"twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
int kk[4] = {B, M, T, H};
char *number_string4[4] = {" billion", " million", " thousand", " hundred"};
main(){
int n;
scanf("%d", &n);
char buf[100] = "", *buffer;
buffer = buf;
amount_string(n, buffer);
}
void amount_string(int n, char *buffer){
int i = 0;
int b = 0;
char buf[] = "";
buffer = buf;
if(n == 0){
puts(unit(0));
strcat(buf, unit(0));
}
else{
for(i = 0; i < 3; i++){
b = n / kk[i];
if(b != 0){
strcat(strcat(buf, nchar(b)), number_string4[i]);
n = n % kk[i];
if(n != 0){
strcat(buf, " and ");
}
}
}
}
puts(buffer);
}
char *unit(int n){
return number_string1[n];
}
char *teen(int n){
return number_string2[n - 10];
}
char *ty(int n){
return number_string3[n - 2];
}
char *nchar(int n){ //n是一个1000以下的数值
char gg[] = "";
char *g;
g = gg;
int lll = 0, k = 0, temp = 0;
if(n >= H){
strcat(strcat(gg, unit(n / H)), " hundred");
lll = n % H;
if(lll != 0){
strcat(gg, " and ");
if(lll >= 20){
temp = lll / 10;
strcat(gg, ty(temp));
k = lll % 10;
if(k != 0){
strcat(strcat(gg, "-"), unit(k));
}
}
else if(lll >= 10){
strcat(gg, teen(lll));
}
else{
strcat(gg, unit(lll));
}
}
}
else if(n >= 20){
temp = n / 10;
strcat(gg, ty(temp));
k = n % 10;
if(k != 0){
strcat((strcat(gg, "-")), unit(k));
}
}
else if(n >= 10){
strcat(gg, teen(n));
}
else if(n > 0){
strcat(gg, unit(n));
}
else{
strcat(gg, unit(n));
}
return g;
}
...全文
244 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-04-18
  • 打赏
  • 举报
回复
http://www.codeproject.com/Articles/286999/Generic-Number-to-from-Word-Converter
fox_carnival 2013-04-18
  • 打赏
  • 举报
回复
你尝试的那段也会报错的。和数组越界道理差不多,不要抱侥幸心理去使用没有分配给你的空间。
ForestDB 2013-04-17
  • 打赏
  • 举报
回复
问题的解决从代码的格式化开始。 你看到的那个C++的程序,其实用C写也没什么区别,思想是相同的,只是懒得做资源管理,所以用C++来描述问题的解决思路。
fox_carnival 2013-04-17
  • 打赏
  • 举报
回复
致命错误:amount_string和nchar函数中的buf和gg数组定义没有长度,会导致崩溃。 另外,你假定n为某一个值,例如9,然后自己读一下程序,或者画个流程图,看看程序是如何运行的,再去改正实现上的错误。
无间虚者 2013-04-17
  • 打赏
  • 举报
回复
这里没有真大虾。。。
禽兽猿 2013-04-17
  • 打赏
  • 举报
回复
大虾帮忙!!都弄很久了,还是不懂。
禽兽猿 2013-04-17
  • 打赏
  • 举报
回复

怎么输出了结果,说明已经执行到后面了,还会提示在上面哪行运行,还出现错误!!
禽兽猿 2013-04-17
  • 打赏
  • 举报
回复
你帮我复制代码,用debug看下,我英语不过关,看不懂调试信息。
禽兽猿 2013-04-17
  • 打赏
  • 举报
回复
引用 9 楼 fox_carnival 的回复:
是的,如果作为第一个参数的数组空间不够,是没法存放连接后的字符串的

这个怎么判断?
我测试了下,第一个字符串定义的空间不大也可以连接上去的
fox_carnival 2013-04-17
  • 打赏
  • 举报
回复
是的,如果作为第一个参数的数组空间不够,是没法存放连接后的字符串的
禽兽猿 2013-04-17
  • 打赏
  • 举报
回复
引用 6 楼 fox_carnival 的回复:
你用strcat函数进行字符串连接,连接得到的字符串放哪里?
strcat的结果是存到第一个变量的吧?
PicDog 2013-04-17
  • 打赏
  • 举报
回复
#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <windows.h>#include <time.h>typedef struct node{int x;int y;struct node *next;}node,*linklist;typedef struct{linklist front;linklist rear;int length;}line;line snake;void coord(int x,int y){COORD num;num.X=y;num.Y=x;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), num);}void show_food()//随机化食物位置{ linklist p; srand(time(NULL));//随机种子 while(1){ snake.front->x = rand() %13+2; snake.front->y = rand() %27+2; p = snake.front->next; //防止食物出现在蛇内部 while(p){ if(snake.front->x == p->x && snake.front->y == p->y){ break; } else{p=p->next;} } if( !p){ break; } } coord(snake.front->x,snake.front->y); putchar('@');//食物}void game_imformation()//显示游戏信息{ coord(3,60); printf("当前蛇长度: %d",snake.length); coord(5,60); printf(" "); coord(5,60); printf("离胜利还差: %d",20-snake.length); coord(10,55); puts("上,下,左,右:w,s,a,d");}void in_line(int x,int y)//入队{linklist p;p=(linklist)malloc(sizeof(node));p->x=x;p->y=y;snake.rear->next = p;snake.rear=p;p->next=NULL;snake.length++;}void out_line()//出队{linklist p=snake.front;p->next->x=p->x;p->next->y=p->y;snake.front=snake.front->next;snake.length--;free(p);}void destroy_queue()//销毁队列{ linklist p; while(p = snake.front){ snake.front = snake.front->next; free(p); }}void snake_shape()//初始化蛇{int i;snake.rear=snake.front=(linklist)malloc(sizeof(node));snake.rear->next=NULL;snake.length=0;for(i=0;i<3;i++){in_line(2,i+4);}}void draw_snake(int i)//画蛇{linklist p;p=snake.rear;coord(p->x,p->y);if(i){ putchar('*'); }else{ putchar('@'); }}void clear_snake_tail(){linklist p = snake.front->next;coord(p->x,p->y);putchar(' ');p=p->next;coord(p->x,p->y);putchar('~');}void snake_auto_move(char run)//实现蛇的自动移动{void draw_wall();/*void snake_auto_comand();*/int x,y; do{clear_snake_tail();draw_snake(1);x=snake.rear->x;y=snake.rear->y;switch(run){ case 'w': x--;break; case 's': x++;break; case 'a': y--;break; case 'd': y++;}in_line(x,y);if(snake.front->x==x&&snake.front->y==y)//蛇捕捉食物{show_food(); game_imformation();}else{out_line(); }draw_snake(0);if(snake.rear->x>15){snake.rear->x-=15; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');game_imformation();}if(snake.rear->y>27){snake.rear->y-=25; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');game_imformation();}if(snake.rear->x<1){snake.rear->x+=16; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');game_imformation();}if(snake.rear->y<1){snake.rear->y+=28; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');game_imformation();}
Sleep(200);/*snake_auto_comand();*/}while(!_kbhit());}/*typedef struct node2{int x;int y;struct node2 *next;}node2,*linklist2;typedef struct{linklist2 front;linklist2 rear;int length;}line2;line2 snake2;void in_line2(int x,int y)//2蛇入队{linklist2 p;p=(linklist2)malloc(sizeof(node2));p->x = x;p->y = y;snake2.rear->next = p;snake2.rear = p;p->next = NULL;snake2.length++;}void out_line2()//2蛇出队{linklist2 p = snake2.front;p->next->x = p->x;p->next->y = p->y;snake2.front = snake2.front->next;snake2.length--;free(p);}void snake_shape2()//2蛇初始化蛇{int i;snake2.rear = snake2.front = (linklist2)malloc(sizeof(node2));snake2.rear->next = NULL;snake2.length = 0;for(i=0;i<3;i++){in_line2(10,i+4);}}void draw_snake2(int i)//2蛇画蛇{linklist2 p;p=snake2.rear;coord(p->x,p->y);if(i){ putchar('*'); }else{ putchar('%'); }}void clear_snake_tail2(){linklist2 p = snake2.front->next;coord(p->x,p->y);putchar(' ');p=p->next;coord(p->x,p->y);putchar('-');}void snake_auto_move2(char run)//2蛇实现蛇的自动移动{void draw_wall();int x,y;clear_snake_tail2();draw_snake2(1);x=snake2.rear->x;y=snake2.rear->y;switch(run){ case 'w': x--;break; case 's': x++;break; case 'a': y--;break; case 'd': y++;}in_line2(x,y);if(snake2.front->x==x&&snake2.front->y==y)//2蛇捕捉食物{show_food();}else{out_line2(); }draw_snake2(0);Sleep(200);}void snake_auto_comand()//第二条蛇的自动控制{int p,p2;char temp,temp2;srand((unsigned)time(NULL));while(1){p=rand()%2+1;p2=rand()%2+1;switch(p){case 1:temp='w';break; case 2:temp='s';break;}switch(p2){ case 1:temp2='a';break; case 2:temp2='d';}break;}snake_auto_move2(temp);
snake_auto_move2(temp2);
if(snake2.rear->x>15){snake2.rear->x-=15; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');}if(snake2.rear->y>27){snake2.rear->y-=26; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');}if(snake2.rear->x<1){snake2.rear->x+=15; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');}if(snake2.rear->y<3){snake2.rear->y+=27; system("cls");draw_wall();coord(snake.front->x,snake.front->y);putchar('@');}}*/void draw_wall(){int k;printf(" ———————————————\n");for(k=1;k<=15;k++) { coord(k,0);printf("│");}for(k=1;k<=16;k++) { coord(k,30);printf("│");}coord(16,0);printf(" ———————————————\n");}
void snake_play_move()//play控制蛇{char c;static char temp=0;if(!temp){temp='d';snake_auto_move(temp);}while(1){c=getch();if(c=='w'||c=='a'||c=='s'||c=='d'){if((temp=='w'&&c=='s')||(temp=='s'&&c=='w')||(temp=='d'&&c=='a')||(temp=='a'&&c=='d'))//防止按相反方向{snake_auto_move(temp);continue;}break;}snake_auto_move(temp);}temp = c; snake_auto_move(temp);
}int judge()//判断失败与否不足!!!还不能正常运作。{ linklist k;//碰到自身 k=snake.front->next; while(snake.rear!=k){ if(snake.rear->x==k->x && snake.rear->y==k->y) {system("cls"); coord(5,25); puts("GAME OVER!!!"); destroy_queue(); getch(); exit(0);} else {k=k->next;} } }void main(){draw_wall();snake_shape(); game_imformation();/*snake_shape2();*/show_food();while(judge()){snake_play_move();}}
fox_carnival 2013-04-17
  • 打赏
  • 举报
回复
你用strcat函数进行字符串连接,连接得到的字符串放哪里?
禽兽猿 2013-04-17
  • 打赏
  • 举报
回复
引用 4 楼 fox_carnival 的回复:
致命错误:amount_string和nchar函数中的buf和gg数组定义没有长度,会导致崩溃。 另外,你假定n为某一个值,例如9,然后自己读一下程序,或者画个流程图,看看程序是如何运行的,再去改正实现上的错误。
我在初始化的时候已经是赋值了"",可以不定义大小吧?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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