结果是:空格空格3.0e+001,我不明白这加001是怎么回事啊?还有这个printf("%e\n",30.14);结果是3.014000e+001这是怎么算出来的?谁帮我讲下方法?

本文详细解析了C语言中浮点数科学计数法的两种表示方式:一种是固定的有效数字位数(%10.1e),另一种是没有规定有效数字位数(%e)。通过具体的例子说明了这两种格式在输出浮点数时的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 占位符 %10.1e 表示一个科学计数法表示的浮点数,且有效数字不多于 10 位,小数点后有 1 位。这种格式表示 30.14,就是 3.0*10^1,所以第一个输出为 3.0e+001 (尾数3.0,以10为基,指数是1)。 2. 占位符 %e 表示一个科学技术法表示的浮点数,没有规定有效数字。这种格式表示 30.14,就是 3.014*10^1,默认情况下输出的浮点数小数点后有 6 位数字,所以第二个输出 3.014000e+001。
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <windows.h> typedef struct polynomial { //数据结构 float coef; //系数coefficient int expo; //指数exponent struct polynomial * next; } Poly; void menu() { //用户菜单选择界面 printf("\n" "\t*****************************************************************\n" "\n" "\t******************** 请选择操作 ********************\n" "\n" "\t******** 1.给上个x变量赋值,显示计结果 ********\n" "\n" "\t******** 2.一元多项式相 ********\n" "\n" "\t******** 3.一元多项式相减 ********\n" "\n" "\t******** 4.一元多项式相乘 ********\n" "\n" "\n" "\t******** 0.退出计器 ********\n" "\n" "\t*****************************************************************\n" "\n" "\t 您需要执行的是:"); } void insert(Poly *head, Poly *input) { //将一个结点按 指数从大到小顺序 插入到一个链表中 Poly *pre, *now;//记录一个结点和它的下一个结点 int signal = 0;//标记是否结束插入的循环 pre = head;//先令pre为头链表 if (pre->next == NULL) {//如果只有头链表 pre->next = input;//就把input插到头结点的下一个 } else { //非空链表 now = pre->next;//令now为pre的下一个 while (signal == 0) { if (input->expo < now->expo) { //如果要插入的链表的指数小于now的,那么 if (now->next == NULL) {//如果now的之后没有结点,就把input插到now后面,也就是链表最后 now->next = input; signal = 1;//令结束标志成立,从而这次结束退出循环,插入完成 } else { //如果now后有结点,就把pre和now结点各往后移动一个,然后开始一个新的比较 pre = now; now = pre->next; } } else if (input->expo > now->expo) { //如果要插入的链表的指数大于now的,那么将input插入到pre和now之间 input->next = now; pre->next = input; signal = 1;//令结束标志成立,从而这次结束退出循环,插入完成 } else { //如-果要插入的链表的指数等于now的,那么将input的系数和now的合并 now->coef = now->coef + input->coef;//合并系数 signal = 1;//令结束标志成立,从而这次结束退出循环,插入完成 free(input);//合并后就可以删除input内存,释放空间 if (now->coef == 0) {//如果系数正负相抵消,就删除now结点 pre->next = now->next; free(now); } } } } } Poly *creat(char ch) { //建立多项式 Poly *head, *input;//建立头结点和一个输入结点 float x;//暂时存放系数 int y;//暂时存放指数 int n = 1;//存放多项式次数 head = (Poly *)malloc(sizeof(Poly));//分配头结点内存 head->next = NULL;//初始化next //友好化输入提示 给系数和指数赋值 printf("\n%c(x)的第%d项式系数:", ch, n); scanf("%f", &x);//给系数赋值 while (x != 0) {//如果系数0(系数为0即代表结束),就停地增新结点并赋值后合并入链表 //友好化输入提示 给系数和指数赋值 printf("%c(x)的第%d项式指数:", ch, n++); scanf("%d", &y);//给指数赋值 printf("\n"); input = (Poly *)malloc(sizeof(Poly)); input->coef = x; input->expo = y; input->next = NULL; insert(head, input); //友好化输入提示 给系数和指数赋值 printf("%c(x)的第%d项式系数:", ch, n); scanf("%f", &x);//给系数赋值 } return head;//返回链表的头结点 } Poly *add(Poly *head, Poly *pre) { //多项式相 Poly *input; int flag = 0; //下面这段原理是将第二个链表中的结点一个个合并到第一个链表中,即为相 while (flag == 0) { if (pre->next == NULL) flag = 1; else { pre = pre->next; input = (Poly *)malloc(sizeof(Poly)); input->coef = pre->coef; input->expo = pre->expo; input->next = NULL; insert(head, input); } } return head;//返回第一个链表(合并后的链表)的头结点 } Poly *minus(Poly *head, Poly *pre) { //多项式相减 Poly *input; int flag = 0; //这里和相类似,只是把每个系数取相反数 while (flag == 0) { if (pre->next == NULL) flag = 1; else { pre = pre->next; input = (Poly *)malloc(sizeof(Poly)); input->coef = 0 - pre->coef; input->expo = pre->expo; input->next = NULL; insert(head, input); } } return head; } /** *head1 *head2 两个要相乘的一元多项式链表 return 返回一个相乘结果的一元多项式(乘积) */ Poly *multiply(Poly *head1, Poly *head2) { //多项式相乘 Poly *input, *product, *pre; int flag = 0;//flag为是否结束 相乘步骤循环 的判断条件 product = (Poly *)malloc(sizeof(Poly));//分配乘积 一元多项式 空间 product->next = NULL; head1 = head1->next;//现将第一个链表定位到它的第一个值部分 pre = head2; //相乘原理为:先取第一个链表第一个,然后将第二个链表中的每个和它相乘,将乘积合并入product链表中 //然后再取第一个链表第二个,重复前面步骤,直至全部结束. while (flag == 0) { if (head1 == NULL) {//如果第一个链表元素取尽,结束 flag = 1; continue; } if (pre->next == NULL) {//如果第二个链表元素取尽,第一个链表取下一个,再重乘一遍 pre = head2; head1 = head1->next; continue; } pre = pre->next; input = (Poly *)malloc(sizeof(Poly));//分配新结点存储相乘结果,并用于合并入乘积链表 input->coef = pre->coef*head1->coef;//多项式系数为两系数相乘 input->expo = pre->expo + head1->expo;//多项式指数为两指数相 input->next = NULL;//初始化next insert(product, input);//合并入乘积链表 } return product;//返回乘积 } double calcu(Poly *head, double x) { Poly *s; //多项式 double sum = 0, n; int i; s = head->next;//头结点下一个 while (1) { n = 1; for (i = 0; i < s->expo; i++)//指数运 n = n * x; sum += n * s->coef;//叠 if (s->next == NULL) { return sum; } else s = s->next; } } void print(Poly *fun) {//用来输出一元多项式 Poly *printing; //创立用于遍历链表的结点 int flag = 0;//判定是否继续print的标记 float ex0 = 0;//计常数 printing = fun->next; if (fun->next == NULL) {//如果是空链表,就输出0 printf("0\n"); return; } while (flag == 0) { if (printing->coef > 0 && printing->expo != 0 && fun->next != printing)//fun->next != printing用来判断是否为第一个结点 printf("+"); if (printing->expo != 0) { if (printing->coef == 1);//如果系数是1,就输出系数 else if (printing->coef == -1) printf("-");//如果系数-1,系数就只输出负号 else printf("%.3f", printing->coef);//如果是以上情况,就正常输出系数的值 if (printing->expo > 0) printf("x^%d", printing->expo);//如果指数>0,输出x^ 然后上指数的值 else printf("x^%d ", printing->expo);//如果指数<0,输出x^ 然后上指数的值,再空格 } else if (printing->expo == 0) //如果指数为0,常数增 ex0 += printing->coef; if (printing->next == NULL) { if (ex0 != 0) { printf("+%.3f", ex0);//最后输出常数 } flag = 1; } else printing = printing->next; } printf("\n"); } int main() { Poly *f, *g;//创立了两个结构体指针 int sign = -1;//记录选了菜单的第几个 int start = 0;//记录是否之前进行过计 char flag = &#39;N&#39;;//判断是否继续操作 int flagg = 0;//判断是否继续操作 system("color f0"); while (sign != 0) {//是选了退出的话 menu();//显示开始菜单页面 scanf("%d", &sign);//记录菜单选择 switch (sign) {//进入选项的对应功能 case 0: break;//0就退出 case 1: { double val = 0; if (start != 0) { printf("\n请输入上个结果x的值:"); scanf("%lf", &val); val = calcu(f, val); printf("\n赋值后上个式子结果:%lf\n", val); } else { system("cls"); printf("\n 错误!没有之前运结果!请先进行一次运!\n"); Sleep(1500); } break; } case 2: { system("cls"); printf("PS:输入格式:系数 指数;当输入系数为0时结束!\n"); printf("PS:输入格式:系数 指数;当输入系数为0时结束!\n\n"); printf("开始多项式相:\n"); if (flagg == 1) { printf("上个结果f(x)="); print(f); } if (flagg == 0) { f = creat(&#39;f&#39;); printf("f(x)="); print(f); } g = creat(&#39;g&#39;); printf("g(x)="); print(g); printf("--------------------\n\n"); printf("两个多项式相结果为:\n\n"); printf(" F(x)=f(x)+g(x)="); f = add(f, g); print(f); printf("\n--------------------\n"); sign = -1; start = 1; getchar(); printf("\n是否以结果为一个多项式继续操作?(Y/N):"); scanf("%c", &flag); if (flag == (&#39;Y&#39; | &#39;y&#39;)) { flagg = 1;//标记为继续操作 } else if (flag == (&#39;N&#39; | &#39;n&#39;)) { flagg = 0;//标记为继续操作 } printf("\n已记录您的选择,将在下次操作时生效"); break; } case 3: { system("cls"); printf("PS:输入格式:系数 指数;当输入系数为0时结束!\n"); printf("PS:输入格式:系数 指数;当输入系数为0时结束!\n\n"); printf("开始多项式相减:\n"); if (flagg == 1) { printf("上个结果f(x)="); print(f); } if (flagg == 0) { f = creat(&#39;f&#39;); printf("f(x)="); print(f); } g = creat(&#39;g&#39;); printf("g(x)="); print(g); printf("--------------------\n\n"); printf("两个多项式相减结果为:\n\n"); printf(" F(x)=f(x)-g(x)="); f = minus(f, g); print(f); printf("\n--------------------\n"); sign = -1; start = 1; getchar(); printf("\n是否以结果为一个多项式继续操作?(Y/N):"); scanf("%c", &flag); if (flag == (&#39;Y&#39; | &#39;y&#39;)) { flagg = 1;//标记为继续操作 } else if (flag == (&#39;N&#39; | &#39;n&#39;)) { flagg = 0;//标记为继续操作 } printf("\n已记录您的选择,将在下次操作时生效"); break; } case 4: { system("cls"); printf("PS:输入格式:系数 指数;当输入系数为0时结束!\n"); printf("PS:输入格式:系数 指数;当输入系数为0时结束!\n\n"); printf("开始多项式相乘:\n"); if (flagg == 1) { printf("上个结果f(x)="); print(f); } if (flagg == 0) { f = creat(&#39;f&#39;); printf("f(x)="); print(f); } g = creat(&#39;g&#39;); printf("g(x)="); print(g); printf("--------------------\n\n"); printf("两个多项式相乘结果为:\n\n"); printf(" F(x)=f(x)*g(x)="); f = multiply(f, g); print(f); printf("\n--------------------\n"); sign = -1; start = 1; getchar(); printf("\n是否以结果为一个多项式继续操作?(Y/N):"); scanf("%c", &flag); if (flag == (&#39;Y&#39; | &#39;y&#39;)) { flagg = 1;//标记为继续操作 } else if (flag == (&#39;N&#39; | &#39;n&#39;)) { flagg = 0;//标记为继续操作 } printf("\n已记录您的选择,将在下次操作时生效"); break; } default: { printf("无效指令:请重新选择操作!\n"); system("cls"); break; } } } printf("\n\t***********************\n"); printf("\t* 即将退出!谢谢使用! *\n"); printf("\t***********************\n"); printf("3s后退出\n"); Sleep(1000); printf("2s后退出\n"); Sleep(1000); printf("1s后退出\n"); Sleep(1000); return 1; }给这段代码补充一个一元多项式求导的函数
06-22
#!/bin/bash # 配置参数(可根据需要调整) PID=628 # 目标进程PID INTERVAL=1 # 采集间隔(秒) DURATION=300 # 总采集时长(秒) OUTPUT_FILE="thread_data_$(date +%Y%m%d_%H%M%S).csv" # 检查ADB连接 if ! adb devices | grep -q "device$"; then echo "错误:未检测到连接的设备,请确保ADB已连接" exit 1 fi # 写入CSV表头 echo "timestamp,tid,thread_name,cpu_percent,res_kb" > "$OUTPUT_FILE" echo "开始采集PID $PID 的线程数据,持续 $DURATION 秒,输出至 $OUTPUT_FILE..." # 计采集结束时间 END=$((SECONDS + DURATION)) # 循环采集数据 while [ $SECONDS -lt $END ]; do TIMESTAMP=$(date +%s%3N) # 毫秒级时间戳 # 核心改进: # 1. 用sed过滤ANSI终端控制字符(去除颜色、光标指令) # 2. 用awk提取有效行(过滤标题行、空行) # 3. 动态解析字段(通过关键字定位,避免固定索引错误) adb shell "top -H -p $PID -d 0.1 -n 1" 2>/dev/null | \ sed -r "s/\x1b\[[0-9;]*m//g" | # 移除所有ANSI控制字符 grep -vE "Threads:|Mem:|Swap:|TID|^$" | # 过滤非线程数据行 while read -r line; do # 解析行数据(处理空格分隔,提取关键字段) # 示例行格式:" 5465 system 20 0 11G 43M 15M S 15.3 0.6 5:35.65 SP:img2tensor ..." # 字段含义(按顺序):TID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ THREAD_NAME ... parts=($line) # 按空格分割为数组(自动合并连续空格) # 容错:跳过字段足的行 if [ ${#parts[@]} -lt 12 ]; then continue fi TID=${parts[0]} CPU=${parts[8]} # %CPU在第9个位置(索引8) RES_STR=${parts[5]} # RES在第6个位置(索引5,如"43M") THREAD_NAME=${parts[11]} # 线程名在第12个位置(索引11) # 转换RES为KB(处理M/K单位,默认0) if [[ $RES_STR =~ ([0-9.]+)([MK]) ]]; then VALUE=${BASH_REMATCH[1]} UNIT=${BASH_REMATCH[2]} if [ "$UNIT" = "M" ]; then RES_KB=$(echo "$VALUE * 1024" | bc | awk &#39;{printf "%.0f", $0}&#39;) elif [ "$UNIT" = "K" ]; then RES_KB=$(echo "$VALUE" | bc | awk &#39;{printf "%.0f", $0}&#39;) fi else RES_KB=0 # 无效格式时默认为0 fi # 写入CSV(确保字段完整) echo "$TIMESTAMP,$TID,$THREAD_NAME,$CPU,$RES_KB" >> "$OUTPUT_FILE" done sleep $INTERVAL done echo "采集完成!数据已保存至 $OUTPUT_FILE" 上面脚本对 Threads: 17 total, 3 running, 14 sleeping, 0 stopped, 0 zombie Mem: 7315424K total, 6528388K used, 787036K free, 8032K buffers Swap: 3969620K total, 1024K used, 3968596K free, 1900280K cached 800%cpu 303%user 4%nice 168%sys 303%idle 0%iow 20%irq 2%sirq 0%host TID USER PR NI VIRT RES SHR S[%CPU] %MEM TIME+ THREAD PROCESS 6606 system 20 0 11G 37M 15M S 68.0 0.5 1:43.76 hidl_service@1. vendor.vt.pipeline.hidl_service@1.0-service 6594 system 20 0 11G 37M 15M S 14.0 0.5 0:11.21 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 4931 system 20 0 11G 37M 15M R 14.0 0.5 12:40.99 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6600 system 20 0 11G 37M 15M R 8.0 0.5 0:11.12 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6595 system 20 0 11G 37M 15M S 8.0 0.5 0:11.80 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6596 system 20 0 11G 37M 15M R 8.0 0.5 0:11.03 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6598 system 20 0 11G 37M 15M S 8.0 0.5 0:11.48 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6593 system 20 0 11G 37M 15M S 6.0 0.5 0:10.92 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6597 system 20 0 11G 37M 15M S 5.0 0.5 0:11.87 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6602 system 20 0 11G 37M 15M S 3.0 0.5 0:02.72 stream_callback vendor.vt.pipeline.hidl_service@1.0-service 6599 system 20 0 11G 37M 15M S 2.0 0.5 0:11.23 SP:img2tensor vendor.vt.pipeline.hidl_service@1.0-service 6601 system 20 0 11G 37M 15M S 2.0 0.5 0:02.66 stream_callback vendor.vt.pipeline.hidl_service@1.0-service 6694 system 20 0 11G 37M 15M S 0.0 0.5 0:00.00 streampipe/6597 vendor.vt.pipeline.hidl_service@1.0-service 6607 system 20 0 11G 37M 15M S 0.0 0.5 0:00.00 streampipe/6597 vendor.vt.pipeline.hidl_service@1.0-service 732 system 20 0 11G 37M 15M S 0.0 0.5 0:00.41 HwBinder:628_2 vendor.vt.pipeline.hidl_service@1.0-service 731 system 20 0 11G 37M 15M S 0.0 0.5 0:00.00 HwBinder:628_1 vendor.vt.pipeline.hidl_service@1.0-service 628 system 20 0 11G 37M 15M S 0.0 0.5 0:00.41 hidl_service@1. vendor.vt.pipeline.hidl_service@1.0-service 对这个命令直接打印的解析有问题,无缘无故换行
最新发布
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值