基礎做業;
請在第一週做業的基礎上,繼續完成:找出給定的文件中數組的最大值及其對應的最小下標(下標從0開始)。並將最大值和對應的最小下標數值寫入文件。
輸入:
請創建以本身英文名字命名的txt文件,並輸入數組元素數值,元素值之間用逗號分隔。
輸出:
在不刪除原有文件內容的狀況下,將最大值和對應的最小下標數值寫入文件。ios
#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; }
問題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;
}編碼
挑戰做業:
給定一個整數數組(包含正負數),找到一個具備最大和的子數組,返回其最大的子數組的和設計
#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; }
將數組複製一邊,首尾鏈接成一個環形,從下標爲0的數開始,逐個日後加,每加一個都要和最大值比較,若比最大值大,就將此時的值給最大值,當加到6個數時,中止累加,清空累加值;此時從下標爲1的數開始逐個日後加,同上次方法同樣,當加到6個數時,清空累加值;此時從下標爲2的數開始逐個日後加……;直到下標爲i-1的數累加完畢,此時該數組中全部子數組的值都已經遍歷到了,獲得的最大值就是最大的子數組的和。指針
在參考別人的程序的時候,發現別人程序中有些代碼沒有學,好比<<的用法和意思
上網查知;
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
經過此次的做業,我發現本身的知識積累太少了,寫稍微難一點的題目就有點捉襟見肘,不過此次做業對我來講有雖然難度,但經過上網查資料,不只弄懂了別人的程序,並且用本身的方法寫出了本身程序,也瞭解獲得了不少沒有學到的知識,感受收穫不少。
好比#include "iostream"與#include