C语言笔记:重学输入和输出

   ACM金牌带你零基础直达C语言精通-课程资料

 本笔记属于船说系列课程之一,课程链接:ACM金牌带你零基础直达C语言精通icon-default.png?t=N7T8https://www.bilibili.com/cheese/play/ep159068?csource=private_space_class_null&spm_id_from=333.999.0.0

你也可以选择购买『船说系列课程-年度会员』产品『船票』,畅享一年内无限制学习已上线的所有船说系列课程:船票购买入口icon-default.png?t=N7T8https://www.bilibili.com/cheese/pages/packageCourseDetail?productId=598

做题网站OJ:HZOJ - Online Judge

Leetcode :力扣 (LeetCode) 全球极客挚爱的技术成长平台

一.三个标准流:stdin、stdout、stderr

标准输出流(stdout)

        对应的文件表示符为:1

        对于为什么打印一行字符串为什么会默认打印倒终端中,因为操作系统把标准输出流定向到了终端环境中。

        程序可以使用标准输出函数(如 printfputs 等)将数据输出到 stdout,从而在终端上显示结果。

标准输入流(stdin)

        对应的文件表示符为:0

        默认在终端环境中进行读取数据。

        用户可以通过键盘向程序提供输入,该输入会被发送到 stdin 中。程序可以使用标准输入函数(如 scanffgets 等)从 stdin 中读取数据。

标准错误输出流(stderr)

        对应的文件表示符为:2

        默认输出定向是终端环境中。

        程序可以使用标准错误输出函数(如 fprintf(stderr, ...))将错误信息输出到 stderr,从而在终端上显示错误。

三个流的缓冲区

代码演示:

1.对于3种流的最基本的使用:
#include<stdio.h>int main() {//利用标准输出流输出printf("hello world\n");// stdoutint n;//利用标准输入流进行读取数据scanf("%d", &n);// stdinprintf("n = %d\n", n);//利用了标准错误输出流进行输出数据perror("out of range\n");//stderrreturn 0;
}

代码执行结果:

2.对于缓冲区的认识:

这段代码是可以执行的:

#include<stdio.h>int main() {printf("alskaskldjaslkdjlaskld123");*((int *)(0)) = 5;return 0;
}

执行结果:

可以看到终端上没有打印printf函数内的内容,但不能说明printf函数那句代码是有错误的,只是内容还在输出缓冲区里面,还没有进行输出,程序就执行崩溃了。

继续往下看:

在printf函数内容种最后加上一个换行符(\n),看输出结果:

因为遇到换行符 \n 时会触发缓冲区的刷新,即将缓冲区中的数据输出到终端中。

这就体现了缓存区的作用。

另一种方法就是使用fflush进行对内容输出:

#include<stdio.h>int main() {printf("alskaskldjaslkdjlaskld123\n");//stdout在操作系统种也是文件//利用fflush函数进行对stdout文件进行冲刷,也就是刷新他的缓冲区//然后内容就会打印到终端上fflush(stdout);*((int *)(0)) = 5;return 0;
}

执行结果:

窥探标准流fscanf和fprintf

程序中如何使用:

#include<stdio.h>int main() {//向标准输出流种输出hello worldfprintf(stdout, "hello world\n");//向标准输入流种读入数据int n;fscanf(stdin, "%d", &n);//向标准错误输出流种打印n的值fprintf(stderr, "n = %d\n", n);return 0;
}

执行结果:

标准流的重定向:

如何讲输出内容重定向输出到一个文件中?

两种方式

第一种方法:

是用freopen函数进行重定向:

如何使用:

#include<stdio.h>int main() {//参数一需要输出的新文件名//参数二以打开文件的什么模式//参数三需要重新定向的文件指针freopen("output.txt", "w", stdout); //r代表读文件,w代表写文件freopen("input.txt", "r", stdin); //r代表读文件,w代表写文件printf("hello freopen yes\n");char s[1000] = {0};//当读入到文件结尾时,循环结束while (scanf("%[^\n]", s) != EOF) {//getchar()从标准输入流中读取一个字符//这里为什么要使用到getchar()//因为在使用scanf时//里面的字符匹配集是非\n就读取//那么在最后遇到\n的时候结束读取//最后输入流中会存留一个\n//然后scanf一直不读取//最后造成了while死循环//所以在这需要使用一个getchar()来对\n进行处理掉getchar();printf("%s | hello world\n", s);}return 0;
}

