- 博客(34)
- 收藏
- 关注
翻译 NormalMatrix
NormalMatrix怎么算或者为什么这么算?许多计算是在view space中完成的。这与光照通常在该空间中执行的操作有关,否则摄像机位置相关的效果(例如镜面光)将更难实现。因此,我们需要一种将法线转换为view space的方法(有时候会在世界空间根据原理更改即可)。要将顶点转换为view space,我们可以编写:vertexEyeSpace = gl_ModelViewMatrix * gl_Vertex;那么为什么我们不能对法线向量做同样的事情呢?法线是 3 个浮点数的向量,模型视图矩
2022-05-25 13:26:01
204
原创 抽象类与接口的小玩笑
在网上看到的1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。2 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染)。...
2021-10-15 12:25:58
105
原创 #params 关键字
使用 params 关键字可以指定采用数目可变的参数的方法参数。 参数类型必须是一维数组。在方法声明中的 params 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关键字。如果 params 参数的声明类型不是一维数组,则会发生编译器错误 CS0225。使用 params 参数调用方法时,可以传入:1数组元素类型的参数的逗号分隔列表。2指定类型的参数的数组。3无参数。 如果未发送任何参数,则 params 列表的长度为零。using System;namesp
2021-10-13 22:06:10
381
原创 #Null 合并运算符( ?? )
#Null 合并运算符( ?? )如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值using System;namespace NULLABLE{ class A { static void Main(string[] args) { double? a = null; double? b = 3.14157; double c = 9;
2021-10-13 21:18:58
220
原创 #decimal运算法则
#decimal运算法则decimal 类型值的运算结果是这样得出的:先计算一个精确结果(按每个运算符的定义保留小数位数),然后舍入以适合表示形式。结果舍入到最接近的可表示值,当结果同样地接近于两个可表示值时,舍入到最小有效位数位置中为偶数的值(这称为“银行家舍入法”)。零结果总是包含符号 0 和小数位数 0。银行家舍入就是四舍六入五取偶法,其规则是:当舍去位的数值小于5时,直接舍去该位;当舍去位的数值大于等于6 时,在舍去该位的同时向前位进一;当舍去位的数值等于5时,如果前位数值为奇,则在舍去该位的
2021-10-10 18:38:07
1238
原创 #值类型的构造函数
所有值类型都隐式声明一个称为默认构造函数 (default constructor) 的公共无参数实例构造函数。默认构造函数返回一个零初始化实例,它就是该值类型的默认值 (default value)所以在下面的示例中,变量 i 和 j 都被初始化为零。class A{ void F() { int i = 0; int j = new int(); }}bool类型默认为false...
2021-10-10 15:16:17
84
原创 #名称隐藏-2(通过继承的名称隐藏)
#名称隐藏-2(通过继承的名称隐藏)当类或结构重新声明从基类继承的名称时,会发生通过继承的名称隐藏。这种类型的名称隐藏采取下列形式之一:• 类或结构中引入的常量、字段、属性、事件或类型会把所有同名的基类成员隐藏起来。• 类或结构中引入的方法隐藏所有同名的非方法基类成员,以及所有具有相同签名(方法名称和参数个数、修饰符和类型)的基类方法。• 类或结构中引入的索引器隐藏所有具有相同签名(参数个数和类型)的基类索引器。管理运算符声明的规则使派生类不可能声明与基类中的运算符具有相同签名的运算符。因此,运算
2021-10-05 22:17:41
910
原创 #名称隐藏-1(通过嵌套的名称隐藏)
#名称隐藏-1(通过嵌套的名称隐藏)以下各项会导致发生通过嵌套的名称隐藏:在命名空间内嵌套其他命名空间或类型;在类或结构中的嵌套类型;声明形参和局部变量。在下面的示例中class A{ int i = 0; void F() { int i = 1; } void G() { i = 1; }}在方法 F 中,实例变量 i 被局部变量 i 隐藏,但在方法 G 中,i 仍引用该实例变量。当内部范围中的名称隐藏外部范围中的名称时,它隐藏该名称的所有重载匹配项。在下面的示例中c
2021-10-05 21:58:36
1509
原创 #范围 (scope)-2
#范围 (scope)-2块中名称的含义可能因该名称的使用上下文而异。在下面的示例中using System;class A {}class Test{ static void Main() { string A = "hello, world"; string s = A; // 表达式上下文 Type t = typeof(A); // 类型上下文 Console.WriteLine(s); // "hello, world" Consol
2021-10-05 21:35:30
84
原创 #范围 (scope)-1
#范围 (scope)-1在命名空间、类、结构或枚举成员的范围内,可以在位于该成员的声明之前的文本位置引用该成员。例如class A{ void F() { i = 1; } int i = 0;}这里,F 在声明 i 之前引用它是有效的。在局部变量的范围内,在位于该局部变量的 local-variable-declarator 之前的文本位置引用该局部变量是编译时错误。例如class A{ int i = 0; void F() { i = 1; // 错误
2021-10-05 21:26:58
124
原创 #签名和重载-3
#签名和重载-3签名是对类、结构和接口的成员实施重载 (overloading) 的机制:• 方法重载允许类、结构或接口用同一个名称声明多个方法,条件是它们的签名在该类、结构或接口中是唯一的。• 实例构造函数重载允许类或结构声明多个实例构造函数,条件是它们的签名在该类或结构中是唯一的。• 索引器重载允许类、结构或接口声明多个索引器,条件是它们的签名在该类、结构或接口中是唯一的。• 运算符重载允许类或结构用同一名称声明多个运算符,条件是它们的签名在该类或结构中是唯一的。虽然 out 和 ref 参
2021-10-04 15:53:06
111
原创 #签名和重载-2
#签名和重载-2• 实例构造函数签名由它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。具体而言,实例构造函数的签名不包含可为最右边的参数指定的 params 修饰符。• 索引器签名由它的每一个形参(按从左到右的顺序)的类型组成。具体而言,索引器签名既不包含元素类型,也不包含可为最右边的形参指定的 params 形参数组签名和 修饰符。• 运算符签名由运算符的名称和它的每一个形参(按从左到右的顺序)的类型组成。具体而言,运算符的签名不包含结果类型。索引器:class Progr
2021-10-04 14:51:26
70
原创 #签名和重载-1
#签名和重载-1• 方法签名(signature)由方法的名称、类型形参的个数和它的每一个形参(按从左到右的顺序)的类型和种类(值、引用或输出)组成。为了实现这些目的,形参的类型中出现的方法的任何类型形参都不是由其名称标识的,而是由它在方法的类型实参列表中的序号位置标识的。• 需注意的是,方法签名既不包含返回类型和 params 修饰符(它可用于指定最右边的形参),也不包含可选类型形参约束。其中params 修饰符形式为:方法修饰符 返回类型 方法名(params 类型[ ] 变量名)如:
2021-10-04 14:07:55
103
原创 warning C4013: ‘malloc‘ undefined;‘free‘ undefined; assuming extern returning int
忘记写#include<stdlib.h>了
2021-09-17 18:25:46
1470
原创 warning C4013: ‘strcpy‘ undefined; assuming extern returning int
忘记写#include<string.h>了,大意了
2021-09-17 18:23:41
2000
原创 lxml在Windows环境下的安装方法(只要是.whl文件都用此方法)
#lxml在Windows环境下的安装方法一些使用python且在windows下使用bs4但由于默认的较太慢则需安装lxml可以大幅度提升解析速度,但是有点麻烦。方法一:在cmd中输入 pip install lxml如果幸运就成功了,但来到了这里,肯定和我一样是倒霉蛋。方法二:1、先在cmd中 输入 pip install wheel因为要安装wheel库才可以安装.whl文件(因为lxml文件是.whl文件)2、在cmd中输入pip debug --verbose在下方可以找到(找到属
2021-06-08 17:57:54
3871
2
原创 #C语言排版美化求解
昨天写了一个作业但是有几点不明白,求解#include <stdio.h>#define N 5void input();void output();struct Student{ int id; char name[10]; float m; float e; float c; float b;} student[N];//名字最多只能输入六个字符void main(){ printf("请分别输入下列内容:(并以空格分隔)\n" "学号,姓名,数学,英语
2021-06-05 22:53:06
229
原创 #对十个整数进行排序要求:1排序用函数2数组名为函数参数3用指针内容
对十个整数进行排序要求:1排序用函数2数组名为函数参数3用指针内容程序如下:#include <stdio.h>#include <stdlib.h>void bulu(int *a); //冒泡排序,用数组地址修改void urand(); //生成随机数int a[10],i;void main(){ urand(); bulu(a); printf("排序后的随机数:\n"); for(i=0;i<10;i++) printf(
2021-05-21 17:20:39
148
原创 #写头文件和源程序计算字符串长度
写头文件和源程序计算字符串长度建立一个名为test.c文件:#include <stdio.h>#include "test.h"void main(){ char s[N]; gets(s); printf("您输入的字符串长度为%d\n",len(s));}再建立一个名为usetest.c文件:#include <stdio.h>#include "test.h"int len(char *s){ int i; for(i=0;*s;i++,s+
2021-05-21 16:32:47
111
原创 #尝试编写用指针作为参数的程序完成变量a与变量b中数据的交换##C语言
尝试编写用指针作为参数的程序完成变量a与变量b中数据的交换要求:(1)数据的交换由函数来完成(2)用指针作为函数参数程序:#include<stdio.h>int trans(int *a,int *b);void main(){ int *a1,*b1; int a,b; a=1;b=2; a1=&a;b1=&b; printf("未换时a=%d,b=%d\n",a,b); trans(a1,b1); printf("在trans函数中交换后的m
2021-05-07 20:07:52
539
原创 #回显是什么意思
#回显是什么意思回显输入就是,用户输入的字符直接显示在电脑屏幕上。无回显输入就是,敲键盘后屏幕不显示你所敲的字符。一些编译器支持无缓冲输入的函数在conio.h头文件中如:回显无缓冲输入getche()和无回显无缓冲输入getch()(这个可以帮你稍微了解回显)#include <stdio.h>#include <conio.h>int main(void){ char ch; ch = getch(); printf("%c",ch);
2021-05-05 17:04:25
6785
1
原创 #输入大圆和小圆半径,输出圆环面积
#输入大圆和小圆半径,输出圆环面积#!/usr/bin/python#coding:utf-8import mathx=input('请分别输入大圆和小圆半径R,r:')R,r=map(float,x.split(','))S=math.pi*R**2-math.pi*r**2print('所以圆环面积%f'%S)运行结果:请分别输入大圆和小圆半径R,r:4,2所以圆环面积37.699112...
2021-04-24 21:46:10
1898
原创 #编写一个模仿strcmp()的函数,输入两个字符串,输出第一个不同字符的差值(ASCII编码)
#编写一个模仿strcmp()的函数,输入两个字符串,输出第一个不同字符的差值(ASCII编码)代码如下:#include<stdio.h>#define N 26int cmp(char a[N],char b[N]);void main(){ char m[N],n[N]; int i; printf("输入第一个字符串:"); gets(m); printf("输入第二个字符串:"); gets(n); i=cmp(m,n); printf("差值为%d\n"
2021-04-23 17:09:46
1389
1
原创 #使用函数原型判断一个整数是否为素数
#使用函数原型判断一个整数是否为素数代码如下:#include<stdio.h>int s(int n);void p(int a);void main(){ int a; printf("请输入一个整数:"); scanf("%d",&a); p(a);}void p(int a){ int i; if(a==1) printf("1既不是素数也不是合数\n"); else { i=s(a); if(i==0) printf("%d
2021-04-23 16:52:40
208
原创 #输入两个字符串,计算第一个不相同的字符的差值
输入两个字符串,计算第一个不相同的字符的差值程序如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 26int main(){ int i,j; char s[N]; char a[N]; gets(s); gets(a); if(strcmp(s,a)!=0) { for(i=0;i<N;i++) { j=s[i]-a[i]; wh
2021-04-21 23:55:00
1139
1
原创 #将小写变为大写,将大写变为小写
将小写变为大写,将大写变为小写程序如下:#include <stdio.h>#define N 26int main(){ int i; char s[N]; scanf("%s",s); for(i=0;i<N;i++) { if(('a'<=s[i])&&(s[i]<='z')) s[i]=s[i]-32; else if(('A'<=s[i])&&(s[i]<='Z')) s[i]=s[i
2021-04-21 23:46:56
158
1
原创 #字母金字塔
字母金字塔:#include<stdio.h>int main(){ char op,i,j; int s; printf("请输入一个字母,作为金字塔最底部的字母:"); s=scanf("%c",&op); if(op<97) { for(i=65;i<=op;i++) { for(j=0;j<=op-i;j++) { printf(" "); } for(j=65;j<=i;j++)
2021-04-18 18:53:42
686
原创 for循环
这个for循环惊到我了#include <stdio.h>int main(){ int k; for (k=1,printf("%d:Hi!\n",k); printf("k=%d\n",k),k*k < 26; k += 2 ,printf("Now k is %d\n",k)) printf("k is %d in the loop\n",k); return 0;}运行结果如下:1:Hi!k=1k is 1 in the loopNow k is
2021-04-18 17:10:36
54
原创 #类型转换
在表达式中使用类型转换一定要先进行转换在进行表达式的运算如:i=(long)(num*num);i=((long)num)*num;第一个不安全的原因在于,计算平方时使用的是int类型,对于较大的值会越界,发生截断,转换long类型后还是截断后的结果。一定要使用第二个;第一个不安全一定要使用第二个;第一个不安全一定要使用第二个;第一个不安全咳咳,三遍了┴┤・ω・)ノ...
2021-04-18 16:40:38
90
原创 #scanf的&使用
#scanf的&使用 1、scanf("%lf",m[2]); 2、scanf("%lf",&m[2]); 3、scanf("%lf",&m);写入数组正确的用法应当是第2种 char s[8]; scanf("%s",s);使用scanf()函数处理字符串时没有使用&符号通常在写入字符串时从第1个元素开始顺序写入,而数组名(s或mint)就是第1个元素的地址,因此不建议使用&符号表示第1个元素的地址。但是当我们向某一个确定位置的元素写入数据时需
2021-04-18 16:16:55
180
原创 #while语句(关于自增自减)
#while语句(关于自增自减)观看下面一段代码index=0;while(index++<10) sam=10*index+2;printf("sam=%d\n",sam);对于while语句,index++自增符号仍然还是先赋值再增;在此代码中表现为先判断再自增,即:第一次判断为0<10,判断为真,进入while循环,sam=101+2;index++<10作为while循环的测试条件,是一个完整表达式,该表达式的结束是一个序列点,所以sam的第一次赋值不会是100+2
2021-04-07 13:38:46
1241
原创 函数原型
#函数原型#include<stdio.h>void cubic(double n);int main(int argc, char *agrv[] ){ double input; printf("Enter cubic : "); scanf("%lf",&input); cubic(input); printf("program exit\n"); return 0;}void cubic(double n){ double t = n*n*n; p
2021-04-01 23:02:30
127
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人