顯示具有 C程式設計 標籤的文章。 顯示所有文章
顯示具有 C程式設計 標籤的文章。 顯示所有文章

2025年6月29日 星期日

AI時代的程式學習思維

 在 AI 時代學習程式設計,我認為我們應該建立一種全新的學習心態。像 ChatGPT 這類生成式 AI 工具,雖然已經被廣泛運用在編程中,但這並不表示我們可以完全依賴它。對初學者來說,最重要的是先培養獨立思考與動手實作的能力,透過親自寫程式來熟悉邏輯與架構。當有了一定基礎之後,再適時引入 AI 工具來協助學習與優化,才能真正建立起紮實的能力。

雖然 AI 功能越來越強大,但在處理複雜、非結構化的大型程式碼,或是在除錯過程中,仍然存在許多限制。因此,我們人類的優勢,應該更加著重於高層次的系統思考、問題分析,以及與他人協作與溝通的能力。

我鼓勵每位學習者,不只是把自己當成「寫程式的人」,而是要用「專案經理」的角色來看待自己的學習與應用。學會整合 AI 資源、分析問題、運用適當工具來解決真實世界的挑戰,這才是程式設計的真正價值所在。

至於資料結構與演算法,我更傾向將它們視為一種「解決問題的思維模式」,而不只是考試科目。像是 Google 地圖預測即時交通狀況,就是結合了資料結構、演算法與機器學習的應用範例,充分展現出這些基本功在現實世界中的重要性。

在這個 AI 快速演進的時代,邏輯思考依然是學習程式的核心,我們也必須不斷調整自己的學習方式,與時俱進,才能真正掌握未來的關鍵能力。




2022年8月12日 星期五

[Linux 程式設計] 關於GCC

 

1. 後面的-lxxxx 如果是linux他的位置在哪裡? 

(base) ubuntu@ubuntu1804:/usr/lib$ cat  /etc/ld.so.conf.d/x86_64-linux-gnu.conf


# Multiarch support
/usr/local/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
(base) ubuntu@ubuntu1804:/usr/lib$ pwd
/usr/lib

2. 標準函式庫為何不用帶-lxxx

 因為gcc 預設會連結標準函式庫 libc.so.xx

3. 如果使用opensource 專案時要使用 -lxxxx 這部分該怎使用如果他的lib名稱 不是lib<project>
 
  如果不是標準名稱就得用library全名. 主要還是要指定 -L<lib目錄>  , 指名library的位置, 如果不是放在library 的搜尋路徑上的話



(base) ubuntu@ubuntu1804:~$ gcc -v

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)


----------
相關課程: 
https://www.ittraining.com.tw/ittraining/it-elearning/el-linux-embedded/e-linuxsys#tab01

2022年6月22日 星期三

[C語言]字串處理函式:strspn, strpbrk



size_t strspn(const char *str1, const char *str2)  傳回str1包含了str2 字串中的字元,共有有多少個。
char *strpbrk(const char *str1, const char *str2)  傳回str1中出現str2字串中字元的位置。若沒有找到傳回NULL. 

char *d =strpbrk("my phone number is 23167736", "0123456789")
print("%c",d); ==> 卬出2

========================

 以處理HTTP header 的字串為例,  我們要逐行取出HTTP header的內容,  但要如何逐行進行呢? 
以下是使用 strspn(), strpbrk() 函式來完成的
 




參考: 
[1]程式參考


[2]   https://github.com/troglobit/merecat/blob/master/src/libhttpd.c




2022年5月24日 星期二

[ C 語言] gcc 定義巨集

 

[ C 語言]

1.) 在程式檔中 (,c 或.h) 定義 DEBUG  

  #define DEBUG  

 



2.) 不改變在程式檔, 而是在程式編譯階段去定義 DEBUG    

gcc -DDEBUG  debug.c -o test 

另外也可以設定 DEBUG的值, 如 gcc -DDEBUG=4 debug.c -o test

