導航:首頁 > 源碼編譯 > 有名氣的qp源碼報價

有名氣的qp源碼報價

發布時間:2022-10-25 22:41:10

『壹』 linux 操作系統 常用 命令 有哪些

系統信息
arch 顯示機器的處理器架構(1)
uname -m 顯示機器的處理器架構(2)
uname -r 顯示正在使用的內核版本
dmidecode -q 顯示硬體系統部件 - (SMBIOS / DMI)
hdparm -i /dev/hda 羅列一個磁碟的架構特性
hdparm -tT /dev/sda 在磁碟上執行測試性讀取操作
cat /proc/cpuinfo 顯示CPU info的信息
cat /proc/interrupts 顯示中斷
cat /proc/meminfo 校驗內存使用
cat /proc/swaps 顯示哪些swap被使用
cat /proc/version 顯示內核的版本
cat /proc/net/dev 顯示網路適配器及統計
cat /proc/mounts 顯示已載入的文件系統
lspci -tv 羅列 PCI 設備
lsusb -tv 顯示 USB 設備
date 顯示系統日期
cal 2007 顯示2007年的日歷表
date 041217002007.00 設置日期和時間 - 月日時分年.秒
clock -w 將時間修改保存到 BIOS

關機 (系統的關機、重啟以及登出 )
shutdown -h now 關閉系統(1)
init 0 關閉系統(2)
telinit 0 關閉系統(3)
shutdown -h hours:minutes & 按預定時間關閉系統
shutdown -c 取消按預定時間關閉系統
shutdown -r now 重啟(1)
reboot 重啟(2)
logout 注銷

