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);
原文地址:https://www.cnblogs.com/807194965lxy/p/10490870.html