,程序写好后出了些有关问题,先是提示有堆有关问题,后来修改了下,就直接运行不了
求救,程序写好后出了些问题,先是提示有堆问题,后来修改了下,就直接运行不了
赶工出来的程序,目的是为了碱基测序 具体算法我用哈希表的思路了,不过也不知道写对没有,写得有点乱……
请见谅,能不能帮我看看出现什么问题了,现在已经完全运行不了了,因为我也是现学现卖写得程序,所以完全不知道现在出现了什么问题,编译没有问题,
我是用命令行参数在DOS下运行的
运行方式 程序名 文件名
第一次写好的时候提示堆的问题……我也不是很懂;然后查了资料,就随便改了下
然后第二次写好后,有关哈希算法那部分完全没运行……至少窗口里只显示了最基本的输入输出结果,也就是
printf("please tayp your 5 base to search\n");
gets(index);
printf("there isn't \"%s\"\n",index);
后来又改了改……然后第三次,恩下面就是第三次的代码……已经完全不能运行了= =
……求大家帮帮忙~我已经完全不知道怎么下手啦……谢谢各位!!!!
感激不尽!!
------解决思路----------------------
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
赶工出来的程序,目的是为了碱基测序 具体算法我用哈希表的思路了,不过也不知道写对没有,写得有点乱……
请见谅,能不能帮我看看出现什么问题了,现在已经完全运行不了了,因为我也是现学现卖写得程序,所以完全不知道现在出现了什么问题,编译没有问题,
我是用命令行参数在DOS下运行的
运行方式 程序名 文件名
第一次写好的时候提示堆的问题……我也不是很懂;然后查了资料,就随便改了下
然后第二次写好后,有关哈希算法那部分完全没运行……至少窗口里只显示了最基本的输入输出结果,也就是
printf("please tayp your 5 base to search\n");
gets(index);
printf("there isn't \"%s\"\n",index);
后来又改了改……然后第三次,恩下面就是第三次的代码……已经完全不能运行了= =
……求大家帮帮忙~我已经完全不知道怎么下手啦……谢谢各位!!!!
/* test.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DNAINDEX 5
#define K 5
int trans(char);
unsigned int hash(int,int);
typedef struct _node{
char key[K];
long dna;
int base;
struct _node *next;
}node;
#define HASHSIZE 50
int main(int argc,char *argv[])
{
char base[DNAINDEX][100];
FILE *fp;
long i;
int j;
char index[K];
char words[K];
node *current,*prev;
node *hashtab[HASHSIZE];
if(argc<2)
{
fprintf(stderr,"Usage:%s filename\n",argv[0]);
exit(1);
}
if((fp=fopen(argv[1],"rb"))==NULL)
{
fprintf(stderr,"I couldn't open the file \"%s\"\n",argv[1]);
exit(2);
}
//read the file
for(i=0;i<DNAINDEX;i++)
{
fseek(fp,51L,SEEK_CUR);
for(j=0;j<100;j++)
{
base[i][j]=getc(fp);
}
fseek(fp,2L,SEEK_CUR);
}
//clean the hashtab
int c;
for(c=0;c<HASHSIZE;c++)
hashtab[c]=NULL;
//build the hashtab
for(i=0;i<DNAINDEX;i++)
{
for(j=0;j<100-K+1;j++)
{
int bulidh=0;
for(int k=1;k<=5;k++)
{
int s=0;
s=trans(base[i][j+k-1]);
bulidh=bulidh+hash(s,k);
}
for(k=0;k<5;k++)
{
words[k]=base[i][j+k];
}
current=(node*)malloc(sizeof(node));
if(hashtab[bulidh]==NULL)
hashtab[bulidh]=current;
else
prev->next=current;
current->next=NULL;
for(int w=0;w<K;w++)
current->key[w]=words[w];
current->dna=i;
current->base=j;
prev=current;
}
}
//search
printf("please tayp your 5 base to search\n");
gets(index);
int searchh=0;
for(int k=1;k<=5;k++)
{
int s=0;
s=trans(index[k-1]);
searchh=searchh+hash(s,k);
}
current=hashtab[searchh];
while(current->next!=NULL)
{
if(strcmp(current->key,index)==0)
{
printf("base:%10s,dnaloc:%10d,baseloc:%5d\n",
current->key,current->dna,current->base);
}
current=current->next;
}
printf("there isn't \"%s\"\n",index);
//clean
for(int hc=0;hc<HASHSIZE;hc++)
{
if(hashtab[hc]!=NULL)
{
current=hashtab[hc];
while(current!=NULL)
{
free(current);
current=current->next;
}
}
}
printf("Bye!\n");
return 0;
}
//transform 'A''C''G''T' into 1,2,3,4
int trans(char ch)
{
int a;
switch (ch)
{
case 'A':
a=1;
break;
case 'C':
a=2;
break;
case 'G':
a=3;
break;
case 'T':
a=4;
break;
default:
break;
}
return a;
}
//find the hash
unsigned int hash(int s,int k)
{
unsigned int h=0;
h=s*k;
return h;
}
------解决思路----------------------
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。