文件和目錄
cd /home 進入 '/ home' 目錄'
cd .. 返回上一級目錄
cd ../.. 返回上兩級目錄
cd 進入個人的主目錄
cd ~user1 進入個人的主目錄
cd - 返回上次所在的目錄
pwd 顯示工作路徑
ls 查看目錄中的文件
ls -F 查看目錄中的文件
ls -l 顯示文件和目錄的詳細資料
ls -a 顯示隱藏文件
ls *[0-9]* 顯示包含數字的文件名和目錄名
tree 顯示文件和目錄由根目錄開始的樹形結構(1)
lstree 顯示文件和目錄由根目錄開始的樹形結構(2)
mkdir dir1 創建一個叫做 'dir1' 的目錄'
mkdir dir1 dir2 同時創建兩個目錄
mkdir -p /tmp/dir1/dir2 創建一個目錄樹
rm -f file1 刪除一個叫做 'file1' 的文件'
rmdir dir1 刪除一個叫做 'dir1' 的目錄'
rm -rf dir1 刪除一個叫做 'dir1' 的目錄並同時刪除其內容
rm -rf dir1 dir2 同時刪除兩個目錄及它們的內容
mv dir1 new_dir 重命名/移動 一個目錄
cp file1 file2 復制一個文件
cp dir/* . 復制一個目錄下的所有文件到當前工作目錄
cp -a /tmp/dir1 . 復制一個目錄到當前工作目錄
cp -a dir1 dir2 復制一個目錄
ln -s file1 lnk1 創建一個指向文件或目錄的軟鏈接
ln file1 lnk1 創建一個指向文件或目錄的物理鏈接
touch -t 0712250000 file1 修改一個文件或目錄的時間戳 - (YYMMDDhhmm)
file file1 outputs the mime type of the file as text
iconv -l 列出已知的編碼
iconv -f fromEncoding -t toEncoding inputFile > outputFile creates a new from the given input file by assuming it is encoded in fromEncoding and converting it to toEncoding.
find . -maxdepth 1 -name *.jpg -print -exec convert "{}" -resize 80x60 "thumbs/{}" \; batch resize files in the current directory and send them to a thumbnails directory (requires convert from Imagemagick)

文件搜索
find / -name file1 從 '/' 開始進入根文件系統搜索文件和目錄
find / -user user1 搜索屬於用戶 'user1' 的文件和目錄
find /home/user1 -name \*.bin 在目錄 '/ home/user1' 中搜索帶有'.bin' 結尾的文件
find /usr/bin -type f -atime +100 搜索在過去100天內未被使用過的執行文件
find /usr/bin -type f -mtime -10 搜索在10天內被創建或者修改過的文件
find / -name \*.rpm -exec chmod 755 '{}' \; 搜索以 '.rpm' 結尾的文件並定義其許可權
find / -xdev -name \*.rpm 搜索以 '.rpm' 結尾的文件,忽略光碟機、捷盤等可移動設備
locate \*.ps 尋找以 '.ps' 結尾的文件 - 先運行 'updatedb' 命令
whereis halt 顯示一個二進制文件、源碼或man的位置
which halt 顯示一個二進制文件或可執行文件的完整路徑

掛載一個文件系統
mount /dev/hda2 /mnt/hda2 掛載一個叫做hda2的盤 - 確定目錄 '/ mnt/hda2' 已經存在
umount /dev/hda2 卸載一個叫做hda2的盤 - 先從掛載點 '/ mnt/hda2' 退出
fuser -km /mnt/hda2 當設備繁忙時強制卸載
umount -n /mnt/hda2 運行卸載操作而不寫入 /etc/mtab 文件- 當文件為只讀或當磁碟寫滿時非常有用
mount /dev/fd0 /mnt/floppy 掛載一個軟盤
mount /dev/cdrom /mnt/cdrom 掛載一個cdrom或dvdrom
mount /dev/hdc /mnt/cdrecorder 掛載一個cdrw或dvdrom
mount /dev/hdb /mnt/cdrecorder 掛載一個cdrw或dvdrom
mount -o loop file.iso /mnt/cdrom 掛載一個文件或ISO鏡像文件
mount -t vfat /dev/hda5 /mnt/hda5 掛載一個Windows FAT32文件系統
mount /dev/sda1 /mnt/usbdisk 掛載一個usb 捷盤或快閃記憶體設備
mount -t smbfs -o username=user,password=pass //WinClient/share /mnt/share 掛載一個windows網路共享

磁碟空間
df -h 顯示已經掛載的分區列表
ls -lSr |more 以尺寸大小排列文件和目錄
-sh dir1 估算目錄 'dir1' 已經使用的磁碟空間'
-sk * | sort -rn 以容量大小為依據依次顯示文件和目錄的大小
rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n 以大小為依據依次顯示已安裝的rpm包所使用的空間 (fedora, redhat類系統)
dpkg-query -W -f='${Installed-Size;10}t${Package}n' | sort -k1,1n 以大小為依據顯示已安裝的deb包所使用的空間 (ubuntu, debian類系統)

返回頂部索引 ^

用戶和群組
groupadd group_name 創建一個新用戶組
groupdel group_name 刪除一個用戶組
groupmod -n new_group_name old_group_name 重命名一個用戶組
useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 創建一個屬於 "admin" 用戶組的用戶
useradd user1 創建一個新用戶
userdel -r user1 刪除一個用戶 ( '-r' 排除主目錄)
usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 修改用戶屬性
passwd 修改口令
passwd user1 修改一個用戶的口令 (只允許root執行)
chage -E 2005-12-31 user1 設置用戶口令的失效期限
pwck 檢查 '/etc/passwd' 的文件格式和語法修正以及存在的用戶
grpck 檢查 '/etc/passwd' 的文件格式和語法修正以及存在的群組
newgrp group_name 登陸進一個新的群組以改變新創建文件的預設群組

返回頂部索引 ^

文件的許可權 - 使用 "+" 設置許可權,使用 "-" 用於取消
ls -lh 顯示許可權
ls /tmp | pr -T5 -W$COLUMNS 將終端劃分成5欄顯示
chmod ugo+rwx directory1 設置目錄的所有人(u)、群組(g)以及其他人(o)以讀(r )、寫(w)和執行(x)的許可權
chmod go-rwx directory1 刪除群組(g)與其他人(o)對目錄的讀寫執行許可權
chown user1 file1 改變一個文件的所有人屬性
chown -R user1 directory1 改變一個目錄的所有人屬性並同時改變改目錄下所有文件的屬性
chgrp group1 file1 改變文件的群組
chown user1:group1 file1 改變一個文件的所有人和群組屬性
find / -perm -u+s 羅列一個系統中所有使用了SUID控制的文件
chmod u+s /bin/file1 設置一個二進制文件的 SUID 位 - 運行該文件的用戶也被賦予和所有者同樣的許可權
chmod u-s /bin/file1 禁用一個二進制文件的 SUID位
chmod g+s /home/public 設置一個目錄的SGID 位 - 類似SUID ,不過這是針對目錄的
chmod g-s /home/public 禁用一個目錄的 SGID 位
chmod o+t /home/public 設置一個文件的 STIKY 位 - 只允許合法所有人刪除文件
chmod o-t /home/public 禁用一個目錄的 STIKY 位

返回頂部索引 ^

文件的特殊屬性 - 使用 "+" 設置許可權,使用 "-" 用於取消
chattr +a file1 只允許以追加方式讀寫文件
chattr +c file1 允許這個文件能被內核自動壓縮/解壓
chattr +d file1 在進行文件系統備份時,mp程序將忽略這個文件
chattr +i file1 設置成不可變的文件,不能被刪除、修改、重命名或者鏈接
chattr +s file1 允許一個文件被安全地刪除
chattr +S file1 一旦應用程序對這個文件執行了寫操作,使系統立刻把修改的結果寫到磁碟
chattr +u file1 若文件被刪除,系統會允許你在以後恢復這個被刪除的文件
lsattr 顯示特殊的屬性

返回頂部索引 ^

打包和壓縮文件
bunzip2 file1.bz2 解壓一個叫做 'file1.bz2'的文件
bzip2 file1 壓縮一個叫做 'file1' 的文件
gunzip file1.gz 解壓一個叫做 'file1.gz'的文件
gzip file1 壓縮一個叫做 'file1'的文件
gzip -9 file1 最大程度壓縮
rar a file1.rar test_file 創建一個叫做 'file1.rar' 的包
rar a file1.rar file1 file2 dir1 同時壓縮 'file1', 'file2' 以及目錄 'dir1'
rar x file1.rar 解壓rar包
unrar x file1.rar 解壓rar包
tar -cvf archive.tar file1 創建一個非壓縮的 tarball
tar -cvf archive.tar file1 file2 dir1 創建一個包含了 'file1', 'file2' 以及 'dir1'的檔案文件
tar -tf archive.tar 顯示一個包中的內容
tar -xvf archive.tar 釋放一個包
tar -xvf archive.tar -C /tmp 將壓縮包釋放到 /tmp目錄下
tar -cvfj archive.tar.bz2 dir1 創建一個bzip2格式的壓縮包
tar -xvfj archive.tar.bz2 解壓一個bzip2格式的壓縮包
tar -cvfz archive.tar.gz dir1 創建一個gzip格式的壓縮包
tar -xvfz archive.tar.gz 解壓一個gzip格式的壓縮包
zip file1.zip file1 創建一個zip格式的壓縮包
zip -r file1.zip file1 file2 dir1 將幾個文件和目錄同時壓縮成一個zip格式的壓縮包
unzip file1.zip 解壓一個zip格式壓縮包

返回頂部索引 ^

RPM 包 - (Fedora, Redhat及類似系統)
rpm -ivh package.rpm 安裝一個rpm包
rpm -ivh --nodeeps package.rpm 安裝一個rpm包而忽略依賴關系警告
rpm -U package.rpm 更新一個rpm包但不改變其配置文件
rpm -F package.rpm 更新一個確定已經安裝的rpm包
rpm -e package_name.rpm 刪除一個rpm包
rpm -qa 顯示系統中所有已經安裝的rpm包
rpm -qa | grep httpd 顯示所有名稱中包含 "httpd" 字樣的rpm包
rpm -qi package_name 獲取一個已安裝包的特殊信息
rpm -qg "System Environment/Daemons" 顯示一個組件的rpm包
rpm -ql package_name 顯示一個已經安裝的rpm包提供的文件列表
rpm -qc package_name 顯示一個已經安裝的rpm包提供的配置文件列表
rpm -q package_name --whatrequires 顯示與一個rpm包存在依賴關系的列表
rpm -q package_name --whatprovides 顯示一個rpm包所佔的體積
rpm -q package_name --scripts 顯示在安裝/刪除期間所執行的腳本l
rpm -q package_name --changelog 顯示一個rpm包的修改歷史
rpm -qf /etc/httpd/conf/httpd.conf 確認所給的文件由哪個rpm包所提供
rpm -qp package.rpm -l 顯示由一個尚未安裝的rpm包提供的文件列表
rpm --import /media/cdrom/RPM-GPG-KEY 導入公鑰數字證書
rpm --checksig package.rpm 確認一個rpm包的完整性
rpm -qa gpg-pubkey 確認已安裝的所有rpm包的完整性
rpm -V package_name 檢查文件尺寸、 許可、類型、所有者、群組、MD5檢查以及最後修改時間
rpm -Va 檢查系統中所有已安裝的rpm包- 小心使用
rpm -Vp package.rpm 確認一個rpm包還未安裝
rpm2cpio package.rpm | cpio --extract --make-directories *bin* 從一個rpm包運行可執行文件
rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm 從一個rpm源碼安裝一個構建好的包
rpmbuild --rebuild package_name.src.rpm 從一個rpm源碼構建一個 rpm 包

返回頂部索引 ^

YUM 軟體包升級器 - (Fedora, RedHat及類似系統)
yum install package_name 下載並安裝一個rpm包
yum localinstall package_name.rpm 將安裝一個rpm包,使用你自己的軟體倉庫為你解決所有依賴關系
yum update package_name.rpm 更新當前系統中所有安裝的rpm包
yum update package_name 更新一個rpm包
yum remove package_name 刪除一個rpm包
yum list 列出當前系統中安裝的所有包
yum search package_name 在rpm倉庫中搜尋軟體包
yum clean packages 清理rpm緩存刪除下載的包
yum clean headers 刪除所有頭文件
yum clean all 刪除所有緩存的包和頭文件

返回頂部索引 ^

DEB 包 (Debian, Ubuntu 以及類似系統)
dpkg -i package.deb 安裝/更新一個 deb 包
dpkg -r package_name 從系統刪除一個 deb 包
dpkg -l 顯示系統中所有已經安裝的 deb 包
dpkg -l | grep httpd 顯示所有名稱中包含 "httpd" 字樣的deb包
dpkg -s package_name 獲得已經安裝在系統中一個特殊包的信息
dpkg -L package_name 顯示系統中已經安裝的一個deb包所提供的文件列表
dpkg --contents package.deb 顯示尚未安裝的一個包所提供的文件列表
dpkg -S /bin/ping 確認所給的文件由哪個deb包提供

返回頂部索引 ^

APT 軟體工具 (Debian, Ubuntu 以及類似系統)
apt-get install package_name 安裝/更新一個 deb 包
apt-cdrom install package_name 從光碟安裝/更新一個 deb 包
apt-get update 升級列表中的軟體包
apt-get upgrade 升級所有已安裝的軟體
apt-get remove package_name 從系統刪除一個deb包
apt-get check 確認依賴的軟體倉庫正確
apt-get clean 從下載的軟體包中清理緩存
apt-cache search searched-package 返回包含所要搜索字元串的軟體包名稱

返回頂部索引 ^

查看文件內容
cat file1 從第一個位元組開始正向查看文件的內容
tac file1 從最後一行開始反向查看一個文件的內容
more file1 查看一個長文件的內容
less file1 類似於 'more' 命令,但是它允許在文件中和正向操作一樣的反向操作
head -2 file1 查看一個文件的前兩行
tail -2 file1 查看一個文件的最後兩行
tail -f /var/log/messages 實時查看被添加到一個文件中的內容

『貳』 如何解決源碼包安裝時的依賴性問題

動態可執行文件使用最初編譯和鏈接程序時使用的庫文件的共享對象名稱來查找共享對象。它們在少數的幾個標准位置查找,比如在/lib和/usr/lib目錄及在LD_LIBRARY_PATH環境變數(主要用於指定查找共享庫,比如我們在安裝Oracle時指定路徑,exportLD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib)指定的目錄中。順便提一下,在這些庫目錄中找到的共享對象可能不是真正的文件;它們可能是指向位於其他位置的真實庫文件的符號鏈接(但通常仍舊在標准庫目錄的一個目錄中)。至少從系統管理員的觀點是在用於創建共享庫文件的共享庫軟體包的名稱和共享庫文件的名稱之間通常沒有什麼關系。例如,GLIBC2.3軟體包用於創建libc.so.6共享庫文件。也從本示例中注意到,添加到共享庫文件名結束的版本號(.6)跟用於創建它的版本號(2.3)沒有關系。這是由共享庫軟體包開發人員有意完成的,以便GLIBC的新版本可以重用相同的共享庫文件名libc.so.6。這允許您在系統上載入新版本的GLIBC,而不用中斷動態鏈接到lib.so.6共享庫文件的所有程序,當然假定新版本的GLIBC向後與動態可執行文件最初所鏈接的老版本GLIBC兼容。因此,即使庫文件或共享對象文件有與它們相關的版本號,這些版本號也不能幫助你確定他們來自哪個版本的共享軟體包。
注意:當將whatprovides選項用於rpm查詢命令時,可以獲得有關使用rpm軟體包載入到系統的現有共享對象的信息。這種混亂是由下面的事實造成的:單個共享庫文件可能支持某個范圍的共享庫軟體包版本。例如,要檢查soname庫文件/lib/libc.so.6支持的GLIBC共享庫軟體包,運行下面的命令:
#objmp--all-headers/lib/libc.so.6|less
向下滾動此報告,直到到達Versiondefinitions:部分,以便查看libc.so.6共享庫文件支持哪些GLIBC版本:
Versiondefinitions:
10x010x0865f4e6libc.so.6
20x000x0d696910GLIBC_2.0
30x000x0d696911GLIBC_2.1
GLIBC_2.0
40x000x09691f71GLIBC_2.1.1
GLIBC_2.1
50x000x09691f72GLIBC_2.1.2
GLIBC_2.1.1
60x000x09691f73GLIBC_2.1.3
GLIBC_2.1.2
70x000x0d696912GLIBC_2.2
GLIBC_2.1.3
80x000x09691a71GLIBC_2.2.1
GLIBC_2.2
90x000x09691a72GLIBC_2.2.2
GLIBC_2.2.1
100x000x09691a73GLIBC_2.2.3
GLIBC_2.2.2
110x000x09691a74GLIBC_2.2.4
GLIBC_2.2.3
120x000x09691a76GLIBC_2.2.6
GLIBC_2.2.4
130x000x0d696913GLIBC_2.3
GLIBC_2.2.6
140x000x09691972GLIBC_2.3.2
GLIBC_2.3
150x000x09691973GLIBC_2.3.3
GLIBC_2.3.2
160x000x09691974GLIBC_2.3.4
GLIBC_2.3.3
170x000x0d696914GLIBC_2.4
GLIBC_2.3.4
180x000x0d696915GLIBC_2.5
GLIBC_2.4
190x000x0963cf85GLIBC_PRIVATE
GLIBC_2.5
200x000x0b792650GCC_3.0
在本示例中,1ibc.so.6共享庫文件支持原先為GLIBC版本2.0到2.5而開發的所有動態執行文件。注意:也可以使用objmp命令來從共享庫文件中提取soname,命令如下所示:
#objmp--all-headers/lib/libcrypto.so.0.9.8b|grepSONAME
SONAMElibcrypto.so.6
objmp:/lib/libcrypto.so.0.9.8b:
接下來,將討論rpm軟體包是如何生成的,以便在新系統上安裝rpm軟體包時,這些共庫依賴性是己知的。
三、Rpm軟體包和共享庫依賴性
程序員生成rpm軟體包時,ldd命令用於報告動態可執行文件軟體包中所有動態可執行文件使用的所有共享庫。另一個混亂是由下面的事實帶來的:相同軟體包中的不同動態可執行文件可能與相同的共享庫軟體包的不同版本進行鏈接。例如,Heartbeat軟體包中的不同程序可能已經進行了開發,並動態鏈接到libc.so.6sonmae共享庫文件的不同GLIBC版本。對rpm命令使用-q和--requires參數,可以看到rpm軟體包需要的共享庫的完整清單。例如,要看到Heartbeatrpm軟體包所有的所需依賴性,請使用命令:
#rpm-q--requires-pheartbeat-1.x.x.i386.rpm
這產生了下面的報告:
sysklogd
/bin/sh
/bin/sh
/usr/bin/python
ld-linux.so.2
libapphb.so.0
libc.so.6
libc.so.6(GLIBC_2.0)
libc.so.6(GLIBC_2.1)
libc.so.6(GLIBC_2.1.3)
libc.so.6(GLIBC_2.2)
libc.so.6(GLIBC_2.3)
libccmclient.so.0
libdl.so.2
libglib-1.2.so.0
libhbclient.so.0
libpils.so.0
libplumb.so.0
libpthread.so.0
librt.so.1
libstonith.so.0
注意,在此報告中,libc.so.6soname是所需要的,此共享庫必須支持使用GLIBC共享軟體包版本號2.0、2.1、2.1.3、2.2和2.3進行鏈接的動態可執行文件。這是由下面的事實決定的:Heartbeat軟體包中的不同動態可執行文件是針對不同版本的libc.so.6庫的每個版本進行鏈接的。在了解了動態可執行文件、共享對象、soname和共享庫軟體包彼此是如何相關的後,下面准備來看這樣的一個例子:當嘗試安裝rpm軟體包,並且它由於依賴性錯誤而失敗時,會發生什麼。yum能夠從指定的伺服器自動下載RPM包並且安裝,可以自動處理依賴性關系,並且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安裝。
四、手工解決依賴性問題
通常,當嘗試安裝發行版中沒有包括的軟體包(及不能由像up2date、apt-get或Yum一樣的更新工具自動解決其依賴性的軟體包)時,將碰到rpm依賴性錯誤。例如,如果嘗試在老的Linux發行版上使用rpm–ivh*rpm命令,例如所有的Heartbeatrpm包,那麼在安裝過程中就可能碰到下面的錯誤:
error:faileddependencies:
libc.so.6(GLIBC_2.3)isneededbyheartbeat-1.x.x
libc.so.6(GLIBC_2.3)isneededbyheartbeat-pils-1.x.x
libcrypto.so.0.9.6isneededbyheartbeat-stonith-1.x.x
libsnmp-0.4.2.6.soisneededbyheartbeat-stonith-1.x.x
注意,rpm命令沒有干擾報告所需的每個GLIBC共享庫軟體包版本號——它只報告所需的最高編號的版本號(GLIBC_2.3)。(假定原來的軟體包開發人員不會將相同軟體包中的可執行文件鏈接到不兼容版本的共享庫軟體包)所有的這些故障都報告所需的共享庫名稱或soname(而不是文件名稱,soname始終以「lib」開始)。但可以刪除添加到rpm報告的soname結束的版本號,並快速檢查以查看是否在系統中使用locate命令安裝這些共享庫(假設您的locate資料庫是最新的,有關更多信息,請參閱locate或slocate的手冊頁)。例如,

『叄』 誰能給我個C語言程序源代碼。

這是我做的課程設計,圖像動畫!你可以看看!
/* Note:Your choice is C IDE */
#include "graphics.h"
#include "stdlib.h"
main()
{
int driver=DETECT ,mo;
void qp();
void hu();
void dong1();
void tuzi();
initgraph(&driver,&mo," ");
qp();
hu();
dong1();
qp();
tuzi();

}
void qp()
{
int i;
setcolor(13);
setbkcolor(11);
for(i=0;i<=500;i++)
{
circle(320,240,i);
delay(5000);
}
cleardevice();
}
void hu()
{
int i,j;
setcolor(7);
setbkcolor(11);

arc(550,73,91,283,65);
arc(600,68,130,240,80);/*月亮*/
setfillstyle(1,15);
floodfill(490,70,7);
for(i=50;i<=400;i+=20)
for(j=50;j<=150;j+=12)
circle(i,j,1);

moveto(545,20);
lineto(550,30);
lineto(560,35);
lineto(550,40);
lineto(545,50);
lineto(540,40);
lineto(530,35);
lineto(540,30);
lineto(545,20);/*星星*/
do
{
i=random(15);
setfillstyle(1,i);
floodfill(545,35,7);

}while(!kbhit());

fillellipse(240,230,50,40);/*頭邊框*/
setfillstyle(1,14);
floodfill(240,230,7);
fillellipse(240,238,6,5);/*鼻子*/
setfillstyle(1,6);
floodfill(240,238,7);
fillellipse(228,233,6,9);/*右眼眶*/
fillellipse(252,233,6,9);/*左眼眶*/
setfillstyle(1,15);
floodfill(228,233,7);
floodfill(252,233,7);
circle(227,231,2);/*右眼球*/
setfillstyle(1,8);
floodfill(227,231,7);
circle(250,231,2);/*左眼球*/
setfillstyle(1,8);
floodfill(250,231,7);
arc(234,244,160,331,8);/*右半邊面鼻子*/
arc(246,244,207,370,8);/*左半邊面鼻子*/
ellipse(240,250,181,359,4,9);/*嘴*/
setfillstyle(1,12);
floodfill(240,254,7);
line(254,244,268,248);
line(254,242,267,238);/*右邊胡須*/
line(226,244,214,248);
line(226,242,212,238);/*左邊胡須*/
line(225,215,255,215);
line(230,207,250,207);
line(233,199,247,199);
line(240,215,240 ,199);/*王字*/
arc(205,195,1,242,16);
setfillstyle(1,14);
floodfill(205,195,7);
arc(275,195,-64,176,16);/*耳朵*/
floodfill(275,195,7);

ellipse(235,320,112,422,40,60);/*身體*/
setfillstyle(1,14);
floodfill(235,320,7);
ellipse(240,230,289,329,65,50);
circle(292,250,8.9);/*左手*/
setfillstyle(1,14);
floodfill(292,250,7);
ellipse(243,230,200,246,80,50);
ellipse(240,215,200,246,75,50);
circle(165,240,9);/*右手*/
setfillstyle(1,14);
floodfill(165,240,7);
ellipse(190,250,190,284,60,110);/*尾巴*/

fillellipse(267,380,30,12);
setfillstyle(1,11);
floodfill(270,380,7);
arc(314,398,83,190,30);
arc(295,380,240,391,25);/*前腿*/
setfillstyle(1,5);
floodfill(300,398,7);
arc(223,408,101,150,38);
arc(197,365,266,338,35);
arc(160,405,-23,74,35);
arc(195,390,138,267,30);/*後腿*/
setfillstyle(1,5);
floodfill(180,400,7);

line(160,240,110,150);
line(110,150,35,200);
line(35,200,60,240);
line(60,240,133,190);
outtextxy(50,195,"Beybey");/*旗*/
setfillstyle(1,12);
floodfill(100,160,7);
setfillstyle(1,9);
floodfill(10,10,7);
getch();
closegraph();

}
void dong1()
{
void *buffer;
int size,i;
size=imagesize(30,140,320,430);
buffer=malloc(size);
getimage(30,140,320,430,buffer);
for(i=6;i<=640;i+=5)
putimage(i,140,buffer,COPY_PUT);
}
void tuzi()
{

int color;
setcolor(14);
arc(0,0,270,360,80);
line(90,20,150,10);
line(80,40,150,60);
line(65,70,130,115);
line(25,95,55,165);/*太陽*/
setfillstyle(1,14);
floodfill(0,0,14);

setbkcolor(11);
setcolor(7);
fillellipse(135,320,60,80);/*身體*/
setfillstyle(1,15);
floodfill(135,320,7);
fillellipse(138,305,7,4);/*嘴*/
setfillstyle(1,8);
floodfill(138,305,7);
circle(121,290,2);
circle(151,287,2);/*眼睛*/
setfillstyle(1,4);
floodfill(121,290,7);
floodfill(151,287,7);
line(156,303,164,300);
line(157,308,165,305);
line(158,312,168,310);
line(117,304,110,300);
line(115,310,108,307);
line(116,313,107,315); /*胡須*/

ellipse(115,339,250,450,16,6);/*右手*/
fillellipse(122,405,17,9);/*後腳*/
setfillstyle(1,15);
floodfill(122,405,7);
arc(197,390,86,209,25);
arc(163,370,293,365,35);/*前腳*/
setfillstyle(1,15);
floodfill(185,385,7);
ellipse(193,320,255,448,16,6);/*左手*/
setfillstyle(1,15);
floodfill(200,320,7);
arc(78,340,133,285,20);
arc(65,347,60,95,20);/*尾巴*/
setfillstyle(1,15);
floodfill(73,340,7);
ellipse(118,275,7,111,55,120);
ellipse(80,275,16,106,55,120);
arc(265,170,177,210,200);/*耳朵*/
setfillstyle(1,15);
floodfill(121,220,7);
setfillstyle(1,15);
floodfill(151,220,7);

line(205,320,245,170);
fillellipse(245,110,50,67);/*氣球*/
setfillstyle(1,12);
floodfill(245,110,7);
arc(80,140,230,265,160 );
arc(80,190,230,258,160 );
arc(80,240,230,258,160 );/*風*/
setcolor(2);
arc(540,430,90,180,70);
arc(400,430,0,100,70);
arc(610,430,130,180,140);
arc(350,430,0,50,120);

while(!kbhit())
for(color=1;color<=15;color++)
{
setcolor(color);
outtextxy(220,100,"Hello");
}

getch();
closegraph();
}

