1. 由於高中的資訊課從來都沒有L紀的課那麼毒瘤有趣,在寫功課中有感而發而寫了這篇有趣的小東西與大家分享,如果有各方大神有超毒瘤或有趣的玩法記得傳教我OwO
  2. 至於以後有遇到有趣的東東就會再寫,但功課解析不會再有(除非那題很毒瘤或有趣)
  3. 近期我會盡快架個Blog,有趣的東東都會放在Blog上,希望往後大家能多多造訪Orz
  4. 友情連結 -> 吳文元的Blog

先淺談一些有趣的東西

為什麼我要先寫有趣的東西呢?因為大部分是寫功課過程中學到的,小部份只是想順道跟大家分享。

懶惰就都define起來啊OwO

習慣打int的我,就

#include<stdint.h>
#define int int32_t

C語言中沒有布林?(這篇是之前寫的,下一週上課剛好就被提到)

#include<stdbool.h>

上課毒L紀說給你錯的輸入格式(?判掉它OAO

我喜歡的寫法

int c;
while(scanf("%...")!=...)//"..."是指輸入多少量
{
    printf("Please input correct format!\n");
    while(c=getchar()!='\n' && c!=EOF);
}

sad之神吳文元喜歡的精簡寫法

while(scanf("%...")!=...)//"..."是指輸入多少量
{
    printf("Please input correct format!\n");
    while(getchar()!='\n');
}

為什麼會有人main函式寫signed main() ?

別問你會怕OwO
好啦,其實C99 ISO/IEC 9899:1999第99,100頁有規定到(如圖)

就像把long long int打成long long一樣啦,粗略來說就是名字不一樣但性質一樣。

用途就是有人跟我一樣毒瘤到懶的開long long時就#define int long long

這時就要談到main為什麼只回傳int了 QAQ

又是很毒的C規定標準-> ISO/IEC 9899:201x 第13頁的Program startup有規定。

然後第14頁的Program termination有講到main()回傳的return值會丟給exit()

PS: return是調用堆疊(函數退出),exit是系統調用(進程退出)。

通常return 0是成功,return 1可能表示失敗,回傳值丟給exit()後會告訴使用者

exit(0)正常結束exit(非0)產生錯誤資訊,有定義system exit回傳數字是什麼意思。

上面看不懂沒關係,因為總結起來如下面程式碼一樣簡單又簡潔OwO(文元不要打我)

#include<stdio.h>
#define int long long
signed main()
{
    return 0;
}

你不知道為什麼scanf編譯時吃了warning?

其實scanf是會回傳值的,只是單純警告你忽略了回傳值(就像宣告了一個變數,但整個程式都沒用到它,就會給你一個warning提醒使用者),在這點到為止,有興趣的看這裡,-Wunused-result看這裡

題目要求連續輸入直到EOF時(End of File)(ctrl+z是Windows的EOF)(ctrl+d是Linux的EOF)

//正常寫法
while(scanf("%d",&n)!=EOF){
    ...
}
//毒瘤寫法(黑魔法)
while(~scanf("%d",&n)){
    ...
}

好啦,其實不是黑魔法,’~’符號只是位元運算子的「not」

舉例 a=101001 ; b=~a ; 那麼 b=010110 (not的這個想法在hw0105的手寫部份可以用的上OwO)

通常EOF是系統跑到文件結尾時,所回傳的信號(-1)

  • 因系統而異,不全是-1

然後在上面那一篇有說到scanf是會回傳值的,它回傳了EOF(-1),並將(-1)給not

因此,以8位元二補數舉例表示為: ~(-1) = ~(1111 1111)(二進位) = (0000 0000)(二進位)= 0 (十進位)

那麼,while(~(-1)) = while(0)

  • 提醒 : ASCII沒有負數(0~127),因此EOF不是特殊字符。

  • EOF是被define的 -> #define EOF -1

當你很想輸出後就直接return 0時(1行超讚)

return printf("%d+%d=%d",a,b,a+b),0;

防雷線(以下是作業部份)


簡單的輸出題。

題目規定要5 digits,所以要判斷是否有輸入錯格式。
再來把輸入的數字丟進for裡,每次除以一個從10000開始每次除以10的數字,一直乘進答案裡,輸入的數字記得模掉最前面一位。

物理算術題。

下面第21行的%.2f , %.3f極粗略上來說是取四捨五入當第多少位,如果不足位數則補0,如果需要實做輔助看這裡

我先使用 whereis stdio.h 尋找 stdio.h 的 path,跟著路徑/usr/include/找到stdio.h後將它mv成不同名字(sudo mv stdio.h stdioo.h)(沒加sudo會permission denied,所以提高權限),改完後回去直接$ make clean $ make會得到”fatal error”,不能過編。但是,如果我把程式裡的#include<stdio.h>砍掉就「可以過編」,但會吃warning,原因在於[-Wimplicit-function-declaration](隱式宣告函式)也就是C語言有規定,「對於沒有宣告的函式,自動使用隱式宣告」

解釋10進位負數轉16進位

首先將此十進位數字部份轉成二進位,反碼後加1,4個數字一組轉成16進位(共8組)($2^{4*8}$)。

或是可以參考這裡

Bonus

我先使用whereis cd尋找cd,之後又用ls /bin | grep cd也找不到,於是詢問一下他的type是什麼type cd,出現了以下我簡化後的敘述。

cd is a function with definition
#Defined in /usr/share/fish/functions/cd.fish
...

在fish-shell,cd是個function(因為我的是fish-shell)。
但如果要查bash,那echo "type cd" | bashecho "type cd" | sh它會超貼心的說cd is a shell builtin

PS: 讚嘆余原齊大神只用which cd揍掉這題m(_ _)m