为什么选择Golang?
假设你作为一个小白去论坛上问,我应该学习那门编程语言? 有人可能会说,你必须去学C语言!因为这个世界上所有软件底层都是C写的!不懂C语言的不是一个合格的程序员!还有人可能会说,来学Python吧,Python入门简单,可以很快让你感受到编程的乐趣,也有人会让你学习Java,然后什么跨平台啊,一次编写到处运行,面向对象哦,巴拉巴拉。。。 相信这是大多数人的回答,很多人说C/C++的性能好但是学起来难,Python语言简单易学但是性能差,js从前端客户端到后台,全是js实现,Java可以一次编写到处运行,但是同js一样拖着虚拟机,吃内存! 那么,有没有一种语言,既有高性能,又有简单的语法,还方便跨平台,并且不用拖着笨重的运行时/虚拟机吃内存呢? 有的兄弟,有的,不过像这么优秀的语言可没有9门,恰好呢本文的主角Golang满足了这些苛刻的要求。 在2025年的今天,Golang在TIOB排行第7名,并且仍保持上升的趋势,成为最流行的编程语言之一。 一门简单的语言 那有人要问,Golang它怎么就简单了?这里我要说,一门语言的简单应该体现在多个方面。 快速搭建开发环境 如果你学过c/c++,你就会发现搭建开发环境实在是很复杂,比如,gcc和clang?选哪个编译器?makefile是什么?我怎么代码补全?怎么有些ide还内置编译器啊?卧槽你用的什么C标准,我编译不过去! 如果是Golang,那你和我的go run说去吧,一键安装sdk,gopls现代化lsp帮你补全代码,版本随便升级,依旧编译成功! 语法简单易学 Golang只有大约25个关键字,相比之下,C++有近百个关键字,Java也有50多个。 现代化,统一的包管理器 c/c++: 我想找个三方库,一会cmake一会xmake,不同系统还有不同的标准库! Python: conda? pip? uv? venv虚拟环境?怎么包都是c/c++写的啊,乱七八糟! Java: gradle? maven? 我的JDBC升级了怎么连接不上数据库? js: npm? yarn? node?浏览器?我的npm包又冲突了! Golang的包管理是去中心化的,你不必上传到由任何组织管理的中央仓库,只需要一个公开的git仓库,用git tag控制版本,任何人都可以直接通过go get引用你的代码。同时,Golang官方提供缓存,不必担心git仓库删库跑路。 跨平台兼容 也许你听说Java所谓的一次编写,到处运行,但是这真的是跨平台吗?依我看来,Java这种语言是伪跨平台,你的目标平台必须拥有jre,依赖于运行时才可以到处运行。 那Golang的跨平台呢,相比于Java,Golang是纯正的编译性语言,它没有字节码这种中间产物,但是golang做到了世界上最强的交叉编译能力,你可以用go build生成不同平台的可执行文件,并且你可以用go tool dist list查看支持的平台。 几乎可以实现一次编写,随处编译! 单一平台,编译出任何其他平台的可执行文件,无需额外依赖,仅需更改参数即可
Powershell美化
使用vscode打开配置文件 1code $PROFILE 编写Prompt函数 该函数返回值即为powersehll显示效果。 1function Prompt { 2 $dir = $PWD.Path 3 $branch = "" 4 if (Test-Path "${dir}/.git/HEAD") { 5 $head = Get-Content "${dir}/.git/HEAD" 6 $branch = $head -replace 'ref: refs/heads/', '' 7 $branch = " git:($branch)" 8 } 9 10 $currentTime = Get-Date -Format " HH:mm:ss" 11 12 # 获取当前路径的最后一级文件夹 13 $currentDir = Split-Path (Get-Location) -Leaf 14 if ($dir -eq $env:userprofile) { 15 $currentDir = "~" 16 } 17 18 19 $batteryInfo = Get-CimInstance -ClassName Win32_Battery 20 $battery = "" 21 if ($batteryInfo.BatteryStatus -eq 2) { 22 $battery = " ⚡" + $batteryInfo.EstimatedChargeRemaining + "%" 23 } else { 24 $battery = " 🔋" + $batteryInfo.EstimatedChargeRemaining + "%" 25 } 26 27 $promptString = "➜ " + $currentDir 28 29 "`e[1;32m" + $promptString +"`e[1;33m" + $battery + "`e[1;36m" + $currentTime + "`e[1;34m" + $branch + "`e[m " 30} 效果 ...
Linux系统程序设计实验记录
学校里开设的稍微有点用的一节课,所有代码均在ubuntu20.04下测试成功。 文件操作 1、利用creat()、open()和close()函数进行系统调用,实现创建、打开和关闭一个文件。 (1)以可读写方式新建并关闭一个文件“stu.txt”,如果成功则返回新建文件的文 件名,不成功则输出错误提示信息。 (2) 以可读写方式打开并关闭一个文件“file.txt”,如果成功则返回文件的文件名, 不成功则输出错误提示信息。 1#include <sys/stat.h> 2#include <fcntl.h> 3#include <unistd.h> 4#include <stdio.h> 5 6int main() 7{ 8 const char *stufilename = "stu.txt"; 9 int stufd = creat(stufilename, S_IRWXG); 10 if (stufd == -1) 11 { 12 printf("%s creat failed\n", stufilename); 13 } 14 close(stufd); 15 16 const char *filename = "file.txt"; 17 int filefd = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0777); 18 if (filefd == -1) 19 { 20 printf("%s open failed!\n", filename); 21 } 22 23 return 0; 24} 2、编程实现一个简单的学生信息管理程序: (1)从键盘输入3个学生信息(学号、姓名、年龄),存放于结构体数组中,将结 构体写入文件“stu.txt”中。 (2)从键盘输入某个学生的学号,从“stu.txt”文件中读出指定学号的学生的全部 信息并显示。 (3) 实现人机交互操作:可以循环查询并显示查询结果,直到用户不再操作,结 束程序运行。 ...
使用Python在0.96oled上显示状态信息
查看引脚定义 依赖安装 1pip install psutil luma.core luma.oled 代码 1import subprocess 2import time 3import socket 4import psutil 5from luma.core.interface.serial import i2c, spi 6from luma.core.render import canvas 7from luma.oled.device import ssd1306, ssd1325, ssd1331, sh1106 8 9serial = i2c(port=2, address=0x3C) 10device = ssd1306(serial) 11 12def get_cpu_temperature(): 13 with open('/sys/class/thermal/thermal_zone0/temp', 'r') as file: 14 temperature = int(file.read()) / 1000.0 15 return temperature 16 17cmd = "hostname -I | cut -d\' \' -f1" 18IP = subprocess.check_output(cmd, shell=True).decode().strip() 19 20 # 将字节转换为 GB 21def bytes_to_gb(bytes): 22 return bytes / (1024 ** 3) 23 24# 将字节转换为合适的单位 25def convert_size(size): 26 # 定义单位列表 27 units = ['B', 'KB', 'MB', 'GB', 'TB'] 28 29 # 迭代转换单位直到小于1024 30 for unit in units: 31 if size < 1024: 32 return f"{size:.2f} {unit}" 33 size /= 1024 34 35 return f"{size:.2f} {units[-1]}" 36 37# 获取初始的输入输出流量 38net_io_start = psutil.net_io_counters() 39 40while True: 41 with canvas(device) as draw: 42 cmd = "hostname -I | cut -d\' \' -f1" 43 current_IP = subprocess.check_output(cmd, shell=True).decode().strip() 44 timestamp_start = time.time() 45 46 # 等待一秒钟 47 time.sleep(1) 48 49 cpu_usage = psutil.cpu_percent(interval=1) 50 cpu_temperature = get_cpu_temperature() 51 52 # 获取内存占用情况 53 memory = psutil.virtual_memory() 54 55 # 获取总内存大小(以 GB 为单位) 56 total_memory = bytes_to_gb(memory.total) 57 58 # 获取可用内存大小(以 GB 为单位) 59 available_memory = bytes_to_gb(memory.available) 60 61 # 获取已使用内存大小(以 GB 为单位) 62 used_memory = bytes_to_gb(memory.used) 63 64 # 获取内存使用率 65 memory_usage = memory.percent 66 67 disk = psutil.disk_usage('/') 68 total_disk = bytes_to_gb(disk.total) 69 free_disk = bytes_to_gb(disk.free) 70 71 # 获取当前的输入输出流量和时间戳 72 net_io_current = psutil.net_io_counters() 73 timestamp_current = time.time() 74 75 # 计算时间间隔 76 time_interval = timestamp_current - timestamp_start 77 78 # 计算上行和下行网速 79 upload_speed = (net_io_current.bytes_sent - net_io_start.bytes_sent) / time_interval 80 download_speed = (net_io_current.bytes_recv - net_io_start.bytes_recv) / time_interval 81 upload_speed = upload_speed / 2 82 83 # 切换单位 84 upload_speed = convert_size(upload_speed) 85 download_speed = convert_size(download_speed) 86 87 88 # 更新初始的输入输出流量 89 net_io_start = net_io_current 90 91 draw.rectangle(device.bounding_box, outline="white", fill="black") # 让屏幕周围显示一个框 92 draw.text((2,1),f"IP:{current_IP}",fill="white") 93 draw.text((2,11),f"CPU_use:{cpu_usage}%",fill="white") 94 draw.text((2,21),f"CPU_tem:{cpu_temperature:.2f}°C",fill="white") 95 draw.text((2,31),f"MEM:{memory_usage:.2f}%",fill="white") 96 draw.text((2,41), f"DISK:{free_disk:.2f}/{total_disk:.2f}GB", fill="white") 97 draw.text((2,51), f"NET:{upload_speed}/{download_speed}", fill="white") 运行 ...
Miio操作米家台灯
python-miio 是一个由第三方实现的开源 miIO / MIoT 协议库,兼容大多数小米IoT智能家居设备,python-miio 还附带提供了基于命令行的调试工具 miiocli,供感兴趣的终端用户直接进行调用,本文将作为重点进行讲解。 先决条件 局域网内一台安装python环境的主机。 下面是我的配置 主机:nanopc-t4 系统:unbuntu18.04 Python版本:3.6.8 安装python-miio库 1sudo pip3 install python-miio 如果没有pip3工具请先安装python-pip3 1sudo apt-get install python-pip3 安装完成后,输入miiocli,如图所示即可。 获取设备信息 点击下载token_extractor 按照命令行提示输入你的账号密码以及国家即可。 开始操作 米家台灯属于wifi直连的米家设备,可以通过plug指令进行控制,目前我只尝试过三种指令,获取设备状态,开灯,关灯。 根据miio plug --help的提示信息,plug类型设备支持下列操作: 1Commands: 2 info Get miIO protocol information from the device. 3 off Power off. 4 on Power on. 5 raw_command Send a raw command to the device. 6 set_wifi_led Set the wifi led on/off. 7 status Retrieve properties. 8 usb_off Power off. 9 usb_on Power on. 更新 针对于米家的灯系列–yeelight,其实有更详细的的操作 miiocli yeelight ...
用GO+Ebiten写一个飞机大战
Ebitengine介绍 Ebitengine (旧称 Ebiten) 是一款由Go 语言开发的开源游戏引擎。Ebitengine 的简单 API 可以让您的 2D 游戏开发更加简单快捷,并支持同时发布到多平台。 安装 1$ go get -u github.com/hajimehoshi/ebiten/v2 示例代码 1// Game implements ebiten.Game interface. 2type Game struct{} 3 4// Update proceeds the game state. 5// Update is called every tick (1/60 [s] by default). 6func (g *Game) Update() error { 7 // Write your game's logical update. 8 return nil 9} 10 11// Draw draws the game screen. 12// Draw is called every frame (typically 1/60[s] for 60Hz display). 13func (g *Game) Draw(screen *ebiten.Image) { 14 // Write your game's rendering. 15} 16 17// Layout takes the outside size (e.g., the window size) and returns the (logical) screen size. 18// If you don't have to adjust the screen size with the outside size, just return a fixed size. 19func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) { 20 return 320, 240 21} 22 23func main() { 24 game := &Game{} 25 // Specify the window size as you like. Here, a doubled size is specified. 26 ebiten.SetWindowSize(640, 480) 27 ebiten.SetWindowTitle("Your game's title") 28 // Call ebiten.RunGame to start your game loop. 29 if err := ebiten.RunGame(game); err != nil { 30 log.Fatal(err) 31 } 32} 框架结构 从上面的示例代码可以看出,Ebitengine的使用十分简单,我们只需要一个实现ebiten.Game这个接口的对象,将其传入RunGame即可。 ...
我的第一份C语言代码
运行 这段代码写于2022年期末,作为C语言课程设计。 1#include <stdio.h> 2#include <stdbool.h> 3#include <string.h> 4#include <windows.h> 5#include <time.h> 6 7typedef struct worker_data // 定义保存员工数据的结构体 8{ 9 int Number; // 编号 10 char Name[10]; // 姓名 11 char Department[10]; // 部门 12 int Wages_payable; // 应付工资 13 int Insurance; // 保险 14 int Taxes; // 税金 15 int Real_wags; // 实付工资 16} WD; 17 18void fpWrite(void); // 写入数据 19void fpRade(void); // 显示数据 20void fpInquire(void); // 查找数据 21void fpChange(void); // 修改数据 22void fpDelete(void); // 删除数据 23void about_h(void); // 关于程序 24void cls(void); // 清屏 25void color(int c); // 改变文字颜色 26void putss(WD *PT); // 打印数据函数 27void getss(WD *GT); // 写入数据函数 28 29int main() 30{ 31 while (true) // true是stdbool包中的宏定义,编译时会自动替换为1 32 { 33 cls(); // 清屏 改变字体颜色 打印菜单栏 34 system("color 0A"); 35 printf(" ****************************************************************\n"); 36 printf(" * 工资统计系统 *\n"); 37 printf(" * 1.写入数据 4.修改数据 *\n"); 38 printf(" * 2.显示数据 5.删除数据 *\n"); 39 printf(" * 3.查找数据 6.关于程序 *\n"); 40 printf(" * 0:退出程序 *\n"); 41 printf(" ****************************************************************\n\n"); 42 43 _maed: 44 printf("请输入菜单中对应编码:"); // 通过不同的x值来进入不同函数,实现不同功能 45 46 int x; 47 scanf("%d", &x); 48 49 if (x == 1) 50 { 51 fpWrite(); 52 } 53 else if (x == 2) 54 { 55 fpRade(); 56 } 57 else if (x == 3) 58 { 59 fpInquire(); 60 } 61 else if (x == 4) 62 { 63 fpChange(); 64 } 65 else if (x == 5) 66 { 67 fpDelete(); 68 } 69 else if (x == 6) 70 { 71 about_h(); 72 } 73 else if (x == 0) 74 { 75 return 0; 76 } 77 else 78 { 79 printf("未知的指令:请在0~6中选择输入!\n"); 80 goto _maed; 81 } 82 } 83}; 84 85void fpWrite(void) 86{ 87_Wsz: 88 89 cls(); 90 WD workerW; 91 getss(&workerW); 92 93 FILE *fp = fopen("workerdata.txt", "a"); // 以写入方式打开数据文件,并定义文件指针指向该文件 94 fwrite(&workerW, sizeof(workerW), 1, fp); // 将结构体中的数据以二进制方式写入文件中 95 fclose(fp); // 关闭文件指针 96 97 cls(); 98 printf("写入完成!\n"); 99 printf("输入1继续写入,输入0返回菜单!"); 100_Wsz2: 101 int num; 102 scanf("%d", &num); 103 if (num == 1) 104 { 105 goto _Wsz; 106 } 107 else if (num == 0) 108 { 109 return; 110 } 111 else 112 { 113 printf("未知的指令!请重新输入!"); 114 goto _Wsz2; 115 } 116} 117 118void fpRade(void) 119{ 120 cls(); 121 printf(" 全部工资信息如下: \n\n"); 122 WD workerR; 123 FILE *fp = fopen("workerdata.txt", "r"); // 以只读的方式打开数据文件,并定义文件指针指向该文件 124 while (fread(&workerR, sizeof(workerR), 1, fp)) // 循环读取文件指针的二进制数据,并打印 125 { 126 putss(&workerR); 127 } 128 fclose(fp); 129 130 printf("\n输入0返回菜单\n"); 131_Rsiz: 132 int k; 133 scanf("%d", &k); 134 135 if (k == 0) 136 { 137 cls(); 138 return; 139 } 140 else 141 { 142 printf("输入的数据不对,请重新输入!\n"); // 下面的goto语句来实现重新输入 143 goto _Rsiz; 144 } 145} 146 147void fpInquire(void) 148{ 149 cls(); 150_Isz: 151 char stud[3][10] = {"编号", "姓名", "部门"}; 152 char a[10] = {0}; 153 int size; 154 int size2; 155 int inumber; 156 WD workerI; 157 158 printf("1.按编号查找\n2.按姓名查找\n3.按部门查找\n0.返回上一级\n\n"); 159 160 printf("请输入对应编号选择功能:"); 161 scanf("%d", &size); 162_Isz3: 163 cls(); 164 printf("请输入您要查找的%s:", stud[size - 1]); 165 166 if (size == 1) 167 { 168 int a1 = 1; 169 scanf("%d", &inumber); 170 FILE *fp = fopen("workerdata.txt", "r"); 171 printf("编号%d的员工数据如下:\n", inumber); 172 while (fread(&workerI, sizeof(workerI), 1, fp)) // 循环读取文件指针的二进制数据,并打印 173 { 174 if (workerI.Number == inumber) 175 { 176 putss(&workerI); 177 a1 = 0; 178 } 179 } 180 fclose(fp); 181 182 if (a1 == 1) 183 { 184 printf("\n没有找到编号为%d的员工!请重新输入!\n", inumber); 185 goto _Isz3; 186 } 187 } 188 else if (size == 2) 189 { 190 int a2 = 0; 191 scanf("%s", a); 192 FILE *fp = fopen("workerdata.txt", "r"); 193 while (fread(&workerI, sizeof(workerI), 1, fp)) // 循环读取文件指针的二进制数据,并打印 194 { 195 if (strcmp(workerI.Name, a) == 0) 196 { 197 printf("员工%s数据如下:\n", a); 198 putss(&workerI); 199 a2 = 1; 200 } 201 } 202 *a = 0; 203 fclose(fp); 204 205 if (a2 == 0) 206 { 207 printf("\n没有找到姓名为%s的员工!请重新输入!\n", a); 208 goto _Isz3; 209 } 210 } 211 else if (size == 3) 212 { 213 int a3 = 0; 214 int allnum = 0; 215 int numj = 0; 216 scanf("%s", a); 217 FILE *fp = fopen("workerdata.txt", "r"); 218 printf("部门%s的数据如下:\n", a); 219 while (fread(&workerI, sizeof(workerI), 1, fp)) // 循环读取文件指针的二进制数据,并打印 220 { 221 if (strcmp(workerI.Department, a) == 0) 222 { 223 putss(&workerI); 224 allnum += workerI.Real_wags; 225 numj++; 226 a3 = 1; 227 } 228 } 229 230 *a = 0; 231 fclose(fp); 232 233 if (a3 == 0) 234 { 235 printf("\n没有找到部门为%s的员工!请重新输入!\n", a); 236 goto _Isz3; 237 } 238 239 printf("\n总工资:%d\n平均工资:%lf\n", allnum, 1.0 * allnum / numj); 240 } 241 else 242 { 243 return; 244 } 245 246_Isz2: 247 printf("\n输入1继续查找,输入0返回菜单:\n"); 248 scanf("%d", &size2); 249 250 if (size2 == 1) 251 { 252 cls(); 253 goto _Isz; 254 } 255 else if (size2 == 0) 256 { 257 return; 258 } 259 else 260 { 261 printf("未知的指令,请重新输入!\n"); 262 goto _Isz2; 263 } 264} 265 266void fpChange(void) 267{ 268 cls(); 269_Csiz1: 270 printf("请输入要修改人员的姓名(输入0返回菜单):"); 271 char name[10] = {0}; 272 scanf("%s", name); 273 274 if (strcmp(name, "0") == 0) 275 { 276 277 cls(); 278 return; 279 } 280 281 WD workerC; 282 int i = 1; 283 284 FILE *fp = fopen("workerdata.txt", "r+b"); 285 while (fread(&workerC, sizeof(workerC), 1, fp)) 286 { 287 if (strcmp(workerC.Name, name) == 0) 288 { 289 printf("%s的数据如下:\n", name); 290 291 putss(&workerC); 292 293 fseek(fp, -(long int)sizeof(workerC), SEEK_CUR); 294 295 i = 0; 296 break; 297 } 298 } 299 300 if (i == 1) 301 { 302 printf("没有找到这个人,请重新输入!\n"); 303 goto _Csiz1; 304 } 305 306 printf("请输入修改后的数据!\n"); 307 getss(&workerC); 308 309 fwrite(&workerC, sizeof(workerC), 1, fp); 310 fclose(fp); 311 312 printf("修改完成!\n输入1继续修改,输入0返回菜单!\n"); 313 int k; 314 scanf("%d", &k); 315 if (k == 1) 316 { 317 goto _Csiz1; 318 cls(); 319 } 320 else if (k == 0) 321 { 322 cls(); 323 return; 324 } 325} 326 327void fpDelete(void) 328{ 329 cls(); 330_release: 331 printf("请输入想要删除的人员的名称(输入0返回上级):"); 332 char name[10] = {0}; 333 scanf("%s", name); 334 335 if (strcmp(name, "0") == 0) 336 { 337 cls(); 338 return; 339 } 340 341 FILE *file = fopen("workerdata.txt", "r"); 342 fseek(file, 0, SEEK_END); 343 int num = ftell(file) / sizeof(WD); 344 fseek(file, 0, SEEK_SET); 345 346 WD *all = (WD *)malloc(num * sizeof(WD)); 347 WD *const start = all; 348 while (fread(all++, sizeof(WD), 1, file)) 349 ; 350 fclose(file); 351 352 WD *news = (WD *)malloc((num - 1) * sizeof(WD)); 353 WD *const newIndex = news; 354 355 int offset = 0; 356 for (int i = 0; i < num; ++i) 357 { 358 if (strcmp(name, start[i].Name) == 0) 359 { 360 offset = 1; 361 printf("%s的数据如下:\n", name); 362 putss(start); 363 continue; 364 } 365 *news++ = start[i]; 366 } 367 368 if (offset == 0) 369 { 370 cls(); 371 printf("没有找到这个人,请重新输入!\n"); 372 goto _release; 373 } 374 375 printf("输入yes确认删除数据:"); 376 scanf("%s", name); 377 if (strcmp(name, "yes") == 0) 378 { 379 cls(); 380 printf("删除完成!"); 381 382 system("del /f /s workerdata.txt"); 383 FILE *w = fopen("workerdata.txt", "w"); 384 fwrite(newIndex, sizeof(WD), num - 1, w); 385 fclose(w); 386 } 387 388 free(start); 389 free(newIndex); 390 391 printf("输入1继续删除,输入0返回菜单!\n"); 392_stu: 393 int k; 394 scanf("%d", &k); 395 if (k == 1) 396 { 397 cls(); 398 goto _release; 399 } 400 else if (k == 0) 401 { 402 return; 403 } 404 else 405 { 406 cls(); 407 printf("您输入的数据有误,请重新输入!\n"); 408 goto _stu; 409 } 410} 411 412void about_h(void) 413{ 414 int x, y; 415 int dx, dy; 416 417 cls(); 418 for (int i = 1; i < 20; i++) 419 { 420 421 printf(" /\\_/\\ \n( o.o )\n >^< \n /^\\/^\\\n"); 422 if (i < 15) 423 { 424 color(i); 425 } 426 else 427 { 428 color(i - 15); 429 } 430 printf("\n\n\n\n\n\n\n\n\n\n\n\n"); 431 printf(" "); 432 for (int j = 0; j < i; j++) 433 { 434 printf("* "); 435 } 436 printf("\n 感谢您使用本程序!\n"); 437 printf("\n 作者:肖嘉兴 版本:V2.4\n"); 438 printf(" 了解源代码,请访问-->hackerxiao.online\n"); 439 printf(" "); 440 for (int j = 0; j < i; j++) 441 { 442 printf("* "); 443 } 444 Sleep(200); 445 446 cls(); 447 } 448} 449 450void cls(void) 451{ 452 system("CLS"); 453} 454 455void color(int c) 456{ 457 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); 458} 459 460void putss(WD *PT) 461{ 462 printf("\n编号:%d ", PT->Number); 463 printf("\t姓名:%s ", PT->Name); 464 printf("\t部门:%s ", PT->Department); 465 printf("\t应付工资:%d ", PT->Wages_payable); 466 printf("\t保险:%d ", PT->Insurance); 467 printf("\t税金:%d ", PT->Taxes); 468 printf("\t实付工资:%d \n", PT->Real_wags); 469} 470 471void getss(WD *PT) 472{ 473 printf("编号:"); 474 scanf("%d", &PT->Number); 475 printf("姓名:"); 476 *PT->Name = 0; 477 scanf("%s", PT->Name); 478 printf("部门:"); 479 *PT->Department = 0; 480 scanf("%s", PT->Department); 481 printf("应付工资:"); 482 scanf("%d", &PT->Wages_payable); 483 printf("保险:"); 484 scanf("%d", &PT->Insurance); 485 printf("税金:"); 486 scanf("%d", &PT->Taxes); 487 PT->Real_wags = PT->Wages_payable - PT->Insurance - PT->Taxes; 488}