『肆』 那個朋友給個C++游戲代碼最好別出錯!能通過編譯的!

呵呵,沒有QQ的,只有黑白棋的一個
#include "graphics.h" /*圖形系統頭文件*/
#define LEFT 0x4b00 /*游標左鍵值*/
#define RIGHT 0x4d00 /*游標右鍵值*/
#define DOWN 0x5000 /*游標下鍵值*/
#define UP 0x4800 /*游標上鍵值*/
#define ESC 0x011b /* ESC鍵值*/
#define ENTER 0x1c0d /* 回車鍵值*/
int a[8][8]={0},key,score1,score2;/*具體分數以及按鍵與存放棋子的變數*/
char playone[3],playtwo[3];/*兩個人的得分轉換成字元串輸出*/
void playtoplay(void);/*人人對戰函數*/
void DrawQp(void);/*畫棋盤函數*/
void SetPlayColor(int x);/*設置棋子第一次的顏色*/
void MoveColor(int x,int y);/*恢復原來棋盤狀態*/
int QpChange(int x,int y,int z);/*判斷棋盤的變化*/
void DoScore(void);/*處理分數*/
void PrintScore(int n);/*輸出成績*/
void playWin(void);/*輸出勝利者信息*/
/******主函數*********/
void main(void)
{
int gd=DETECT,gr;
initgraph(&gd,&gr,"c:\\tc"); /*初始化圖形系統*/
DrawQp();/*畫棋盤*/
playtoplay();/*人人對戰*/
getch();
closegraph();/*關閉圖形系統*/
}
void DrawQp()/*畫棋盤*/
{
int i,j;
score1=score2=0;/*棋手一開始得分都為0*/
setbkcolor(BLUE);
for(i=100;i<=420;i+=40)
{
line(100,i,420,i);/*畫水平線*/
line(i,100,i,420); /*畫垂直線*/
}
setcolor(0);/*取消圓周圍的一圈東西*/
setfillstyle(SOLID_FILL,15);/*白色實體填充模式*/
fillellipse(500,200,15,15); /*在顯示得分的位置畫棋*/
setfillstyle(SOLID_FILL,8); /*黑色實體填充模式*/
fillellipse(500,300,15,15);
a[3][3]=a[4][4]=1;/*初始兩個黑棋*/
a[3][4]=a[4][3]=2;/*初始兩個白棋*/
setfillstyle(SOLID_FILL,WHITE);
fillellipse(120+3*40,120+3*40,15,15);
fillellipse(120+4*40,120+4*40,15,15);
setfillstyle(SOLID_FILL,8);
fillellipse(120+3*40,120+4*40,15,15);
fillellipse(120+4*40,120+3*40,15,15);
score1=score2=2; /*有棋後改變分數*/
DoScore();/*輸出開始分數*/
}
void playtoplay()/*人人對戰*/
{
int x,y,t=1,i,j,cc=0;
while(1)/*換棋手走棋*/
{
x=120,y=80;/*每次棋子一開始出來的坐標,x為行坐標,y為列坐標*/
while(1) /*具體一個棋手走棋的過程*/
{
PrintScore(1);/*輸出棋手1的成績*/
PrintScore(2);/*輸出棋手2的成績*/
SetPlayColor(t);/*t變數是用來判斷棋手所執棋子的顏色*/
fillellipse(x,y,15,15);
key=bioskey(0);/*接收按鍵*/
if(key==ESC)/*跳出遊戲*/
break;
else
if(key==ENTER)/*如果按鍵確定就可以跳出循環*/
{
if(y!=80&&a[(x-120)/40][(y-120)/40]!=1
&&a[(x-120)/40][(y-120)/40]!=2)/*如果落子位置沒有棋子*/
{
if(t%2==1)/*如果是棋手1移動*/
a[(x-120)/40][(y-120)/40]=1;
else/*否則棋手2移動*/
a[(x-120)/40][(y-120)/40]=2;
if(!QpChange(x,y,t))/*落子後判斷棋盤的變化*/
{
a[(x-120)/40][(y-120)/40]=0;/*恢復空格狀態*/
cc++;/*開始統計嘗試次數*/
if(cc>=64-score1-score2) /*如果嘗試超過空格數則停步*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
break;
}
else
continue;/*如果按鍵無效*/
}
DoScore();/*分數的改變*/
break;/*棋盤變化了,則輪對方走棋*/
}
else/*已經有棋子就繼續按鍵*/
continue;
}
else /*四個方向按鍵的判斷*/
if(key==LEFT&&x>120)/*左方向鍵*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
x-=40;
fillellipse(x,y,15,15);
}
else
if(key==RIGHT&&x<400&&y>80)/*右方向鍵*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
x+=40;
fillellipse(x,y,15,15);
}
else
if(key==UP&&y>120)/*上方向鍵*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
y-=40;
fillellipse(x,y,15,15);
}
else
if(key==DOWN&&y<400)/*下方向鍵*/
{
MoveColor(x,y);
fillellipse(x,y,15,15);
SetPlayColor(t);
y+=40;
fillellipse(x,y,15,15);
}
}
if(key==ESC)/*結束游戲*/
break;
if((score1+score2)==64||score1==0||score2==0)/*格子已經占滿或一方棋子為0判斷勝負*/
{
playWin();/*輸出最後結果*/
break;
}
t=t%2+1; /*一方走後,改變棋子顏色即輪對方走*/
cc=0; /*計數值恢復為0*/
} /*endwhile*/
}
void SetPlayColor(int t)/*設置棋子顏色*/
{
if(t%2==1)
setfillstyle(SOLID_FILL,15);/*白色*/
else
setfillstyle(SOLID_FILL,8);/*灰色*/
}
void MoveColor(int x,int y)/*走了一步後恢復原來格子的狀態*/
{
if(y<100)/*如果是從起點出發就恢復藍色*/
setfillstyle(SOLID_FILL,BLUE);
else/*其他情況如果是1就恢復白色棋子,2恢復黑色棋子,或恢復藍色棋盤*/
switch(a[(x-120)/40][(y-120)/40])
{
case 1:
setfillstyle(SOLID_FILL,15);break; /*白色*/
case 2:
setfillstyle(SOLID_FILL,8);break; /*黑色*/
default:
setfillstyle(SOLID_FILL,BLUE); /*藍色*/
}
}
int QpChange(int x,int y,int t)/*判斷棋盤的變化*/
{
int i,j,k,kk,ii,jj,yes;
yes=0;
i=(x-120)/40; /*計算數組元素的行下標*/
j=(y-120)/40; /*計算數組元素的列下標*/
SetPlayColor(t);/*設置棋子變化的顏色*/
/*開始往8個方向判斷變化*/
if(j<6)/*往右邊*/
{
for(k=j+1;k<8;k++)
if(a[i][k]==a[i][j]||a[i][k]==0)/*遇到自己的棋子或空格結束*/
break;
if(a[i][k]!=0&&k<8)
{
for(kk=j+1;kk<k&&k<8;kk++)/*判斷右邊*/
{
a[i][kk]=a[i][j]; /*改變棋子顏色*/
fillellipse(120+i*40,120+kk*40,15,15);
}
if(kk!=j+1) /*條件成立則有棋子改變過顏色*/
yes=1;
}
}
if(j>1)/*判斷左邊*/
{
for(k=j-1;k>=0;k--)
if(a[i][k]==a[i][j]||!a[i][k])
break;
if(a[i][k]!=0&&k>=0)
{
for(kk=j-1;kk>k&&k>=0;kk--)
{
a[i][kk]=a[i][j];
fillellipse(120+i*40,120+kk*40,15,15);
}
if(kk!=j-1)
yes=1;
}
}
if(i<6)/*判斷下邊*/
{
for(k=i+1;k<8;k++)
if(a[k][j]==a[i][j]||!a[k][j])
break;
if(a[k][j]!=0&&k<8)
{
for(kk=i+1;kk<k&&k<8;kk++)
{
a[kk][j]=a[i][j];
fillellipse(120+kk*40,120+j*40,15,15);
}
if(kk!=i+1)
yes=1;
}
}
if(i>1)/*判斷上邊*/
{
for(k=i-1;k>=0;k--)
if(a[k][j]==a[i][j]||!a[k][j])
break;
if(a[k][j]!=0&&k>=0)
{
for(kk=i-1;kk>k&&k>=0;kk--)
{
a[kk][j]=a[i][j];
fillellipse(120+kk*40,120+j*40,15,15);
}
if(kk!=i-1)
yes=1;
}
}
if(i>1&&j<6)/*右上*/
{
for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]&&k>=0&&kk<8)
{
for(ii=i-1,jj=j+1;ii>k&&k>=0;ii--,jj++)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!=i-1)
yes=1;
}
}
if(i<6&&j>1)/*左下*/
{
for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]!=0&&k<8&&kk>=0)
{
for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!=i+1)
yes=1;
}
}
if(i>1&&j>1)/*左上*/
{
for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]!=0&&k>=0&&kk>=0)
{
for(ii=i-1,jj=j-1;ii>k&&k>=0;ii--,jj--)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!=i-1)
yes=1;
}
}
if(i<6&&j<6)/* 右下*/
{
for(k=i+1,kk=j+1;kk<8&&kk<8;k++,kk++)
if(a[k][kk]==a[i][j]||!a[k][kk])
break;
if(a[k][kk]!=0&&kk<8&&k<8)
{
for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++)
{
a[ii][jj]=a[i][j];
fillellipse(120+ii*40,120+jj*40,15,15);
}
if(ii!=i+1)
yes=1;
}
}
return yes;/*返回是否改變過棋子顏色的標記*/
}
void DoScore()/*處理分數*/
{
int i,j;
score1=score2=0;/*重新開始計分數*/
for(i=0;i<8;i++)
for(j=0;j<8;j++)
if(a[i][j]==1)/*分別統計兩個人的分數*/
score1++;
else
if(a[i][j]==2)
score2++;
}
void PrintScore(int playnum)/*輸出成績*/
{
if(playnum==1)/*清除以前的成績*/
{
setfillstyle(SOLID_FILL,BLUE);
bar(550,100,640,400);
}
setcolor(RED);
settextstyle(0,0,4);/*設置文本輸出樣式*/
if(playnum==1)/*判斷輸出哪個棋手的分,在不同的位置輸出*/
{
sprintf(playone,"%d",score1);
outtextxy(550,200,playone);
}
else
{
sprintf(playtwo,"%d",score2);
outtextxy(550,300,playtwo);
}
setcolor(0);
}
void playWin()/*輸出最後的勝利者結果*/
{
settextstyle(0,0,4);
setcolor(12);
if(score2>score1)/*開始判斷最後的結果*/
outtextxy(100,50,"black win!");
else
if(score2<score1)
outtextxy(100,50,"white win!");
else
outtextxy(60,50,"you all win!");
}

