当前位置: 代码迷 >> C语言 >> [讨论]第七次编程题目,大家支持一下
  详细解决方案

[讨论]第七次编程题目,大家支持一下

热度:156   发布时间:2007-03-11 14:25:37.0
回复:(nuciewth)[讨论]第七次编程题目,大家支持一下...

发错了

[此贴子已经被作者于2007-3-11 14:26:34编辑过]


----------------解决方案--------------------------------------------------------

第一题:
#include<stdio.h>
#include<conio.h>
#define N 4
int main(void)
{
int i,j,m,n=0;
short int a_i[50]={0};
char b[N][251]={0},a[50]; /*a[]作用为输入缓冲区*/

for(m=0;m<N;m++)
{ gets(a);
for(i=0;a[i];i++)
{
if(a[i]=='@')
a_i[i]=-1;
if(a[i]=='#')
a_i[i]=-2;
}

for(i--;i>-1;i--)
{
if(a_i[i]==-1)
{
for(j=i;j>-1;j--)
a_i[j]=-3;
}
}

for(i=0;a[i];i++)
{

if(a_i[i]==-2)
{
for(j=i;a_i[j]==-2;j++)
{n++;
a_i[j]=-3;}
for(j=i-1;j>-1&&n;j--)
{
if(a_i[j]>-1)
{a_i[j]=-3;n--;}
}
}
n=0;
}
n=0;
j=0;
for(i=0;a[i];i++)
if(a_i[i]>-1)
{
b[m][j]=a[i];
j++;
}

for(i=0;a[i];i++)
a_i[i]=0;
}

puts("**************************");
for(i=0;i<N;i++)
printf("%s\n",b[i]);
getch();

}

[此贴子已经被作者于2007-3-11 16:29:21编辑过]


----------------解决方案--------------------------------------------------------
大家讨论的差不多的时候,我把自己写的贴出来.大家继续啊
----------------解决方案--------------------------------------------------------

楼上的,我大致的明白你的算法了,但是我觉得有点不对
比如说我输入以下的数据:
dddd.......ddd(51个d)@d
d
d
d
那么输出应该是:
d
d
d
d
才是
而你的输出是
(空的)
d
d
d


----------------解决方案--------------------------------------------------------
以下是引用crackerwang在2007-3-11 18:26:42的发言:

楼上的,我大致的明白你的算法了,但是我觉得有点不对
比如说我输入以下的数据:
dddd.......ddd(51个d)@d
d
d
d
那么输出应该是:
d
d
d
d
才是
而你的输出是
(空的)
d
d
d

说错了,我说的是楼上的楼上,刚好斑竹比我快了那么几秒提交


----------------解决方案--------------------------------------------------------
改为这个关系。
short int a_i[251]={0};
char b[N][251]={0}, a[251] /*a[]作用为输入缓冲区*/

[此贴子已经被作者于2007-3-11 18:45:27编辑过]


----------------解决方案--------------------------------------------------------
如果要处理范围和输入问题,程序不会几十行解决。
----------------解决方案--------------------------------------------------------

呵呵,终于弄出来第一题了


----------------解决方案--------------------------------------------------------

我觉得你要是想用数组来做缓冲同时还想一次处理是不可能做的到的,
我是这样想的,但是也有问题,至少我对输入范围没有限制
#include<stdio.h>//这里只处理一个数组
int main()
{
char a[251];
int i;
i=0;
while(251)
{
a[i]=getche();//我使用getche()直接从控制台读取,因为我是一个一个字符的处理,要是用getchar必须回车
if(a[i]=='\n') //这个就是我的问题所在,我本来是想在这里做一个一行输入结素的判断,
break; //后来发现getche()对回车很感冒
a[i+1]='\0'; //这个都是用来标志数组结尾的
if(a[i]=='#') //代表要是输入的是#就退一个元素写入
{
i-=2;
a[i+1]='\0';
}
if(a[i]=='@')//输入的是@就从新输入
{
i=-1;
a[0]='\0';
}
i++;
if(i==10)
break;
}
printf("\n");
for(i=0;i<10;i++)
printf("%c ",a[i]);
getch();
return(0);
}
有谁能告诉我怎么样输入回车跳出循环?


----------------解决方案--------------------------------------------------------
以下是引用无玩过界在2007-3-11 18:43:11的发言:
改为这个关系。
short int a_i[251]={0};
char b[N][251]={0}, a[251] /*a[]作用为输入缓冲区*/

那要是我输入的是
ddd......dd(240个)@ddd...d(240个)
你觉得你的输出是什么?
我觉得你的输出应该是:
dd..d(10个)应为你读取只到@后10个d
显然答案不对


----------------解决方案--------------------------------------------------------
  相关解决方案