input.txt(这个文件是需要自己创建,并在里面写东西的):

ni hao
CSDN 
GCC
Good

执行前,只有input.txt和源代码文件:

执行后(a.out是源代码编译后的可执行程序):

发现output.txt在执行程序后被创建出来,再看看output.txt中的内容:

和程序设计还有想法是一样的结果。

第二种方法:

在命令中执行重定向(只能在linux环境下可以使用)

需要用到的源代码:


#include<stdio.h>int main() {char s[1000] = {0};while (scanf("%[^\n]", s) != EOF) {getchar();printf("%s | hello world\n", s);}}

然后进行对源文件的编译:

在进行对执行文件的标准输出流重定向到output.txt文件中, 因为是输出所以需要指向目标文件

在输入的最后,需要手动打入一个文件结束,ctrl + D, 表示输入结束。

然后打开output.txt文件查看:

在试一下对执行文件的标准输入流重定向, 因为是需要读入所以需要目标文件是可执行程序,需要指向自己

用命令行重定向标准错误输出流:

#include<stdio.h>int main() {char s[1000] = {0};int i = 1;while (scanf("%[^\n]", s) != EOF) {getchar();fprintf(stderr, "%d test\n", i++);printf("%s | hello world\n", s);}}

执行命令:

2是表示标准错误流的文件表示符,然后讲标准错误输出流重定向到output_err.txt文件中.

执行效果:

 重学scanf

scanf函数读入缓存区

先用scanf读入两个整形:

现在在缓冲区中有一段内容,然后进行读取,知道读到第一个非法字符.

当读入到空格时,空格就是这个非法字符,此时停止,然后把123转为整形赋值给变量a

然后会跳过空白符,也就是空格,然后再进行读取,在次读到非数字字符时会进行停止,然后给变量b进行赋值.

最后结果,然后缓存区中只有换行符.

scanf读入%c

在当前缓存区中,%c会读取456前面的空格字符,而不是读入'4'这个字符.

下面用程序进行演示:

#include<stdio.h>
int main() {char c1, c2;int a, b;scanf("%d", &a);scanf("%c%c", &c1, &c2);scanf("%d", &b);printf("a = %d, b = %d\n", a, b);printf("c1 = %d, c2 = %d\n", c1, c2);return 0;
}

执行结果:

处理scanf读入残值的技巧

 利用getchar()吞掉一个字符

下面的代码演示:

getchar()的用法
#include<stdio.h>int main() {int a, b;scanf("%d%d", &a, &b);//利用getchar吞掉换行符getchar();char c = 'x';scanf("%c", &c);printf("a = %d, b = %d, c = %c\n", a, b, c);return 0;
}

执行结果:

利用getchar() 吞掉\n符,准确的给字符c进行赋值.

二.实现一个printf函数

第一步:实现printf函数声明:

#include<stdio.h>
int my_printf(const char *format, ...) {}int main() {return 0;
}

第二步:实现输出"hello world"功能

还处理了一个问题%特殊情况处理.

#include<stdio.h>//这个宏定义是测试printf和my_printf区别
#define TEST(format, args...) {\int n1, n2;\n1 = printf(format, ##args);\n2 = my_printf(format, ##args);\printf("n1 = %d, n2 = %d\n", n1, n2);\
}int my_printf(const char *format, ...) {#define PUTC(c) putchar(c), cnt += 1//cnt代表输出了多少个字符int cnt = 0;for (int i = 0; format[i]; i++) {switch (format[i]) {//如果当前字符是%,那么就需要对下个字符进行特殊处理case '%': {switch (format[i + 1]) {//当有两个%时,那就需要打印一个%case '%': {PUTC(format[i + 1]);//对于下个位置已经处理所以需要i+1i++;} break;}} break;default : PUTC(format[i]); break;}//putchar() 是向屏幕上打印一个字符}return cnt;
}int main() {//测试printf和my_printf输出hello worldTEST("hello world\n");//对于printf%%输出就是一个%//由于printf对%是特殊处理,那么对于my_printf也就需要特殊处理TEST("100%%\n");return 0;
}