『伍』 004-對象,類和元類

上一篇 我們根據底層源碼,構想畫了一張圖。
那麼他們的底層是如何實現的?
他們之間的關系又是什麼樣的呢?
帶著疑問,讓我們一步步來驗證吧。

通過c++源碼,看下實例對象的底層結構
根類實例對象

QPPerson實例對象-繼承自NSObject

QPCoder實例對象-繼承自QPPerson

可以看到,
1.實例對象直接持有各自成員變數
2.並通過strcut結構體嵌套的方式從父類實例結構體那裡繼承父類實例的成員變數
3.所有的OC實例對象都會從根對象objc_object實例結構體那裡得到他們的第一個成員變數isa。isa指針指向其類型cls。
4.通過驗證發現父類的私有成員變數也會被子類繼承(結構體嵌套),無法顯式訪問(不暴露在.h文件中),但可以通過KVC訪問父類的私有成員變數。

在前面的文章中,探索alloc函數,我們知道了一個實例對象的創建過程。首先alloc函數從cls模板中獲取了一個實例結構體所需要的大小,並調用calloc函數返回所需大小的內存空間,然後initIsa。在initISa中,把isa跟cls綁定,並設置了一些位(引用計數&hasCxx等)。
在這里並沒有直接使用到上面看到QPPerson 或者 QPCoder的結構體,那麼這些結構體有什麼作用?
繼續看我們的c++源碼

