• 2019年春季学期第二周作业


    2019年春季学期第二周作业
    基础作业
    请在第一周作业的基础上,继续完成:找出给定的文件中数组的最大值及其对应的最小下标(下标从0开始)。并将最大值和对应的最小下标数值写入文件。
     输入:
    请建立以自己英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。
     输出
    在不删除原有文件内容的情况下,将最大值和对应的最小下标数值写入文件。
     
    挑战作业
    有能力的同学可以挑战一下:
    给定一个整数数组(包含正负数),找到一个具有最大和的子数组,返回其最大的子数组的和。
    具体要求参看邹欣老师博客 现代程序设计作业2
    基础作业是必做项,挑战作业作为加分项。
    以上两项作业,完成后请写好编程总结,并在博客园提交。

    编程总结要求:
    格式标准,程序正确,思路清晰(有流程图),有对自己作业的评价(存在的问题和解决办法、心得、完成作业的时间消耗),程序运行结果的截图或者效果录像。

    最初看到这个作业的时候,我的理解貌似与其他同学不同(至少和我室友不一样),所以我写了另一个东西。当然为了防止写错,两个版本我都上传了吧。

    普通作业版

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    int main(void)
    {
        FILE *fp; 
        int i,n,max; 
        char a[100];
        if((fp=fopen("D:\ocean.txt","w+"))==NULL)  //创造文件 ,并且输入数组 
        {
            printf("File opren error!
    ");
            exit(0);
        }
        scanf("%d",&n);
        fprintf(fp,"%d
    ",n);
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            fprintf(fp,"%d,",a[i]);
        }
        
        max=a[0];
        
        for(i=0;i<n;i++)
        {
            if(a[i]>=max)
            {
                max=a[i];
            }
        }
        for(i=0;i<n;i++)
        {
    
            if(a[i]==max)
            {
                break;
            }
        }
        
        fprintf(fp,"
    %d %d",max,i);
        fclose(fp);
        
        return 0; 
    }

    这个其实是有钻空子嫌疑的,我就是吧之前的代码复制了一遍,然后加了个打开文件,和输入数组的代码。

    全程之打开了一次,把题目想要看到的答案输进去罢了。

    流程图


     

    然后就是我最初的看到题目的思路了,首先题目要求创建一个文件并且输入一个数组。然后要求在不删除原有数据的情况下,将max和下标输入。

    所以我写了以下这个尽可能的从逻辑上完成题目。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    int main(void)
    {
        FILE *fp; 
        int i,x=0,y,n,max; 
        char a[100],b[100];
        if((fp=fopen("D:\ocean.txt","w+"))==NULL)  //创造文件 ,并且输入数组 
        {
            printf("File opren error!
    ");
            exit(0);
        }
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            fprintf(fp,"%d,",a[i]);
        }
        
        fclose(fp);
        
        if((fp=fopen("D:\ocean.txt","r+"))==NULL)  //读取文件数据 
        {
            printf("File opren error!
    ");
            exit(0);    
        }
        for(i=0;i<n;i++)                     //对数据进行处理 
        {
            fscanf(fp,"%d,",&y);
            b[i]=y;
        }
        
        max=b[0];
        
        for(i=0;i<n;i++)
        {
            if(b[i]>=max)
            {
                max=b[i];
            }
        }
        for(i=0;i<n;i++)
        {
    
            if(b[i]==max)
            {
                break;
            }
        }
        fclose(fp);
        //printf("%d %d",max,i);   debug
        if((fp=fopen("D:\ocean.txt","a+"))==NULL)   //将处理完的最终结果输入文件 
        {
            printf("File opren error!
    ");
            exit(0);
        }
        fprintf(fp,"
    %d %d",max,i);
        fclose(fp); 
        
    }

    首先创建文件并且输入数组。

    第二部,读取文件中我所需要的数据并且进行处理。

    第三步,重新打开文件并且在后面追加我处理后算出的max和其下标。

    流程图

    遇到的问题

    在写第一个的时候倒是没有什么问题,很顺利的写出来了,但是在写第二个的时候遇到过很多。

    首先,我最初对于fscanf的理解是非常浅显的,所以为了之读取出数字而忽略其他字符,我尝试了好多其他的办法,包括读取后在进行一次筛选。

    不过在想办法解决之前,顺便学会了一些其他的类似作用的东西,比如sscanf,fwrite,fputs,fgets等...虽然最后发现fscanf本身就可以做到删选,然后这些东西都貌似用不上就是....

    其次就是,我最后再一个东西下卡了很久,我最初以为用a+打开,就可以读取并且写入,于是我的代码就没有最后再一次打开写入那一步,而是在第而是读取后没有关闭就又写入了。我不知道是我理解有问题还是本来就这样。我尝试后发现,无论什么方式打开的文件,都只能单独进行读取 或者写入而不能两者一起进行。引以为戒。

    以下为笔记,不属于作业部分.

    fscanf(指针,"格式",变量);

    常用基本参数对照:
    %d:读入一个十进制整数.
    %i :读入十进制,八进制,十六进制整数,与%d类似,但是在编译时通过数据前置或后置来区分进制,如加入“0x”则是十六进制,加入“0”则为八进制。例如串“031”使用%d时会被算作31,但是使用%i时会算作25.
    %u:读入一个无符号十进制整数.
    %f %F %g %G : 用来输入实数,可以用小数形式或指数形式输入.
    %x %X: 读入十六进制整数.
    %o': 读入八进制整数.
    %s : 读入一个字符串,遇空字符‘'结束。
    %c : 读入一个字符。无法读入空值。空格可以被读入。
     
    sscanf(“目标区间”,“条件”,“读取后储存的变量”)
    附加格式说明字符表修饰符说明
    L/l 长度修饰符 输入"长"数据
    h 长度修饰符 输入"短"数据
    常见用法。 以下是引用片段:
           char str[512] = {0};    
           sscanf("123456 ", "%s", str); 
      printf("str=%s ", str);   
    2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。 以下是引用片段:
      sscanf("123456 ", "%4s", str); 
      printf("str=%s ", str);   
    3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。 以下是引用片段:
      sscanf("123456 abcdedf", "%[^ ]", str);
        printf("str=%s ", str);   
    4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。 以下是引用片段:
      sscanf("123456abcdedfBCDEF", "%[1-9a-z]", str);
        printf("str=%s ", str);   
    5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。 以下是引用片段:
      sscanf("123456abcdedfBCDEF", "%[^A-Z]", str);
        printf("str=%s ", str);
  • 相关阅读:
    2021年4月1日
    2021年3月31日
    2021年3月30日
    2021年3月29日
    2021年3月27日
    2021年3月26日
    2021年3月25日
    人件集阅读笔记03
    2020年3月24日
    构建之法阅读笔记02
  • 原文地址:https://www.cnblogs.com/807194965lxy/p/10490870.html
Copyright © 2020-2023  润新知