执行结果:

第三步实现%s输出功能

#include <stdio.h>
#include <stdarg.h>//这个宏定义是测试printf和my_printf区别
#define TEST(format, args...) {\int n1, n2;\n1 = printf(format, ##args);\n2 = my_printf(format, ##args);\printf("n1 = %d, n2 = %d\n", n1, n2);\
}int my_printf(const char *format, ...) {#define PUTC(c) putchar(c), cnt += 1va_list args;//args表示变参列表va_start(args, format);//变参列表从format参数后面开始//cnt代表输出了多少个字符int cnt = 0;for (int i = 0; format[i]; i++) {//这里中间条件用到了format[i],当format[i] = '\0'时表示循环结束switch (format[i]) {//如果当前字符是%,那么就需要对下个字符进行特殊处理case '%': {switch (format[i + 1]) {//当有两个%时,那就需要打印一个%case '%': {PUTC(format[i + 1]);//对于下个位置已经处理所以需要i+1i++;} break;//%后接s那么就是字符串的格式占位符//然后这里就需要用到变参列表的解析case 's': {//获取变参列表的参数,并且该参数的类型为char *类型const char *s = va_arg(args, const char *);//获取到字符串后,进行打印字符串for (int j = 0; s[j]; j++) PUTC(s[j]);//s这个字符被处理掉了,不需要打印了,位置需要往后移i++;} break;}} break;default : PUTC(format[i]); break;}//putchar() 是向屏幕上打印一个字符}return cnt;
}int main() {//测试printf和my_printf输出hello worldTEST("hello world\n");//对于printf%%输出就是一个%//由于printf对%是特殊处理,那么对于my_printf也就需要特殊处理TEST("100%%\n");TEST("%s\n", "hello world 100 %%");return 0;
}

执行结果:

第四步实现%d输出功能

#include <stdio.h>
#include <inttypes.h>
#include <stdarg.h>
#include <math.h>
#include <limits.h>//这个宏定义是测试printf和my_printf区别
#define TEST(format, args...) {\int n1, n2;\n1 = printf(format, ##args);\n2 = my_printf(format, ##args);\printf("n1 = %d, n2 = %d\n", n1, n2);\
}int my_printf(const char *format, ...) {#define PUTC(c) putchar(c), cnt += 1va_list args;//args表示变参列表va_start(args, format);//变参列表从format参数后面开始//cnt代表输出了多少个字符int cnt = 0;for (int i = 0; format[i]; i++) {//这里中间条件用到了format[i],当format[i] = '\0'时表示循环结束switch (format[i]) {//如果当前字符是%,那么就需要对下个字符进行特殊处理case '%': {switch (format[i + 1]) {//当有两个%时,那就需要打印一个%case '%': {PUTC(format[i + 1]);//对于下个位置已经处理所以需要i+1i++;} break;//%后接s那么就是字符串的格式占位符//然后这里就需要用到变参列表的解析case 's': {//获取变参列表的参数,并且该参数的类型为char *类型const char *s = va_arg(args, const char *);//获取到字符串后,进行打印字符串for (int j = 0; s[j]; j++) PUTC(s[j]);//s这个字符被处理掉了,不需要打印了,位置需要往后移i++;} break;//%后接d那么就是整形的格式占位符case 'd': {//获取变参列表的参数,并且该参数的类型为char *类型const int num = va_arg(args, const int);//这里就需要率到如何进行把每一位数字进行输出//因为putchar只能打印单个字符//那么就用数组将数字进行存储起来int8_t arr[20];//int8_t表示只有8位带符号的整形数字,只占8bit位,头文件<inttype.h>//现在进行对num数字每位进行存储在数组中int n = num, ind = 0;if (n < 0) PUTC('-');//n为负数时需要输出负号do {//从个位进行每位存储在数组中arr[ind++] = n % 10;n /= 10;} while(n);//因为n = 0不会进入循环,那么就无法进行输出,所以使用do while循环先执行一次//因为个位在第一位,所以需要倒过来输出for (; ind > 0; ind--) {//ind - 1是因为,当前ind位置是空的,最高位在ind - 1上//当num为负数时需要,将他变为正数进行输出if (num < 0) PUTC(-arr[ind - 1] + '0');else PUTC(arr[ind - 1] + '0');}i++;//与之前的操作同理}}} break;default : PUTC(format[i]); break;}//putchar() 是向屏幕上打印一个字符}return cnt;
}int main() {//测试printf和my_printf输出hello worldTEST("hello world\n");//对于printf%%输出就是一个%//由于printf对%是特殊处理,那么对于my_printf也就需要特殊处理TEST("100%%\n");TEST("%s\n", "hello world 100 %%");int a = 123;TEST("a = %d\n", a);a = 0;TEST("a = %d\n", a);a = INT_MAX;TEST("a = %d\n", a);a = INT_MIN;TEST("a = %d\n", a);return 0;
}