(以上等同在hello.c 內加入了 #define DEBUG 或   #define DEBUG  4 這一行 )

其實, 若 寫 -DDEBUG  隱含  -DDEBUG=1 的意思 


注意: 若程式內及gcc 都同時定義了 DEBUG 這個符號 
,  會以程式碼內寫的為主。(會出現重覆定義的warning 訊息)

pi@ittraining:~/LinuxPro/trunk/source/ch3 $ gcc debug.c -DDEBUG=1 -o test

debug.c:4: warning: "DEBUG" redefined

 #define DEBUG 3

<command-line>: note: this is the location of the previous definition






2022年4月30日 星期六

[C 語言] 有無const 的差異?

 


char *s : 表示s 指標指向一個character
constant char *s : 表示s 指標指向一個constant character; 也就是所指向的字元不能被修改
可以參考底下範例, 觀察有無const 的差別.

#include <stdio.h>
int main()
{
const char str[]="hello";
str[0]='H';
printf(str);
return 0;

}

若是寫 const char *str="hello";
這str 本來就指向read only 的"hello"字串區域, 所以本來就不能更改, 因此
這兩個寫法結果沒有差異, 但用const char * str寫法可以讓別人知道, 不會透過str 來改變指標所指的內容.

char *str="hello"; 
const char *str="hello";


2020年6月7日 星期日

[C語言]安裝MinGW - Minimalist GNU for Windows


對於不熟悉Linux,又想要用GNU gcc 編譯你的 C code或g++編譯你的C++ code, 你可以在windows上安裝minGW 使得你的windows也有最小的GNU程式開發工具.


MinGW - Minimalist GNU for Windows

 1.)下載  MinGW 並在windows下進行安裝

MinGW: A native Windows port of the GNU Compiler Collection (GCC), with freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All of MinGW's software will execute on the 64bit Windows platforms.
mingw32-base 選項,按右鍵 Mark for Installation



接著在選單[Installation]上選Apply Changes,就會進行線安裝






2.) 

2-1
  使用Code::Blocks IDE作為來編譯程式     <--建議: 新手使用視窗界面

 

2020年6月1日 星期一

[C/C++程式] Code::Blocks 整合開發環境的安裝與使用



MS Visual Studio和Dev-C++ 的另一個C/C++ 開發工具選擇----Code::Blocks

Code::Blocks是一個免費、開源、跨平台的整合式開發環境,Code::Blocks主要針對開發C/C++程式而設計。Code::Blocks使用了外掛程式架構,其功能可以使用外掛程式自由地擴充。

但Code::blocks 本身只是一個C/C++程式開發的皮, 沒有compiler ,所以安裝Code::blocks前得先安裝好一個compiler , 例如要在windows上使用GNU gcc 編譯器, 須先下載 MinGW 並進行安裝, 安裝 MinGW後,接著再進行Code::Blocks安裝。

但現在code:blocks 已有內含了MinGW 的版本, 超方便安裝, 這樣就可以省掉很多設定的動作

使用 Windows , 你可以撰擇 XP / Vista / 7 / 8.x / 10 的版本下載:  




接著就只要一直 [下一步] 就安裝完了..





2020年5月24日 星期日

[C語言]C 字串的問題

C 字串的問題

char *number1[3] = {"asdf", "qwer", "zxcv"};
printf("%s", number1[0]);

這樣會印出asdf,不過我不理解為甚麼printf後面放的是number1[0]而非*number1[0]?

我的理解是number1[0]存放的應該是一個記憶體位置,而*number1[0]才是指向asdf的實際位置,不曉得對不對?

==================================

說明如下:

char *number1[3] = {"asdf", "qwer", "zxcv"};


number1是字元指標陣列.. 所以初指值指向3個字串位址
number1[0] --> "asdf"
number1[1] --> "qwer"
number1[2] --> "zxcv"


變數名稱  變數記憶體位址    內容(假設) 
number1[0]  &number1[0]         0x7ff0
number1[1]  &number1[1]         0x7ff6
number1[2]  &number1[2]         0x7fff


記憶體位址       內容
                        0    1     2      3    4
0x7ff0             'a'   's'    'd'    'f'   '\0'
0x7ff6             'q'   'w'   'e'    'r'   '\0'
0x7fff              'z'   'x'   'c'    'v'   '\0'