QPPerson_IMPL的結構體信息,會被類保存,包括:結構體的大小、setter、getter、成員變數的相對偏移量、屬性修飾等等,這些信息都會被類模板cls保留。
在運行時,我們通過cls創建實例對象,並將實例對象instance的isa和cls綁定。instance直接持有實例變數,並可以通過cls模板中的getter、setter或者直接通過self+相對偏移量訪問它的成員變數。(關於getter&setter&成員變數的訪問,後面單獨寫一篇來講講)

小結:
1.instance直接持成員變數和isa,通過isa綁定了cls。
2.isa是實例成員和cls聯系的橋梁(甚至我們可以修改isa指向來達到修改其類的效果)。
3.cls模板保存了實例結構體構造,屬性成員的getter、setter,實例大小,成員變數的相對偏移量,方法等多個實例可以共享的信息。
4.因此,實例instance的大小隻跟成員變數的數量及大小相關。

那麼cls的底層是如何實現的,元類&父類這些結構又是如何串聯起來的呢?

上面我們研究了實例對象的數據結構。我們知道,所有的instance都會從根實例結構體objc_object那裡繼承isa指針(結構體嵌套),指向其類。那麼類的底層實現是什麼樣的呢?
看下源碼:

類的實現還是比較復雜,後面單獨寫文章分析,這里主要想探索下,實例&類&元類他們是怎麼樣關聯起來的,它們各自的功能是什麼,為什麼這樣設計?
從源碼我們看到,struct objc_class繼承自objc_object,由此可知
1.objc_class結構體跟實例instance一樣都是objc_object,都是對象
2.objc_class也有isa指針
3.objc_class有一個superClass成員
4.跟instace不同,所有的objc_class是統一結構體的模板,擁有相同成員。