执行结果:

这里我只截取了关于实现%d输出功能的结果

可以发现我们实现的my_printf对于正数,负数,0都可以输出

第五步实现%x输出功能:

#include <stdio.h>
#include <inttypes.h>
#include <stdarg.h>
#include <math.h>
#include <limits.h>//这个宏定义是测试printf和my_printf区别
#define TEST(format, args...) {\int n1, n2;\n1 = printf(format, ##args);\n2 = my_printf(format, ##args);\printf("n1 = %d, n2 = %d\n", n1, n2);\
}char get_16_code(int n) {//当这一位小于10,在16进制中还是用数字表示if (n < 10) return n + '0';//当这一位大于10,在16进制中需要用字母表示//a 10, b 11, c 12, d 13, e 14, f 15return n - 10 + 'a';
}int my_printf(const char *format, ...) {#define PUTC(c) putchar(c), cnt += 1va_list args;//args表示变参列表va_start(args, format);//变参列表从format参数后面开始//cnt代表输出了多少个字符int cnt = 0;for (int i = 0; format[i]; i++) {//这里中间条件用到了format[i],当format[i] = '\0'时表示循环结束//putchar() 是向屏幕上打印一个字符switch (format[i]) {//如果当前字符是%,那么就需要对下个字符进行特殊处理case '%': {switch (format[i + 1]) {//当有两个%时,那就需要打印一个%case '%': {PUTC(format[i + 1]);//对于下个位置已经处理所以需要i+1i++;} break;//%后接s那么就是字符串的格式占位符//然后这里就需要用到变参列表的解析case 's': {//获取变参列表的参数,并且该参数的类型为char *类型const char *s = va_arg(args, const char *);//获取到字符串后,进行打印字符串for (int j = 0; s[j]; j++) PUTC(s[j]);//s这个字符被处理掉了,不需要打印了,位置需要往后移i++;} break;//%后接d那么就是整形的格式占位符case 'd': {//获取变参列表的参数,并且该参数的类型为char *类型const int num = va_arg(args, const int);//这里就需要率到如何进行把每一位数字进行输出//因为putchar只能打印单个字符//那么就用数组将数字进行存储起来int8_t arr[20];//int8_t表示只有8位带符号的整形数字,只占8bit位,头文件<inttype.h>//现在进行对num数字每位进行存储在数组中int n = num, ind = 0;if (n < 0) PUTC('-');//n为负数时需要输出负号do {//从个位进行每位存储在数组中arr[ind++] = n % 10;n /= 10;} while(n);//因为n = 0不会进入循环,那么就无法进行输出,所以使用do while循环先执行一次//因为个位在第一位,所以需要倒过来输出for (; ind > 0; ind--) {//ind - 1是因为,当前ind位置是空的,最高位在ind - 1上//当num为负数时需要,将他变为正数进行输出if (num < 0) PUTC(-arr[ind - 1] + '0');else PUTC(arr[ind - 1] + '0');}i++;//与之前的操作同理} break;case 'x': {//因为十六进制输出是不带符号的,所以需要用到无符号整形unsigned int num = va_arg(args, unsigned int);int8_t arr[20], ind = 0;do {//因为需要转换为16进制,所以需要对16进行取余arr[ind++] = num % 16;num /= 16;} while(num);for (; ind > 0; ind--) {//实现一个方法将10进制转为16进制PUTC(get_16_code(arr[ind - 1]));}i++;//同理} break;}} break;default : PUTC(format[i]); break;}}return cnt;
}int main() {//测试printf和my_printf输出hello worldTEST("hello world\n");//对于printf%%输出就是一个%//由于printf对%是特殊处理,那么对于my_printf也就需要特殊处理TEST("100%%\n");TEST("%s\n", "hello world 100 %%");int a = 123;TEST("a = %d\n", a);a = 0;TEST("a = %d\n", a);a = INT_MAX;TEST("a = %d\n", a);a = INT_MIN;TEST("a = %d\n", a);TEST("123 = %x\n", 123);TEST("-1 = %x\n", -1);TEST("INT_MAX = %x\n", INT_MAX);TEST("INT_MIN = %x\n", INT_MIN);return 0;
}