(1) *number1[0] ==>'a'
(2) *(number1[0]+1) ==>'s'
(3) number[0] 的型態是 char * ,內容是0x7ff0
(4) number[0][0] 的型態是 char,內容是'a'


printf 的%s 輸出字串, 必須提供字串位址

printf("%s\n","asdf") ==> asdf
printf("%s\n",number1[0] ) ==> asdf
printf("%c\n",number1[0][0]) ==> a
printf("%c\n",number1[0][1]) ==> s
printf("%c\n",*number1[0] ) ==> a
printf("%c\n",*(number1[0]+1) ) ==> s

[C語言] 2種函數參數傳遞方式



根據課程的第二階段的1-2 多項式-2的06:47的例子
我自己試寫,如下列圖檔
為什麼這樣會錯誤?




另外,影片中我有疑問:
1.程式中沒有m,那為什麼「*m」可以指向「math」?
2.我不懂為什麼影片中的程式碼polynomial(float x, float *m, int size)
*m要加*,但size卻不用加*。不都是從別的地方取來的?

2種函數參數傳遞方式, 函數內想要使用別人的陣列時, 只要傳遞陣列起始位址就可引參考引用. 而不必copy所有內容 (很花時間.)
size 只是傳給一個數字, 因為也沒有要在函數內修改傳進來的size變數, 所以可以傳值過去 (只有4個byte). 不過要傳size位址
也是可以的
將函數定義改成 int f(int x, int *math, int *size)
在主程式改成 f(x,math,&size) 來呼叫


2020年3月18日 星期三

[C語言]Code:blocks 編譯多個檔案



在專案愈來愈大時,就不會再把所有功能寫在一個檔案裡,會將不同功能寫在不同檔案中,因此當要同時編譯多個檔案時,就是要先去建立專案,然後將多個原始檔加入到專案中, 然後再build 專案。

底下以Code:blocks 建立專案為例


1. 建立新專案 File-> New-> Project




2. 選擇Console application



3.選擇C


4. 建立專案名稱及專案存放位置




5. 在專案管理視窗(Shfit-F2) 替專案新增原始檔案, 原始檔案(.c. h)可以先複製到專案資料匣下





6. 專案加入

2020年2月22日 星期六

[C語言]如何設計一個表格

[進階C程式設計] 如何設計一個表格


資料結構的設計
typedef struct _table{
  int row;
  int column;
  int **data;

}Table;

typedef  Table * pTable;

//產生表格決定欄列大小
pTable create_table(int row,int column);

//刪除表格 release memory
void delete_table(pTable ptbl);
//卬出表格內容
void dump_2d(int row,int column, int **a );




相關文章





工商廣告: #APCS程式設計營隊 課程特色 : 工程師級的師資、精編的APCS講義、豐富的程式演練、優質的電腦教室、詳細的考古題解說 #開課時間 : 2020年 暑假開課 #上課教室: 台北: 艾鍗學院電腦教室(台北市重慶南路1段) 台中:逄甲大學電腦教室 高雄:中山大學電腦教室 更多資訊:http://bit.ly/34wHMwg

2020年2月18日 星期二

code:blocks的Function List (Symbols browser)



使用code:blocks 也有和 notepad++樣的 Function List , 開啓了這個功能才可以很
方便的快速移動到不同的函式去.


Settings -> Editor -> Code Completion -> Symbols browser

Check 'Display as free floating / docking window'







2019年7月4日 星期四

[APCS] C程式培訓講解截圖




遞迴方程式



遞迴方程式-求最大公因數GCD





APCS觀念題說明



APCS觀念題說明




遞迴方程式- "ABC" 顯示所有排列


 指標

指標與陣列關係



實作一個計算標準差函數

 int a[10]={5,-2,17,1,56,32,-21,90,43,-67};

void dump(int *ar,int size);
float std(int *ar,int size);


float std(int *ar,int size)
{
   int i;
   float std,u;
   float ss=0;
   u=avg(ar,size);

   for(i=0;i<size;i++)
       ss+=(ar[i]-u)*(ar[i]-u);

   std=sqrt(ss/size);

   return std;

}







2019年3月14日 星期四

[C語言] 動態記憶體配置


C語言上有遇到動態記憶體配置問題


  說明直接放在下方! 


