这个怎么说呢
既有意义,但同时也没有意义
先抛开1w5这个价格和编程语言的选择以及少儿编程和竞赛培训不讲
主体在你孩子身上,如果他喜欢并真正爱学,能学进去,那是有帮助的,NOIP前50可以报送清北
但是孩子今年五年级,有些朋友的孩子都报了编程班
只知道小升初有照顾
孩子应该不太感兴趣
如果孩子不感兴趣那是真的一点用都没有
你强让他学,只能让他从无感变得厌恶编程,原本可能你的孩子会在某个时间对计算机着迷,然后开始自学编程,但你这么做可能直接把这种可能性降低到无限接近0%
这个跟C++本身有关
学习曲线极其陡峭,我学的Go/C/C++/Python/Javascript/Kotlin里面C++是最难学习的,他的虚函数/多态/继承/指针等都很难理解掌握,对一个五年级的小孩子来说太难了,而这些可能在他长大之后变得容易理解
贴个C++代码看看吧
#ifndef TABETNN1_H_#define TABETNN1_H_#include
using std::string;
//simple base class
class TableTennisPlayer
{
public:
TableTennisPlayer(const string & fn = "none",
const string & ln = "none", bool ht = false);
void Name() const;
bool HasTable() const { return hasTable; };
void ResetTable(bool v) { hasTable = v; };
private:
string firstname;
string lastname;
bool hasTable;
};
//simple derived class
class RatedPlayer : public TableTennisPlayer
{
private:
unsigned omt rating;
public:
RatedPlayer(unsigned int r = 0, const string & fn = "none",
const string & ln = "none", bool ht = false);
RatedPlayer(unsigned int r, const TableTennisPlayer & tp);
unsigned int Rating() const { return rating; };
void ResetRating (unsigned int r) { rating = r };
};
#endif
这还并没有完全完成
推荐你先学学了解下C++再考虑,如果认为自己学都比较吃力,那就放弃,让孩子学个Python或者Scratch都行
Scratch图形化编程,孩子能接受,也更有意思点,成果出来的也快
Python等更加简单而且动态类型虽然在开发中可能导致问题但你家小孩就是拿着用用,能跑就完事那种,这反而成为优势
#include
int main(){
char str = "b";
std::cout << str + 1;
std::cout << std::endl;
std::cout << str + "1";
return 0;
}
输出:
99
147
因为char实质为0~255的整数,所以并不报错并正常运行,但结果并不是预期,会输出数字
并且char是固定长度的,要先行定义char数组长度或改用std::string
Python会好很多并且很容易理解,上面的C++代码换成Python大概就是这样
>>> s = "b"
>>> print(s + 1)
Traceback (most recent call last):
File "", line 1, in
TypeError: can only concatenate str (not "int") to str
>>> print(str + "1")
"b1"
str不被允许与Int值相加,但这并不算优势,重点在于改写到Python只用了3行代码,与C++相比,Python代码更少,更好理解,类似伪代码,并且容易做出成果
import requests
import demjson
import time
import os
import re
import math
UP_Main_Page_URL = input("请输入UP主的主页URL:")
UP_ID = UP_Main_Page_URL[UP_Main_Page_URL.index(".com/")+5:]
API = rf"https://api.bilibili.com/x/space/arc/search?mid={UP_ID}"
def get_All_Videos_Information(UP_ID):
#经测发现此API现行规定最大单页请求值仅100,后期可能需要修改
#获取所有视频信息
#获取UP主视频创作总数
Page = 1
Video_Count = demjson.decode(requests.get(f"{API}&ps=1&pn=1").text)["data"]["page"]["count"]
Page_Max = math.ceil(Video_Count/100)
Video_Informations = []
while(Page <= Page_Max):
Video_Informations += demjson.decode(requests.get(f"{API}&ps=100&pn={Page}").text)["data"]["list"]["vlist"]
Page += 1
return Video_Informations
def Download_All_Images(Video_Informations):
t1 = time.time()
for Video_Information in Video_Informations:
title = re.sub(r"[/:*?"<>|]", "", Video_Information["title"])+".jpg"
with open(f"{title}","wb") as image:
print(f"Downloading:{title}")
image.write(requests.get(f"https:{Video_Information["pic"]}").content)
time.sleep(0.1)
print(f"完成,耗时{str(time.time()-t1)} s")
Video_Informations = get_All_Videos_Information(UP_ID)
User_Choice = input(f"Up主ID为{UP_ID},共{len(Video_Informations)}张图片,是否下载? (Y/N)")
if User_Choice == "Y":
Download_All_Images(Video_Informations)
直接复制粘贴可能会对排版造成一部分影响
代码实现功能很简单,抓取B站某个UP主的所有视频,然后下载封面
那用C++呢?我并没有写C++版本,但是抓取中比较基础的操作,GET/POST请求对应的C++和Python代码又是什么呢?
//省略头文件#include "HttpConnect.h"
#ifdef WIN32#pragma comment(lib,"ws2_32.lib")#endifHttpConnect::HttpConnect()
{
#ifdef WIN32 //此处一定要初始化一下,否则gethostbyname返回一直为空 WSADATA wsa = { 0 };
WSAStartup(MAKEWORD(2, 2), &wsa);
#endif}
HttpConnect::~HttpConnect()
{
}
void HttpConnect::socketHttp(std::string host, std::string request)
{
int sockfd;
struct sockaddr_in address;
struct hostent *server;
sockfd = socket(AF_INET,SOCK_STREAM,0);
address.sin_family = AF_INET;
address.sin_port = htons(80);
server = gethostbyname(host.c_str());
memcpy((char *)&address.sin_addr.s_addr,(char*)server->h_addr, server->h_length);
if(-1 == connect(sockfd,(struct sockaddr *)&address,sizeof(address))){
DBG <<"connection error!"<
return;
}
DBG << request << std::endl;
#ifdef WIN32 send(sockfd, request.c_str(),request.size(),0);
#else write(sockfd,request.c_str(),request.size());
#endif char buf[1024*1024] = {0};
int offset = 0;
int rc;
#ifdef WIN32 while(rc = recv(sockfd, buf+offset, 1024,0))
#else while(rc = read(sockfd, buf+offset, 1024))
#endif {
offset += rc;
}
#ifdef WIN32 closesocket(sockfd);
#else close(sockfd);
#endif buf[offset] = 0;
DBG << buf << std::endl;
}
void HttpConnect::postData(std::string host, std::string path, std::string post_content)
{
//POST请求方式 std::stringstream stream;
stream << "POST " << path;
stream << " HTTP/1.0 ";
stream << "Host: "<< host << " ";
stream << "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ";
stream << "Content-Type:application/x-www-form-urlencoded ";
stream << "Content-Length:" << post_content.length()<<" ";
stream << "Connection:close ";
stream << post_content.c_str();
socketHttp(host, stream.str());
}
void HttpConnect::getData(std::string host, std::string path, std::string get_content)
{
//GET请求方式 std::stringstream stream;
stream << "GET " << path << "?" << get_content;
stream << " HTTP/1.0 ";
stream << "Host: " << host << " ";
stream <<"User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ";
stream <<"Connection:close ";
socketHttp(host, stream.str());
}
// Useageint main() {
HttpConnect *http = new HttpConnect();
http->getData("127.0.0.1", "/login", "id=liukang&pw=123");
http->postData("127.0.0.1", "/login","id=liukang&pw=123");
}
Python:
import requests
//GET
requests.get("http://www.baidu.com")
//POST
request.post("http://localhost:5000/login",data = {"user":"root","Passwd":"root"})
代码量不是一个数量级
但是C++在开发中比Python优势还是很多的,比如速度/内存占用等,都是Python所无法比拟的
再说说少儿编程和竞赛训练
前者纯学着也没啥用的存在,说他没用,又入门编程了,说有用,也没学会啥
后者由来已久,是有用的,如果你认为你的孩子有天赋能进入NOIP前50并且有意向有兴趣,那完全可以
其实在家里和你孩子一块学学Scratch也挺好的,就当亲子活动得了
如果你是为了攀比而报的这玩意,哪还是算了吧,孩子和你钱包受罪还没啥用
你的孩子才五年级,他没有多少数学知识,也没那么强的逻辑思维,学习C++是有难度的,何况他没有任何编程基础
慎重考虑