iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
自我挑戰組

C++30日挑戰之旅系列 第 14

DAY14 pointer與一維動態陣列

  • 分享至 

  • xImage
  •  

題目:

輸入為in檔案(in內容為英文文章),檔案大小為n。利用動態陣列產生一個n的char陣列將in全部內容讀到該陣列
srand(100);//固定使用100為seed

產生50個1~n的亂數,將每一個亂數位置的字元輸出到out

input:in檔內容為英文文章(英文字母&空白&換行)
output:out檔內產生50個1~n的亂數,將每一個亂數位置的字元輸出到out


解法

#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;

int main()
{
     long begin, end, size;
     ifstream file("1.in");
     begin = file.tellg();//開頭位置讀數
     file.seekg(0, ios::end);//檔案移到最後
     end = file.tellg();//最後位置讀數
     file.close();
     size = (end - begin);//相減為size

     ifstream inStream;
     ofstream outStream;
     inStream.open("1.in");
     outStream.open("1.out");

     char s;
     char *p1;
     p1 = new char[size];
     for (int i = 0; i < size; i++)
     {
          inStream.get(s);
          p1[i] = s;
     }

     srand(100);
     int x;

     for (int j = 0; j < 50;j++)
     {    
          x= rand() % size + 1;
          outStream << p1[x-1];
     }


     inStream.close();
     outStream.close();
}

解釋與詳細介紹

第一部分:pointer介紹

這裡要先介紹一個新的名詞--"pointer(指標)"。他是一個可以儲存"記憶體位址"的變數型態。一般我們的變數是儲存一個對應的代表值,如整數、字串、小數等,而"記憶體位址"可以想像成他在記憶體上的地址,在編譯器翻譯程式後可以藉由最終記憶體上的位址去讓機器執行程式。簡單舉個例子,假設有一個變數n

n的值為10
n的位址為0x61febc

可以看到位址的組成會包含英數字的多位數,平常我們可以用&變數的方式如:

int n = 10;
cout<<&n;//輸出位址值

而在程式中表示pointer的方式是以*的方式,呈上題變數n,舉例而言

int *p = &n;
cout << *p;//會輸出10
cout << p;//會輸出0x61febc,用p來做為"位址的變數"(即:指標變數)

而我們在程式中需要指標的原因是因為,我們需要運用它來達成動態分配記憶體。

第二部分:主功能解析-前置設定

     long begin, end, size;
     ifstream file("in");
     begin = file.tellg();//開頭位置讀數
     file.seekg(0, ios::end);//檔案移到最後
     end = file.tellg();//最後位置讀數
     file.close();
     size = (end - begin);//相減為size

     ifstream inStream;
     ofstream outStream;
     inStream.open("in");
     outStream.open("out");

先設定好需要的變數與設定in檔的讀寫,而seekgtellg的部分對inStream的設定,使讀取檔案的頭到尾,且計算出空間值。

第三部分:主功能解析-動態記憶體設置

     char s;
     char *p1;
     p1 = new char[size];//設置動態記憶體
     for (int i = 0; i < size; i++)
     {
          inStream.get(s);//讀取單個字
          p1[i] = s;
     }

這裡我們用pointer來令"動態"字元陣列(動態就是不先給予空間值,執行後存入多少算多少記憶體的方法,有助於節省記憶體空間)。動態陣列的列取方式是以new的方式定義其位址,結合迴圈將大小寫入來定義。

第四部分:主功能解析-亂數設定與收尾

srand(100);
     int x;

     for (int j = 0; j < 50;j++)//空間為50
     {    
          x= rand() % size + 1;//取文章空間的隨機值
          outStream << p1[x-1];//將值輸出到out
     }


     inStream.close();
     outStream.close();

最後再將x設為以in檔空間大小的隨機亂數並輸出到out檔中,並作結尾的close()。


第五部分:成果展示

in檔:
https://ithelp.ithome.com.tw/upload/images/20220915/201515935cXA6fghqj.png

文字內容:At X, projects prototype, experiment and iterate to derisk their moonshot technologies and build the foundation for a strong business. When the signals are right, projects move on from the Factory to the next stage of their journey.

out檔:
https://ithelp.ithome.com.tw/upload/images/20220915/20151593m6IO7wxMn9.png

有沒有覺得用pointer達成動態的儲存方式很神奇呢?那我們明天見~(´,,•ω•,,)

參考資料:

  1. https://openhome.cc/Gossip/CppGossip/Pointer.html
  2. https://www.796t.com/content/1548117937.html
  3. https://x.company/projects/

上一篇
DAY13 比對檔案的技巧(下)
下一篇
DAY15 stucture介紹與設計成績單(上)
系列文
C++30日挑戰之旅43
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言