Q1:為何在下述程式內, 配置二維陣列的記憶體後, 執行出來的陣列位址每換一列都不是加4 byte.
例如:
3x3:
&arr[0][2]=00BD3200 --> &arr[1][0]=00BD3210 差10 Bytes
arr[0]=00BD31F8, arr[1]=00BD3210差18.
但若不做記憶體 配置 , 則3x3,nxn每個都是4 bytes.

Q2:為何做記憶體配置和沒有做配置, arr+n的address和arr[n]有差異?
ex:



做記憶體配置>> 取arr+n的值不會等於arr[n]的值. 且arr+0,arr+1差4 byte. arr[0],arr[1]差18.
arr+0=00BD31E0; arr[0]=00BD31F8
arr+1=00BD31E4; arr[1]=00BD3210

  
不做記憶體配置>> 取arr+n的值會等於arr[n]的值. 且arr+0,arr+1差12 byte. 剛好是3x4 byte.
arr+0=0060FE8C; arr[0]=0060FE8C; &arr[0]=0060FE8C;
arr+1=0060FE98; arr[1]=0060FE98; &arr[1]=0060FE98;
arr+2=0060FEA4; arr[2]=0060FEA4; &arr[2]=0060FEA4;

int main()
{
    int i,j,n;
    int count=0;

   printf("Input the size:");
   scanf("%d", &n);
   int **arr=(int **)malloc(n*sizeof(int *));
      for(i=0;i<n;i++)
        arr[i]=(int *)malloc(n*sizeof(int));


      for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
         arr[i][j]=count;
         count++;
        }

      printf("arr+0=%p; arr[0]=%p; *arr[0]=%d; *(arr+0)=%p; &arr[0][2]=%p\n",arr+0, arr[0], *arr[0], *(arr+0), &arr[0][2]);
      printf("arr+1=%p; arr[1]=%p; *arr[1]=%d; *(arr+1)=%p; &arr[1][0]=%p\n",arr+1, arr[1], *arr[1], *(arr+1), &arr[1][0]);
      printf("arr+2=%p; arr[2]=%p; *arr[2]=%d; *(arr+2)=%p; &arr[2][0]=%p\n",arr+2, arr[2], *arr[2], *(arr+2), &arr[2][0]);
      for(i=0;i<n;i++)
        free(arr[i]);
      free(arr);
    return 0;
}

結果:
arr+0=00BD31E0; arr[0]=00BD31F8; *arr[0]=0; *(arr+0)=00BD31F8; &arr[0][2]=00BD3200
arr+1=00BD31E4; arr[1]=00BD3210; *arr[1]=3; *(arr+1)=00BD3210; &arr[1][0]=00BD3210
arr+2=00BD31E8; arr[2]=00BD3228; *arr[2]=6; *(arr+2)=00BD3228; &arr[2][0]=00BD3228


===========================


From 艾鍗C程式設計講義 


 動態配置2維空間


如果想要像int arr[n][n],配置一段連續的nxn空間,可以用這樣的方式來宣告指標, n-int pointer

 printf("Input the size:");
   scanf("%d", &n);

   int (*arr)[n]=(int *)malloc(n*n*sizeof(int));
   
printf("%d\n",sizeof(arr));  // 4 byte

      for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
         arr[i][j]=count;
         count++;
        }
     show(n,*arr);


        free(arr);


參考:




2019年3月3日 星期日

HTTP 的訊息格式處理



HTTP  的訊息格式 (Text Format) 大致如下: 

Method     URL   Protocol \r\n          
key: value  \r\n
key: value  \r\n
key: value  \r\n
\r\n
HTML data

例如




HTTP Header 訊息每列以 \n 或 \r\n 換行, 若某一行為\\r\n 或 \n 沒有任何字 表示Header結尾。 訊息中也可能包含不定數量的空白(依程式實作者而定)

底下利用C函式的字串處理函數strpbrk(), strspn() 進行字串解析, 抓到你想要的欄位值。

protocol -->  "HTTP/1.1"
Method-->  "GET"
URL-->  "/doc/test.html"
Host--< www.test101.com
...






