- 由於高中的資訊課從來都沒有L紀的課那麼
毒瘤有趣,在寫功課中有感而發而寫了這篇有趣的小東西與大家分享,如果有各方大神有超毒瘤或有趣的玩法記得傳教我OwO - 至於以後有遇到有趣的東東就會再寫,但功課解析不會再有(除非那題很毒瘤或有趣)
- 近期我會盡快架個Blog,有趣的東東都會放在Blog上,希望往後大家能多多造訪Orz
- 友情連結 -> 吳文元的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" | bash
或echo "type cd" | sh
它會超貼心的說cd is a shell builtin
。
PS: 讚嘆余原齊大神只用which cd
揍掉這題m(_ _)m