本週沒上課,可是請你們不要忘記學習。
本週請你們完成上週挑戰做業的第一部分:給定一個整數數組(包含正負數),找到一個具備最大和的子數組,返回其最大的子數組的和。
例如:[1, -2, 3, 10, -4, 7, 2, -5]的最大子數組爲[3, 10, -4, 7, 2]
輸入:
請創建以本身英文名字命名的txt文件,並輸入數組元素數值,元素值之間用逗號分隔。
輸出
在不刪除原有文件內容的狀況下,將最大子數組以及子數組的和寫入文件。ios
#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>>c
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位字符。函數
上三角矩陣指主對角線如下的元素都爲0的矩陣;主對角線爲從矩陣的左上角至右下角的連線。
本題要求編寫程序,判斷一個給定的方陣是否上三角矩陣。
輸入格式:
輸入第一行給出一個正整數T,爲待測矩陣的個數。接下來給出T個矩陣的信息:每一個矩陣信息的第一行給出一個不超過10的正整數n。隨後n行,每行給出n個整數,其間以空格分隔。
輸出格式:
每一個矩陣的判斷結果佔一行。若是輸入的矩陣是上三角矩陣,輸出「YES」,不然輸出「NO」。
輸入樣例:學習
2 3 1 2 3 0 4 5 0 0 6 2 1 0 -8 2
輸出樣例:編碼
YES NO
#include<stdio.h> int main() { int t,n; int str[10][10]; int f[10];//判斷是否爲上三角形矩陣 //輸入須要判斷的矩陣個數 scanf("%d",&t); f[t]; for(int k=0;k<t;k++){ f[k]=1; //輸入矩陣信息 scanf("%d",&n); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&str[i][j]); } } //判斷 for(int i=0;i<n;i++){ for(int j=0;j<i;j++){ if(str[i][j]!=0){ f[k]=0;//儲存判斷結果 } } } } //輸出 for(int k=0;k<t;k++){ if(f[k]){ printf("YES\n"); }else{ printf("NO\n"); } } return 0; }
問題:題目看錯啦,我覺得n在循環外面只輸入一次,每一個矩形是連續輸入的,中間不輸入n,因此就用三維矩陣的方法去作。
解決辦法:隔了一天,再看仔細題目,發現本身想複雜了,再從新作,沒有碰到問題。設計
感悟:對多維數組有一點的理解,可以熟練的運用二維數組解決問題。
經過此次的做業,我發現本身的知識積累太少了,寫稍微難一點的題目就有點捉襟見肘,不過此次做業對我來講有雖然難度,但經過上網查資料,不只弄懂了別人的程序,並且用本身的方法寫出了本身程序,也瞭解獲得了不少沒有學到的知識,感受收穫不少。
好比#include "iostream"與#include的區別:前者先在當前目錄找iostream文件,找不到再去系統頭文件路徑找,後者反之。所以,作爲一個良好的習慣,在包含系統頭文件時儘可能用<>,而在包含本身的工程中的頭文件時用
好比void rewind(FILE *stream); 的功 能: 將文件內部的位置指針從新指向一個流(數據流/文件)的開頭。指針