执行结果:

总结:

        对于printf的功能,肯定没有实现完整,但是对于常用的用法都是实现了,在没有实现的用法,你可以下去自己尝试去实现那些功能.

本章小结:

        对于标准输出和输入在本章有了新的认识和理解,对于scanf和printf函数也有了新的认识.

        在最后的实现printf函数,看完课程后跟着船长实现了一遍,然后在自己通过自己的想法再来实现一遍,这样更加巩固了你所学的知识.

        最后加油,看最后加油,看到这里你已经超过百分之95的人了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/772413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI新工具 视频迁移升级中国水墨画风格2.0;新颖的视频编辑框架提示编辑,风格转移,身份操控都不在话下;提取多种风格人脸草图

✨ 1: DomoAI 升级中国水墨画风格2.0 DomoAI是一个多功能的AI视频处理工具&#xff0c;可以将视频转换成多种风格&#xff0c;包括日本动漫、3D卡通、漫画和像素风格等。用户只需上传原始视频&#xff0c;通过简单的操作就能实现风格转换&#xff0c;制作出具有个性的高质量视…

“架构(Architecture)” 一词的定义演变历史(依据国际标准)

深入理解“架构”的客观含义&#xff0c;不仅能使IT行业的系统架构设计师提升思想境界&#xff0c;对每一个积极的社会行动者而言&#xff0c;也具有长远的现实意义&#xff0c;因为&#xff0c;“架构”一词&#xff0c;不只限于IT系统&#xff0c;而是指各类系统(包括社会系统…

蓝鹏智能测量仪应用于这些方面!助力发展新质生产力!

新质生产力是未来几年着重发展的方向&#xff0c;关于如何实现产业化升级&#xff0c;各厂家会在自身的基础上进行产业化调整升级&#xff0c;利用新工具、新手段&#xff0c;大幅缩短研发设计周期&#xff0c;从而让产品迭代速度不断加快&#xff1b;提升产品品质&#xff0c;…

堆排序(六大排序)

前面博客已经分享过堆的知识了&#xff0c;今天我们来分享堆排序。 堆排序 堆排序(Heapsort)是指利用堆积树&#xff08;堆&#xff09;这种数据结构所设计的一种排序算法&#xff0c;它是选择排序的一种。它是通过堆来进行选择数据。 ★★★需要注意的是排升序要建大堆&#…

3、创建项目,什么是路由

一、创建项目 第一次全局安装脚手架 npm install -g vue/clivue create 项目名 二、什么是路由&#xff1f; 路由就是一组 key-value 的对应关系多个路由&#xff0c;需要经过路由器的管理 1、后端路由&#xff1a; 每个url地址都对应着不同的静态资源对于普通的网站。所有…

24计算机考研调剂 | 【官方】湘潭大学

湘潭大学 考研调剂要求 招生专业&#xff1a; 调剂基本要求&#xff1a; &#xff08;1&#xff09;基本要求同《湘潭大学2024年硕士研究生复试录取工作方案》。 &#xff08;2&#xff09;初试成绩要求&#xff1a; 初试成绩各单科均须达到A类考生进入复试的初试成绩基本要…

007 日期类型相关工具类

推荐一篇文章 http://t.csdnimg.cn/72F7Jhttp://t.csdnimg.cn/72F7J

golang+vue微服务电商系统