我們已經知道實例instance的isa指向objc_class,那麼objc_class的isa指針是不是就是指向元類?superClass指針是不是指向父類?

QPPerson的isa值為0x1000083a0等於metaClass的地址
QPPerson的superClass成員的值為0x7fff806a4088等於superClass的地址,也就是NSObject
總結:
1.類的isa指向元類
2.類的superClass指向父類

元類的指針類型也是Class。
也就是說元類和類是同樣的數據結構,也有isa指針和superClass指針。
那麼元類的isa指針 和 superClass指針指向誰呢?

可以看到:
QPCoder的元類的isa = 0x00007fff806a4060
QPPerson的元類的isa = 0x00007fff806a4060
NSObject的元類的isa = 0x00007fff806a4060
NSObject元類的地址 = 0x00007fff806a4060

結論1:所有元類的isa都指向了根類的元類

QPCoder元類的superClass = 0x00000001000083a0 = QPPerson元類的地址
QPPerson元類的superClass = 0x00007fff806a4060= NSObject元類的地址

結論2:元類的superClass指向父類的元類

這里有個特殊的邊界情況,根類的superClass,根類元類的superClass和isa該指向哪裡?
通過上面的LLDB列印,可知:
NSObject的superClass= 0x0000000000000000,也就是nil
NSObject-meta元類的isa = 0x00007fff806a4060,也就是指向自己,符合我們上面的總結,所有元類的isa都指向根類的元類。
NSObject-meta的superClass = 0x00007fff806a4088 = NSObject。根元類的superclass竟然指向了根
類。