strpbrk()

  int len;
   const char str1[] = "ABCDEFG019874";
   const char str2[] = "BCD";

   char *str = strpbkr(str1, str2)   ==> str="BCDEFG019874"


 strspn()



   int len;
   const char str1[] = "ABCDEFG019874";
   const char str2[] = "ABCD";

   len = strspn(str1, str2)   ==> len=4


相關課程:








2018年5月28日 星期一

只要三分鐘!立即搞懂什麼是APCS程式檢測



APSC大學程式先修檢測重要時程

(一. ) 報名資格:

1. 任何想檢測程式設計程度者

2. 高中(職)修完程式設計的學生

(二.) APCS檢測費用:免費

(三.) 報名及測驗日期 : https://apcs.csie.ntnu.edu.tw/index.php/info/timeline/

(四.) 目前有採計APCS成績的大學校系

https://apcs.csie.ntnu.edu.tw/index.php/apcs-introduction/gradeschool/


APCS檢測內容及考試時間

檢測包含兩科目:「程式設計觀念」及「程式設計實作」,兩科均以中文命題,採線上方式進行測驗。

  1. 程式設計觀念:共50道試題,分兩份題本以兩節次檢測.每一個節次為80分鐘。題目若需提供程式片段,則以 C 語言 subset 命題
  2. 程式設計實作:一份測驗題本共計4個題組,測驗時間150分鐘,以撰寫完整程式或副程式為主。可以使用C、C++、JAVA、Python 其中一種程式語言進行實作

   第一節次 ( 程式設計觀念題 ): 80分鐘
 
   第二節次 ( 程式設計實作題 ) : 150分鐘

   第三節次 ( 程式設計觀念題 ) : 80分鐘



APCS分數級別說明:

級別
程式設計觀念題
程式設計實作題
分數範圍
分數範圍
說明
90-100
350-400
能在時間內正確撰寫34個程式,程式設計實作表現極優異
70-89
250-349
能在時間內正確撰寫23個程式,程式設計實作表現優異
50-69
150-249
能在時間內正確撰寫12個程式,程式設計實作表現佳
30-49
50-149
能在時間內正確撰寫約1個程式,具基礎程式設計實作能力
0-29
0-49
尚未能在時間內正確撰寫任1個程式


檢測系統環境

Linux Ubuntu Desktop 18.04 (64-bit) , 可以直接使用官方提供供Live CD ISO檔, 並使用Virtual Box 掛載此ISO檔. 惟不能重啓開機, 否則資料全部不見 (Live CD的作法是所有檔案都儲存在記憶體而不是磁碟).   試著自己動手安裝APCS 練習環境


=============================================================


APCS暑期程式程式營,快速讓你掌握高分技巧!!!



大學資訊科系早已優先錄取程式表現優秀的學生。這樣的趨勢下,不會寫程式,升學註定輸人一大截!(你還以為到大學再學程式就好嗎?) 。因此,與其在10/27 APCS檢定過後,後悔沒早一點開始;不如現在開始準備,全力衝刺,成為APCS的贏家!

招生對象:

欲報名今年度APCS檢測之考生,或對APCS課程及程式語言有興趣之考生。

報名時間:

即日起至6/30日止,年度僅此一梯,名額有限,預報從速!!!

營隊資訊:

點我立刻考取APCS檢定高分

專家教你快速獲得APCS亮眼成績 

根據<教育部扎根高中職資訊科學教育計畫>APCS檢測結果,程式設計實作題共4題,只要能寫一題以上就排到前11%,這代表會"看"程式的人多,能實際寫code的人少。因此,艾鍗邀業界工程師,用軟體工程師角度重新教你認識程式、理解程式,在150分鐘內思考問題、解決問題,完成程式。
點我快速獲得APCS亮眼成績

獨家APCS大學程式先修檢測歷屆試題解析

選擇題高分只能說是會""程式,但並不代表會""程式。所以實作題才是APCS真的挑戰。試著閱讀下列106年APCS程式設計實作題,在沒有人解釋題目與對題目進行解構前,是否已掌握到要解什麼問題嗎?你想到解法了嗎? 
點我觀看APCS歷屆考題解析


如對本次營隊有相關問題,點我洽詢,有專人為您解答