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); 的功 能: 將文件內部的位置指針從新指向一個流(數據流/文件)的開頭。

相關文章
相關標籤/搜索