// See https://aka.ms/new-console-template for more information
using NumSharp;
//测试numsharp
int[,] ints = new int[2, 3] { { 1, 2, 3 }, { 4, 5, 6 } };
NDArray dArray2 = np.array(new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } });
NDArray dArray1 = np.array(ints);
foreach (var item in dArray1)
{
Console.WriteLine($"{item}");
}
//dArray1.ToArray();
int a = dArray1.size;
int[] b = dArray1.shape;
Console.WriteLine($"{dArray1[0][1]},{a},{b[0]},{b[1]}");
int[,] ints1 = new int[dArray1.shape[0], dArray1.shape[1]];
for (int i = 0; i < ints1.GetLength(0); i++)
{
for (int j = 0; j < ints1.GetLength(1); j++)
{
ints1[i, j] = dArray1[i][j];
}
}
for (int i = 0; i < ints1.GetLength(0); i++)
{
for (int j = 0; j < ints1.GetLength(1); j++)
{
Console.WriteLine($"写入的值为:{ints1[i, j]}");
}
}
//结果:
/*
1
2
3
4
5
6
2,6,2,3
写入的值为:1
写入的值为:2
写入的值为:3
写入的值为:4
写入的值为:5
写入的值为:6
*/
float[] c = new float[] { 1, 2, 3, 4, 5 };
float[] d = new float[] { 2F,4F, 5F, 6F, 7F, 8F };
float s = 0;
float e = 0;
float[] floatSection(float[] firstList, float[] secondList)
{
var res = new List<float>();
// 如果有一个数组为空,直接返回交集数组为空
if (firstList.Length == 0 || secondList.Length == 0)
return res.ToArray();
int i = 0, j = 0;
// 两个数组同时遍历
while (i < firstList.Length && j < secondList.Length)
{
// 取范围的起点中大值作为交集起点
s = Math.Max(firstList[i], secondList[j]);
// 取范围的终点中小值作为交集终点
e = Math.Min(firstList[i], secondList[j]);
//起点小于终点,加入结果
if (s <= e) //交点
{
res.Add(s);
}
if (firstList[i] > secondList[j])
{
j++;
}
else
{
i++;
}
}
return res.ToArray();
}
Console.WriteLine("=========交集============");
foreach (var item in floatSection(c, d))
{
Console.WriteLine(item);
}
List<Student> students = new List<Student>
{
new Student{Id = 1, Name = "aa",Score = "89"},
new Student{Id = 2, Name = "bb",Score = "11"},
new Student{Id = 3, Name = "ada",Score = "12"},
new Student{Id = 4, Name = "cc",Score = "13"},
new Student{Id = 5, Name = "ee",Score = "15"}
};
List<Room> rooms = new List<Room>
{
new Room{Id = 1,RoomName = "vv",Score = "7"},
new Room{Id = 2,RoomName = "zz",Score = "8"},
new Room{Id = 3,RoomName = "bb",Score = "12"},
new Room{Id = 4,RoomName = "nn",Score = "89"},
new Room{Id = 5,RoomName = "ng",Score = "18"}
};
List<Student> stu1 = new List<Student>();
void test1()
{
int i = 0;
int j = 0;
foreach (var item in students)
{
foreach (var item2 in rooms)
{
if (item.Score == item2.Score)
{
stu1.Add(item);
}
}
}
foreach (var item in stu1)
{
Console.WriteLine(item.Score);
}
}
Console.WriteLine("=========遍历============");
test1();
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public string Score { get; set; }
}
public class Room
{
public int Id { get; set; }
public string RoomName { get; set; }
public string Score { get; set; }
}
结果
1
2
3
4
5
6
2,6,2,3
写入的值为:1
写入的值为:2
写入的值为:3
写入的值为:4
写入的值为:5
写入的值为:6
=========交集============
2
4
5
=========遍历============
89
12
c语言指针:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
struct Person
{
char name[64];
int age;
};
typedef struct Person_
{
char name[64];
int age;
} MyPerson;
//typedef struct Person_ MyPerson; //别名
int* func()
{
int a = 10; //栈上创建的变量
return &a;
}
void Test01()
{
int* p = func(); //执行func()就被释放了
printf("%d\n", *p);
printf("%d\n", *p);
}
int main()
{
struct Person p1 = { "张三", 18 };
MyPerson p2 = { "李四", 19 };
/*char* p1, p2; //指针,字符型
printf("p1的数据类型为 %s\n", typeid(p1).name());
printf("p2的数据类型为 %s\n", typeid(p2).name());*/
typedef char* PCHAR;
PCHAR p3, p4; //定义了2个指针
//printf("%d", p2.age);
//E:\C++\C++全套课\02-阶段二 C高级编程\01-第一章 C高级\1-1 变量和内存分布 08
/*
1.代码区:存放函数体内的二进制代码,有操作系统管理。
2.全局区:存放全局变量,静态变量以及常量。
3.栈区:由编译器自动分配和释放,存放函数参数,局部变量等
4.堆区:由程序员分配释放,若程序员未释放,则程序结束之后,编译器自动释放。
*/
printf("=================\n");
Test01();
}
C++ 知识
// CPPTest1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <cstdio>
int main1()
{
short a = 10;
int b = 10;
short* p = &a;
short** pp = &p;
int* p1 = &b;
p = &a;
pp = &p;
std::cout << "p的值是\n"<<std::endl;
std::cout << p << std::endl;
std::cout << "*p的值是\n" << std::endl;
std::cout << *p << std::endl;
std::cout << "pp的值是\n" << std::endl;
std::cout << pp << std::endl;
std::cout << "*pp的值是\n" << std::endl;
std::cout << *pp << std::endl;
std::cout << "**pp的值是\n" << std::endl;
std::cout << **pp << std::endl;
std::cout << "**pp的size是\n" << std::endl;
std::cout << sizeof(**pp) << std::endl;
std::cout << "pp的size是\n" << std::endl;
std::cout << sizeof(pp) << std::endl;
std::cout << "*p1的size是\n" << std::endl;
std::cout << sizeof(*p1) << std::endl;
std::cout << "p1的size是\n" << std::endl;
std::cout << sizeof(p1) << std::endl;
return 0;
}
/*
64位编译器
00000018D98FF554
*p的值是
10
pp的值是
00000018D98FF598
*pp的值是
00000018D98FF554
**pp的值是
10
**pp的size是
2
pp的size是
8
*p1的size是
4
p1的size是
8
*/
/*
32位编译器
0135F7B8
*p的值是
10
pp的值是
0135F7A0
*pp的值是
0135F7B8
**pp的值是
10
**pp的size是
2
pp的size是
4
*p1的size是
4
p1的size是
4
*/
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
int main2()
{
int a = 0x01020304;
char* p1 = (char*)&a;
short* p2 = (short*)&a;
int* p3 = &a;
//int* p4; //野指针 p4 指向地址不清楚 int* p4 = &a; p4的地址一定要是定义过的
//*p4 = 6;
void* p4 = (void*)&a; //万能
printf("p1的值是: %x\n", *p1); //1
printf("p2的值是: %x\n", *p2); //2
printf("p3的值是: %x\n", *p3); //4
//printf("p4的值是: %x\n", *p4); //4 报错
//std::cout << "*p1的值是\n" << std::endl;
//std::cout << *p3 << std::endl;
printf("p1的地址是: %u\n", p1); //1
printf("p2的地址是: %u\n", p2); //2
printf("p3的地址是: %u\n", p3); //4
printf("p4的地址是: %u\n", p4); //4
printf("p1+1的地址是: %u\n", p1+1); //步长加1
printf("p2+1的地址是: %u\n", p2+1); //步长加2
printf("p3+1的地址是: %u\n", p3+1); //步长加4
return 0;
}
/*
p1的值是: 4
p2的值是: 304
p3的值是: 1020304
p1的地址是: 1387264804
p2的地址是: 1387264804
p3的地址是: 1387264804
p1+1的地址是: 1387264805
p2+1的地址是: 1387264806
p3+1的地址是: 1387264808
*/
template<class T>
T func(T a, T b)
{
return a + b;
}
void test03()
{
int a = 3;
double b = 3.3;
//func<int>(a, b);
std::cout << func<int>(a, b) << std::endl;
}
int myPlus(int a, int b)
{
return a + b;
}
template<class T>
T myPlus2(T a, T b)
{
return a + b;
}
void Test()
{
int a = 10;
int b = 20;
char c = 'a';
myPlus(a, c);
//myPlus2(a, c); //报错,函数模板不能直接进行隐式转换
myPlus2<int>(a, c); //如果隐式转换,必须加上参数列表/泛型
}
int main3()
{
//const int a = 10;
//a = 100; const不能修改
// int* p = &a; c++不能
//int a = 10;
//int* p1 = &a;
//int** p2 = &p1;
//std::cout << **p2 << std::endl; //10
int b[10] = {1,2,3,4,5,6,7,8,9,10};
int* p3 = b; //等价于 = &b[0]; 首地址
int* p4 = &b[0];
std::cout << *p3 << std::endl; //1
std::cout << *p4 << std::endl; //1
int c[5] = { 1,2,3,4,5 };
int* ptr = (int*)(&c + 1); //&c 整个数组的地址,c是c[0]的地址。 &c + 1 是c[5] 之后的未知地区
int* ptr2 = (int*)(c + 1); //c+1是2的地址
//*(a + 1)
printf("======================\n");
printf("%d,%d,%d \n", *(c + 1), *(ptr - 1),*(ptr2-1));
//2,5,1
//c 是c[0]的地址。
//ptr-1 步长为1个int,刚好回到c数组的最后一个数字
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = a;
printf("======================\n");
for (int i = 0; i < sizeof(a)/sizeof(a[0]); i++)
{
//printf("%d \n", a[i]);
//printf("%d\n",*(p + i));
printf("%d\n", p[i]); //p[i] = *(p+i)
}
printf("=========dsds=============\n");
test03();
return 0;
}
typedef struct node
{
int data;
struct node* next;
} Node;
int main()
{
int a = 5;
Node p1 = { 5 };
// Node* p; 相当于野指针
Node* p = &p1;
p->data = 5;
std::cout << p->data << std::endl;
return 0;
}
//template<class T> //让编译器看到这句话后面紧跟的函数里有T,不要报错
//void mySwap(T& a, T& b)
//{
// T tmp = a;
// a = b;
// b = tmp;
//}