golangvue微服务电商系统 文章目录 golangvue微服务电商系统一、项目前置准备二、项目简介三、代码GItee地址 golang、vue redis、mysql、gin、nacos、es、kibana、jwt 一、项目前置准备 环境的搭建 官方go开发工程师参考地址&#xff1a;https://blog.csdn.net/qq23001186/cat…

刷题记录:最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&#xff1a; 输…

【保姆级讲解Edge兼容性问题解决方法】

&#x1f308;个人主页:程序员不想敲代码啊&#x1f308; &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家&#x1f3c6; &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d; 希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提…

java算法第32天 | 贪心算法 part02 ● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

122.买卖股票的最佳时机II 本题中理解利润拆分是关键点&#xff01; 不要整块的去看&#xff0c;而是把整体利润拆为每天的利润。假如第 0 天买入&#xff0c;第 3 天卖出&#xff0c;那么利润为&#xff1a;prices[3] - prices[0]。 相当于(prices[3] - prices[2]) (prices[…

从IO操作与多线程的思考到Redis-6.0

IO操作->线程阻塞->释放CPU资源->多线程技术提升CPU利用率 在没有涉及磁盘操作和网络请求的程序中&#xff0c;通常不会出现线程等待状态。线程等待状态通常是由于线程需要等待某些事件的发生&#xff0c;比如I/O操作完成、网络请求返回等。如果程序只是进行计算或者简…

常见端口及对应服务

6379 redis未授权 7001、7002 weblogic默认弱口令、反序列化 9200、9300 elasticsearch 参考乌云&#xff1a;多玩某服务器ElasticSearch命令执行漏洞 11211 memcache未授权访问 50000 SAP命令执行 50070、50030 hadoop默认端口未授权访问

6个步骤轻松实现 postman 接口压力测试(建议收藏)

这里讲是postman做接口并发测试&#xff0c;基础用法不做赘述 1、第一步接口可以通的情况下点击右上角save 2、将相应信息填入 3、如果是同一个接口修改不同的值如下图 4、点击左上角Runner 5、选择刚才所建接口集合、填入要执行次数 6、查看运行结果 总结&#xff1a; 感谢每…

【Java项目】基于SSM的高校四六级报名管理系统

背景 随着互联网的迅速推广&#xff0c;大学英语四六级报名管理系统在网络技术的支持下实现了迅速进步。首先&#xff0c;该系统需基于学生的实际需求进行开发&#xff0c;通过深入了解学生的需求来构建具有针对性的功能&#xff0c;同时利用网络为学生提供的便捷性对系统进行…

Redis数据类型bitMap以及解决的相关实际需求

在Redis数据库中&#xff0c;Bitmap&#xff08;位图&#xff09;是一种特殊的数据结构&#xff0c;它不是一个独立的数据类型&#xff0c;而是基于String类型实现的。Bitmap主要用于存储大量二进制位&#xff08;0或1&#xff09;的数据&#xff0c;这些位可以代表不同的状态或…

鸿蒙开发实例:【demo-搜索历史记录】

图片演示效果&#xff1a; 鸿蒙OS开发更多内容↓点击HarmonyOS与OpenHarmony技术鸿蒙技术文档开发知识更新库gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md在这。或mau123789学习&#xff0c;是v喔 代码演示&#xff1a; // 注&#xff1a;当前代码基于宽度为…

Java代码基础算法练习-报数问题-2024.03.26

任务描述&#xff1a; 有n个人围成一个圆圈分别编号1~n,从第1个到m循环报数&#xff0c;凡是报到m者离开&#xff0c;求n个 人离开圆圈的次序。 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.ArrayList; import java.util.List; import j…

时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测

时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测&#xff08;完整源码和数据…

【王道训练营】第6题 输入一个整型数,判断是否是对称数,如果是,输出yes,否则输出no

文章目录 我的代码改正代码其他代码 我的代码 没有完成 #include<stdio.h> int main(){int a;int b;int c0;//位数int d0;//比较几次scanf("%d",&a);while(b!0){bb/10;c;}dc/2;//比较几次int ffor(int i0 ;i<d;i){int ec;//位数fa - a / (((e-i-1)*10…