USACO1.1.1 Your Ride Is Here

来源:互联网 发布:自制名片软件下载 编辑:程序博客网 时间:2024/06/01 07:45

大家好,这是我人生中第一篇博客,希望得到大家的批评指正,在此先谢过大家~
正如题目所说,这篇文章是介绍USACO里的第一题,我想每做完一道题就把自己的感悟和收获写在博客上,把这个博客当成我的“笔记本”和“错题本”。闲话少说,直接开始吧。先上代码,然后是我的心得。

/*ID: zhenliu2PROG: rideLANG: C*/#include <stdio.h>#include <ctype.h>int hash(char * s){    int i, h;    //int k;    h = 1;    //k = 0;    for (i = 0;s[i] && isalpha(s[i]);i++)        //  h = (s[i] - 'a' + 1)*h;        //k = h % 47;        //这么做反而在循环里可以少算一步,但是循环外要多计算一次。        //下面的做法也行,每次都是用余数来计算。        h = ((s[i] - 'A'+1)*h) % 47;    return h;}int main(void){    char comet[100]="0",group[100]="0";    FILE *in, *out;    in = fopen("ride.in", "r");    out = fopen("ride.out","w");    fgets(comet,100,in);    fgets(group, 100, in);    if(hash(comet) == hash(group))        fprintf(out, "GO\n");    else        fprintf(out, "STAY\n");    fclose(in);    fclose(out);    return 0;}

心得:
1、isalpha()函数:这个函数在ctype.h中,参数是一个字符,作用是:如果参数是字母,则返回一个非0值,否则返回0值。
2、hash()函数中,我开始用的是注释掉的做法,但觉得答案中方法挺新鲜的;

h=((s[i]-'A'+1)*h)%47

这句代码我觉得不错,他是用每次计算完的余数继续运算,而不是算完了再取余。我只是觉得新鲜,如果大家还有什么看法可以为我指出来,在此先谢过。
3、既然要比较两个字符串,自然而然就想到了用两个字符数组来存值,然后调hash()函数就行,最后输出到文件中。这道题真的不难,但是我的水平很差,所以要从头做起。
4、fgets()和fscanf()的比较:两个函数都是在stdio.h中,fgets()有三个参数,作用是从第三个参数指向的文件中读取第二个参数个字符放到第一个参数中。fscanf()也是有三个参数,作用是从第一个参数指向的文件中按照第二个参数的格式读取内容赋值给第三个参数。他们之间也有不同点,首先,fgets()就是接收字符串的,而fscanf()可指定接收类型的内容。其次,也是最重要的一个点,fgets()读到空格算一个字符,读到回车就停了,而fscanf()读到空格和回车都会停。这道题的用例是用了两行来分别放字符串的,因此我认为用哪个函数都行。下面我用一个代码来解释了这个区别。

#include <stdio.h>int main(void){    char g1[100];    char f2[100];    FILE * fp1, *fp2;    fp1= fopen("1.txt","r");    fp2 = fopen("2.txt","r");    fgets(g1,sizeof(g1),fp1);    fscanf(fp2,"%s",f2);    return 0;}

代码中没有直接输出,而是通过调试看的,也希望大家多用调试来学习,这是我的老师给我的建议,也分享给大家。
为了方便大家看,我把上面那个代码中用的1.txt和2.txt文件内容都放到这里,也方便大家测试。
1.txt内容:

hello world lzzqwe aqa

2.txt内容:

hello world lz

在这道题中最大的收获就是区分了fgets()和fscanf()的异同,而hash()函数中使用余数计算的细节也让我觉得思考问题要多积累思路。
第一篇博客写完了,感谢您能看完,也希望会对您有所帮助,如果哪里有不对的地方欢迎批评指正。

原创粉丝点击