2019年春季学期第二周做业

1、本周完成的做业:

基础做业;
请在第一周做业的基础上,继续完成:找出给定的文件中数组的最大值及其对应的最小下标(下标从0开始)。并将最大值和对应的最小下标数值写入文件。
输入:
请创建以本身英文名字命名的txt文件,并输入数组元素数值,元素值之间用逗号分隔。
输出:
在不删除原有文件内容的状况下,将最大值和对应的最小下标数值写入文件。ios

1)实验代码

#include<stdio.h>
#include<stdlib.h>
int main()
{
    FILE *fp;
    int str[20];
    int max,index,j=0;
    
    if((fp=fopen("E:\\LiuweiA.txt","a+"))==NULL) /*打开文件*/ 
    {
        printf("File open error!\n");
        exit(0);
    }

    //文件处理(逐个读入和处理数据)
    for(int i=0;i<20;i++)
    {
        /*从文件读入数据保存到变量*/ 
                /*fscanf是有返回值的。若是返回EOF,证实到达文件结尾;*/
        if(fscanf(fp,"%d,",&str[i])==EOF){
            break;
        }
        j++;
    }
    //查找最大值str[index]; 
    index=0;
    for(int i=0;i<j;i++)
    {
        if(str[i]>str[index])
        {
            index=i;
            }   
    }
    
    //将最大值及下标写入文件
    fprintf(fp,",max=%d,index=%d",str[index],index);

    printf(" %d %d",str[index],index);

    //关闭文件
    if(fclose(fp)){
        printf("Can not clone the file! \n");
        exit(0);
    } 
    return 0;
}

2)设计思路

3)本题调试过程碰到问题及解决办法

问题1:fscanf(fp,"%d",&str[i]);,读取文件中由逗号隔开的数字时错误。数组

解决办法:在运用fprintf与fscanf时,在向文件输出数据及从文件读取数据时,分隔符应该相一致
fscanf(fp,"%d,",&str[i]);
fprintf(fp,",max=%d,index=%d,",str[index],index);
   /*若文件中数据之间的分隔符为逗号,则输入数据时以逗号为数据之间的分隔符,这样作到先后一致。   
分隔符也可采用/n,即回车符,那么程序中二句相应改成:
fprintf(fp,"%d/n",&new[i]);
fscanf(fp,"%d/n",&new[i]);函数

问题2:C语言for循环中fscanf读取当达到文件结尾时如何结束循环。学习

解决办法:fscanf是有返回值的。若是返回EOF,证实到达文件结尾;
即if(fscanf(fp,"%d,",&str[i])==EOF){
break;
}编码

4)运行结果截图









挑战做业:
给定一个整数数组(包含正负数),找到一个具备最大和的子数组,返回其最大的子数组的和设计

1)实验代码

#include<stdlib.h>
#include<stdio.h>
/*主函数*/
 int main()
 {
     FILE *fp;
     int length;//定义数组列数length
     int line;//定义数组行数line 
     int n;//定义变化后的数组的长度
     
     /*
     打开文件 
     */ 
     if((fp=fopen("E:\\LiuweiB.txt","a+"))==NULL)
     {
        printf("File open error!");
        exit(0);
     }
    
    fscanf(fp,"%d,\n%d,\n",&line,&length);
    printf("%d\n%d\n",line,length); 
     n=2*length;
     /*将数组复制一边,两数组首尾链接成一个环形*/
     int a[line][n];//初始化数组
     
     for(int i=0;i<length;i++)
     {    
        fscanf(fp,"%d,",&a[line][i]);
        printf("%d,",a[line][i]);
     }
     int max=a[line][0];
     int s=0;//定义求和后的元素
      for(int i=0;i<length;i++)
      {
         s=0;
         for(int j=i;j<length+i;j++)
         {
             s=s+a[line][j];
             if(s>max)
             {
                 max=s;
             }
         }
         a[line][length+i]=a[line][i];  //每次将已经计算过的数放到最后
      }
      printf("MAX=%d",max);
      fprintf(fp,",MAX=%d",max);
    
     //关闭文件
     if(fclose(fp)){
        printf("Can not close the file!");
        exit(0);
     } 
 
     return 0;
 }

2)设计思路

将数组复制一边,首尾链接成一个环形,从下标为0的数开始,逐个日后加,每加一个都要和最大值比较,若比最大值大,就将此时的值给最大值,当加到6个数时,中止累加,清空累加值;此时从下标为1的数开始逐个日后加,同上次方法同样,当加到6个数时,清空累加值;此时从下标为2的数开始逐个日后加……;直到下标为i-1的数累加完毕,此时该数组中全部子数组的值都已经遍历到了,获得的最大值就是最大的子数组的和。指针

3)本题调试过程碰到问题及解决办法

在参考别人的程序的时候,发现别人程序中有些代码没有学,好比<<的用法和意思
上网查知;
1.右移运算符:
C语言中两个大于号>>是右移位操做,就是把一个数的二进制形式的最右几位丢弃,最前面补原来最高位的数字(原来是0就补0;原来是1就补1)
右移运算的两个操做数应为整数类型。第一个操做数是要进行移位操做的数,第二个操做数指定第一个操做数移动的位数。若是第二个操做数等于0则不发生任何移位。运用举例:
问:计算表达式14 >> 2的值。
答:表达式14 >> 2的值为3,由于14(即二进制的00001110)向右移两位等于3(即二进制的00000011)调试

2.输入操做数:
在C++里面咱们把>>看成输入操做符,它是stream这个类里一个重要的运算符。
在C++中,有一个stream这个类,全部的I/O都以这个“流”类为基础的,包括咱们要认识的文件I/O,stream这个类有两个重要的运算符:
析取器(>>)
从流中输入数据。好比说系统有一个默认的标准输入流(cin),通常状况下就是指的键盘,因此,cin>>x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。从左操做数指定的输入流读入数据到右操做数:cin >> i 把标准输入流中的下一个值读入到i中。
和其余的函数没有什么区别。C/C++追求的就是简洁,当大量的输入须要处理的时候,咱们用函数就要这样,scanf("%d%d%d",&a,&b,&c);(假设为短整型)
.....可是用操做符的话就能够这样,cin>>a>>b>>ccode

3.转换运算符:
字符是可以使用多种不一样字符方案或代码页来表示的抽象实体。例如,Unicode UTF-16 编码将字符表示为 16 位整数序列,而 Unicode UTF-8 编码则将相同的字符表示为 8 位字节序列。公共语言运行库使用 Unicode UTF-16(Unicode 转换格式,16 位编码形式)表示字符。
举例:$array[0] = ($str >> 16 & 0xff);
表示把字符串$str转换为Unicode 16位的编码,而后存储到数组中。常见的UTF-8编码方式就是把例子中的16改为了8,表示Unicode编码,16位字符。blog

4)运行结果截图

2、学习进度条

3、学习感悟

经过此次的做业,我发现本身的知识积累太少了,写稍微难一点的题目就有点捉襟见肘,不过此次做业对我来讲有虽然难度,但经过上网查资料,不只弄懂了别人的程序,并且用本身的方法写出了本身程序,也了解获得了不少没有学到的知识,感受收获不少。
好比#include "iostream"与#include 的区别:前者先在当前目录找iostream文件,找不到再去系统头文件路径找,后者反之。所以,作为一个良好的习惯,在包含系统头文件时尽可能用<>,而在包含本身的工程中的头文件时用 好比void rewind(FILE *stream); 的功 能: 将文件内部的位置指针从新指向一个流(数据流/文件)的开头。

相关文章
相关标签/搜索