結論3:根類的superClass為nil,根元類的superClass為根類,所有元類的isa都指向根元類,包括根元類自己

通過上面源碼,已經LLDB的列印驗證,我們驗證了實例對象&類&元類的關系及層次結構,以及他們是怎樣同isa和superClass指針綁定關聯的。
下圖是蘋果官方的經典的層次結構圖示,與我們驗證的結果相符。

雖然我們知道了 實例對象&類&元類的層次結構以及他們之間怎麼關聯的。但這里就有個疑問,為什麼要設計元類這一層。

一個程序會有多個同類型的實例對象,他們的公共內容可以放在類模板中,比如對象方法,對象大小,有哪些屬性,成員變數等。
但類對象只會有一個,為什麼還要設計元類呢?類方法為什麼不放在類的一個單獨的list裡面跟對象方法區分?元類還有存在的必要嗎?

當我們po LGPerson.class的時候返回仍然是LGPerson自己。很顯然蘋果也不想對外暴露元類的存在,不希望通過API去訪問元類。那他為什麼還要設計元類呢。

帶著這個疑問,翻閱了一些資料,做下總結。

很顯然我們的類設計的層次結構不能無限循環下去

學而時習之,溫故而知新。特別是嘗試去思考蘋果為什麼這樣設計instance,class和metaclass之間結構,對於面向對象的設計多了一些了解。其中有不足,不對的地方也希望積極留言。

閱讀全文

與有名氣的qp源碼報價相關的資料

熱點內容
app怎麼裝視頻 瀏覽:420
安卓系統下的軟體怎麼移到桌面 瀏覽:78
windows拷貝到linux 瀏覽:753
mdr軟體解壓和別人不一樣 瀏覽:886
單片機串列通信有什麼好處 瀏覽:321
游戲開發程序員書籍 瀏覽:844
pdf中圖片修改 瀏覽:272
匯編編譯後 瀏覽:476
php和java整合 瀏覽:832
js中執行php代碼 瀏覽:445
國產單片機廠商 瀏覽:57
蘋果手機怎麼設置不更新app軟體 瀏覽:287
轉行當程序員如何 瀏覽:496
蘋果id怎麼驗證app 瀏覽:866
查看手機命令 瀏覽:956
抖音反編譯地址 瀏覽:228
如何加密軟體oppoa5 瀏覽:235
java從入門到精通明日科技 瀏覽:98
拆解汽車解壓視頻 瀏覽:600
新版百度雲解壓縮 瀏覽:594