This page looks plain and unstyled because you're using a non-standard compliant browser. To see it in its best form, please upgrade to a browser that supports web standards. It's free and painless.
| « | 三月 2010 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 | ||||
出口香烟
FC 4下安装ORACLE 9i 的全过程
安装Linux 的硬盘分区
C语言面试题大汇总之华为面试题
面试经典试题
C/C++ 程序设计员应聘常见面试试题深入剖析
美国军工五巨头简介
经典面试问题回答思路
老师的语录
华为公司 java 面试题

FC 4下安装ORACLE 9i 的全过程
安装Linux 的硬盘分区
1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
2、如何引用一个已经定义过的全局变量? 答:extern 可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错
4、语句for( ;1 ;)有什么问题?它是什么意思? 答:和while(1)相同。
5、do……while和while……do有什么区别? 答:前一个循环一遍再判断,后一个判断以后再循环
6、请写出下列代码的输出内容
#include
main()
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("b,c,d:%d,%d,%d",b,c,d);
return 0;
}
答:10,12,120
7、static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。 static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件 static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用; static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值; static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
8、程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。
9、设有以下说明和定义:
typedef union
{
long i; int k[5]; char c;} DATE;
struct data { int cat; DATE cow; double dog;} too;
DATE max;
则语句 printf("%d",sizeof(struct date)+sizeof(max));的执行结果是:___52____
答:DATE是一个union, 变量公用空间. 里面最大的变量类型是int[5], 占用20个字节. 所以它的大小是20 data是一个struct, 每个变量分开占用空间. 依次为int4 + DATE20 + double8 = 32. 所以结果是 20 + 32 = 52. 当然...在某些16位编辑器下, int可能是2字节,那么结果是 int2 + DATE10 + double8 = 20
10、队列和栈有什么区别? 队列先进先出,栈后进先出
11、写出下列代码的输出内容
#include
int inc(int a) { return(++a); } int multi(int*a,int*b,int*c) { return(*c=*a**b); } typedef int(FUNC1)(int in); typedef int(FUNC2) (int*,int*,int*); void show(FUNC2 fun,int arg1, int*arg2) { INCp=&inc; int temp =p(arg1); fun(&temp,&arg1, arg2); printf("%dn",*arg2); } main() { int a; show(multi,10,&a); return 0; } 答:110
12、请找出下面代码中的所以错误
说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”
#include"string.h"
main()
{
char*src="hello,world";
char* dest=NULL;
int len=strlen(src);
dest=(char*)malloc(len);
char* d=dest;
char* s=src[len];
while(len--!=0)
d++=s--;
printf("%s",dest);
return 0;
}
答:
方法1:
int main()
{
char* src = "hello,world";
int len = strlen(src);
char* dest = (char*)malloc(len+1);//要为分配一个空间 char* d = dest;
char* s = &src[len-1];//指向最后一个字符
while( len-- != 0 )
*d++=*s--;
*d = 0;//尾部要加
printf("%sn",dest);
free(dest);// 使用完,应当释放空间,以免造成内存汇泄露 return 0;
}
方法2:
#include <stdio.h>
#include <string.h>
main()
{
char str[]="hello,world";
int len=strlen(str);
char t;
for(int i=0; i<len/2; i++)
{
t=str[i];
str[i]=str[len-i-1]; str[len-i-1]=t;
}
printf("%s",str);
return 0;
}
13.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现? c用宏定义,c++用inline
14.直接链接两个信令点的一组链路称作什么? PPP点到点连接
6.接入网用的是什么接口?
V5接口
16.voip都用了那些协议? H.323协议簇、SIP协议、Skype协议、H.248和MGCP协议
17.软件测试都有那些种类? 黑盒:针对系统功能的测试 白合:测试函数功能,各函数接口
18.确定模块的功能和模块的接口是在软件设计的那个队段完成的? 概要设计阶段
19.
enum string
{
x1,
x2,
x3=10,
x4,
x5,
}x;
问x= 0x801005,0x8010f4 ;
20.
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
请问p1+5= ;
p2+5= ;
选择题:
21.Ethternet链接到Internet用到以下那个协议? A.HDLC;B.ARP;C.UDP;D.TCP;E.ID
22.属于网络层协议的是: A.TCP;B.IP;C.ICMP;D.X.25 23.Windows消息调度机制是: A.指令队列;B.指令堆栈;C.消息队列;D.消息堆栈;
24. unsigned short hash(unsigned short key)
{
return (key>>)%256
}
请问hash(16),hash(256)的值分别是:
A.1.16;B.8.32;C.4.16;D.1.32
找错题:
25.请问下面程序有什么错误?
int a[60][250][1000],i,j,k;
for(k=0;kMax_GT_Length)
{ return GT_Length_ERROR;
} ....... }
问答题: 29.IP Phone的原理是什么? IPV6
30.TCP/IP通信建立的过程怎样,端口有什么作用? 三次握手,确定是哪个应用程序使用该协议
31.1号信令和7号信令有什么区别,我国某前广泛使用的是那一种?
32.列举5种以上的电话新业务
四.找错题:
1.请问下面程序有什么错误?
int a[60][250][1000],i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i][j][k]=0;
把循环语句内外换一下
2.#define Max_CB 500
void LmiQueryCSmd(Struct MSgCB * pmsg)
{
unsigned char ucCmdNum;
......
for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++)
{
......;
}
死循环
3.以下是求一个数的平方的程序,请找出错误:
#define SQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);
4.typedef unsigned char BYTE
int examply_fun(BYTE gt_len; BYTE *gt_code)
{
BYTE *gt_buf;
gt_buf=(BYTE *)MALLOC(Max_GT_Length);
......
if(gt_len>Max_GT_Length)
{
return GT_Length_ERROR;
}
.......
}
五.问答题:
1.IP Phone的原理是什么?
IPV6
2.TCP/IP通信建立的过程怎样,端口有什么作用?
三次握手,确定是哪个应用程序使用该协议
3. 1号信令和7号信令有什么区别,我国某前广泛使用的是那一种?
4. 列举5种以上的电话新业务?
微软亚洲技术中心的面试题!!!
1.进程和线程的差别。
线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
2.测试方法
人工测试:个人复查、抽查和会审
机器测试:黑盒测试和白盒测试
2.Heap与stack的差别。
Heap是堆,stack是栈。
Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。
Stack空间有限,Heap是很大的自由存储区
C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行
3.Windows下的内存是如何管理的?
4.介绍.Net和.Net的安全性。
5.客户端如何访问.Net组件实现Web Service?
6.C/C++编译器中虚表是如何完成的?
7.谈谈COM的线程模型。然后讨论进程内/外组件的差别。
8.谈谈IA32下的分页机制
小页(4K)两级分页模式,大页(4M)一级
9.给两个变量,如何找出一个带环单链表中是什么地方出现环的?
一个递增一,一个递增二,他们指向同一个接点时就是环出现的地方
10.在IA32中一共有多少种办法从用户态跳到内核态?
通过调用门,从ring3到ring0,中断从ring3到ring0,进入vm86等等
11.如果只想让程序有一个实例运行,不能运行两个。像winamp一样,只能开一个窗口,怎样实现?
用内存映射或全局原子(互斥变量)、查找窗口句柄..
FindWindow,互斥,写标志到文件或注册表,共享内存。.
12.如何截取键盘的响应,让所有的‘a’变成‘b’?
键盘钩子SetWindowsHookEx
13.Apartment在COM中有什么用?为什么要引入?
14.存储过程是什么?有什么用?有什么优点?
我的理解就是一堆sql的集合,可以建立非常复杂的查询,编译运行,所以运行一次后,以后再运行速度比单独执行SQL快很多
15.Template有什么特点?什么时候用?
16.谈谈Windows DNA结构的特点和优点。
17. 网络编程中设计并发服务器,使用多进程 与 多线程 ,请问有什么区别?
1,进程:子进程是父进程的复制品。子进程获得父进程数据空间、堆和栈的复制品。
2,线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
两者都可以提高程序的并发度,提高程序运行效率和响应时间。
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
思科
1. 用宏定义写出swap(x,y)
#define swap(x, y)
x = x + y;
y = x - y;
x = x - y;
2.数组a[N],存放了1至N-1个数,其中某个数重复一次。写一个函数,找出被重复的数字.时间复杂度必须为o(N)函数原型:
int do_dup(int a[],int N)
3 一语句实现x是否为2的若干次幂的判断
int i = 512;
cout << boolalpha << ((i & (i - 1)) ? false : true) << endl;
4.unsigned int intvert(unsigned int x,int p,int n)实现对x的进行转换,p为起始转化位,n为需要转换的长度,假设起始点在右边.如x=0b0001 0001,p=4,n=3转换后x=0b0110 0001
unsigned int intvert(unsigned int x,int p,int n){
unsigned int _t = 0;
unsigned int _a = 1;
for(int i = 0; i < n; ++i){
_t |= _a;
_a = _a << 1;
}
_t = _t << p;
x ^= _t;
return x;
}
慧通:
1. 什么是预编译,何时需要预编译:
1、总是使用不经常改动的大型代码体。
2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。
2. 上述三个有什么区别?
char * const p;
char const * p
const char *p
解答:
char * const p; //常量指针,p的值不可以修改
char const * p;//指向常量的指针,指向的常量值不可以改
const char *p; //和char const *p
3. 解释下列输出结果
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
结果是:0 0 1 1
解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;
而str5,str6,str7,str8是指针,它们指向相同的常量区域。
4. 以下代码中的两个sizeof用法有问题吗?[C易]
void UpperCase( char str[] ) // 将 str 中的小写字母转换成大写字母
{
for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
if( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
答:函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。
4. 一个32位的机器,该机器的指针是多少位
指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。
5. 指出下面代码的输出,并解释为什么。
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
输出:2,5
*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5
&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)
int *ptr=(int *)(&a+1);
则ptr实际是&(a[5]),也就是a+5
原因如下:
&a是数组指针,其类型为 int (*)[5];
而指针加1要根据指针类型加上一定的值,
不同类型的指针+1之后增加的大小不同
a是长度为5的int数组指针,所以要加 5*sizeof(int)
所以ptr实际是a[5]
但是prt与(&a+1)类型是不一样的(这点很重要)
所以prt-1只会减去sizeof(int*)
a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].
6.请问以下代码有什么问题:
1).
int main()
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
没有为str分配内存空间,将会发生异常
问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。
2).
char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
有什么错?
"AAA"是字符串常量。s是指针,指向这个字符串常量,所以声明s的时候就有问题。
cosnt char* s="AAA";
然后又因为是常量,所以对是s[0]的赋值操作是不合法的。
1、写一个“标准”宏,这个宏输入两个参数并返回较小的一个。
.#define Min(X, Y) ((X)>(Y)?(Y):(X))//结尾没有;
2、嵌入式系统中经常要用到无限循环,你怎么用C编写死循环。
while(1){}或者for(;;)
3、关键字static的作用是什么?
定义静态变量
4、关键字const有什么含意?
表示常量不可以修改的变量。
5、关键字volatile有什么含意?并举出三个不同的例子?
提示编译器对象的值可能在编译器未监测到的情况下改变。
6. int (*s[10])(int) 表示的是什么啊
int (*s[10])(int) 函数指针数组,每个指针指向一个int func(int param)的函数。
1.有以下表达式:
int a=248; b=4;int const c=21;const int *d=&a;
int *const e=&b;int const *f const =&a;
请问下列表达式哪些会被编译器禁止?为什么?
*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;
*c 这是个什么东东,禁止
*d 说了是const, 禁止
e = &a 说了是const 禁止
const *f const =&a; 禁止
2.交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3;
有两种解法, 一种用算术算法, 一种用^(异或)
a = a + b;
b = a - b;
a = a - b;
or
a = a^b;// 只能对int,char..
b = a^b;
a = a^b;
or
a ^= b ^= a;
3.c和c++中的struct有什么不同?
c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private
4.#include <stdio.h>
#include <stdlib.h>
void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,"hello world");
}
int main( )
{
char *str=NULL;
getmemory(str);
printf("%s/n",str);
free(str);
return 0;
}
程序崩溃,getmemory中的malloc 不能返回动态内存, free()对str操作很危险
5.char szstr[10];
strcpy(szstr,"0123456789");
产生什么结果?为什么?
长度不一样,会造成非法的OS
6.列举几种进程的同步机制,并比较其优缺点。
原子操作
信号量机制
自旋锁
管程,会合,分布式系统
7.进程之间通信的途径
共享存储系统
消息传递系统
管道:以文件系统为基础
8.
Author:Vince
————即使你是个编程高手,你在面试前也应该要看看这套题,她也许会给你带来好运,否则你有可能后悔当初为什么没有看而跳楼自杀,这样我会很内疚的。这套题看似简单,但你未必能得高分,即使你看不懂也要把她背下来!
欢迎转载此文,转载时请注明文章来源:文斯测试技术研究中心 http://blog.csdn.net/vincetest
1. const的理解:const char*, char const*, char*const的区别问题几乎是C++面试中每次 都会有的题目。 事实上这个概念谁都有只是三种声明方式非常相似很容易记混。 Bjarne在他的The C++ Programming Language里面给出过一个助记的方法: 把一个声明从右向左读。
char * const cp; ( * 读成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
char const * p;
同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。
2. c指针
int *p[n];-----指针数组,每个元素均为指向整型数据的指针。
int (*)p[n];------p为指向一维数组的指针,这个一维数组有n个整型数据。
int *p();----------函数带回指针,指针指向返回的值。
int (*)p();------p为指向函数的指针。
3. 数组越界问题
下面这个程序执行后会有什么错误或者效果:
#define MAX 255
int main()
{
unsigned char A[MAX],i;
for (i=0;i<=MAX;i++)
A[i]=i;
}
解答:MAX=255,数组A的下标范围为:0..MAX-1,这是其一,其二 当i循环到255时,循环内执行: A[255]=255;这句本身没有问题,但是返回for (i=0;i<=MAX;i++)语句时,由于unsigned char的取值范围在(0..255),i++以后i又为0了..无限循环下去.
注:char类型为一个字节,取值范围是[-128,127],unsigned char [0 ,255]
4. C++:memset ,memcpy 和strcpy 的根本区别?
#include "memory.h"
memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ '或‘';例:char a[100];memset(a, '', sizeof(a));
memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。
strcpy就只能拷贝字符串了,它遇到''就结束拷贝;例:char a[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘'之前)是否超过50位,如超过,则会造成b的内存地址溢出。
strcpy
原型:extern char *strcpy(char *dest,char *src);
用法:#include
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。
Memset
原型:extern void *memset(void *buffer, char c, int count);
用法:#include
功能:把buffer所指内存区域的前count个字节设置成字符c。
说明:返回指向buffer的指针。
5. ASSERT()是干什么用的
ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。例如,变量n在程序中不应该为0,如果为0可能导致错误,你可以这样写程序:
......
ASSERT( n != 0);
k = 10/ n;
......
ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。
assert()的功能类似,它是ANSI C标准中规定的函数,它与ASSERT的一个重要区别是可以用在Release版本中。
6. system("pause");系统的暂停程序,按任意键继续,屏幕会打印,"按任意键继续。。。。。" 省去了使用getchar();
7. 请问C++的类和C里面的struct有什么区别?
c++中的类具有成员保护功能,并且具有继承,多态这类oo特点,而c里的struct没有
8. 请讲一讲析构函数和虚函数的用法和作用?
析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载。知识在类对象生命期结束的时候,由系统自动调用释放在构造函数中分配的资源。这种在运行时,能依据其类型确认调用那个函数的能力称为多态性,或称迟后联编。另:析构函数一般在对象撤消前做收尾工作,比如回收内存等工作,虚拟函数的功能是使子类可以用同名的函数对父类函数进行重载,并且在调用时自动调用子类重载函数,如果是纯虚函数,则纯粹是为了在子类重载时有个统一的命名而已。
9. 全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?
全局变量的生命周期是整个程序运行的时间,而局部变量的生命周期则是局部函数或过程调用的时间段。其实现是由编译器在编译时采用不同内存分配方法。全局变量在main函数调用后,就开始分配,如果是静态变量则是在main函数前就已经初始化了。而局部变量则是在用户栈中动态分配的(还是建议看编译原理中的活动记录这一块)
10. 8086是多少尉的系统?在数据总线上是怎么实现的?
8086系统是16位系统,其数据总线是20位。
1. 编写用C语言实现的求n阶阶乘问题的递归算法:
long int fact(int n)
{
int x;
long int y;
if(n<0)
{
printf("error!");
}
if(n==0)
return 1;
x=n-1;
y=fact(x);
return (n*y);
}
2. 二分查找算法:
1) 递归方法实现:
int BSearch(elemtype a[],elemtype x,int low,int high)
/*在下届为low,上界为high的数组a中折半查找数据元素x*/
{
int mid;
if(low>high) return -1;
mid=(low+high)/2;
if(x==a[mid]) return mid;
if(x<a[mid]) return(BSearch(a,x,low,mid-1));
else return(BSearch(a,x,mid+1,high));
}
2) 非递归方法实现:
int BSearch(elemtype a[],keytype key,int n)
{
int low,high,mid;
low=0;high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid].key==key) return mid;
else if(a[mid].key<key) low=mid+1;
else high=mid-1;
}
return -1;
}
3. 递归计算如下递归函数的值(斐波拉契):
f(1)=1
f(2)=1
f(n)=f(n-1)+f(n-2) n>2
解:
int f(int n)
{
int i,s,s1,s2;
s1=1;/*s1用于保存f(n-1)的值*/
s2=1;/*s2用于保存f(n-2)的值*/
s=1;
for(i=3;i<=n;i++)
{
s=s1+s2;
s2=s1;
s1=s;
}
return(s);
}
4. 交换两个数,不用第三块儿内存:
int a = ……;
int b = ……;
a = a + b;
b = a - b;
a = a - b;
5. 冒泡排序:
void BubbleSort(elemtype x[],int n)
{
int i,j;
elemtype temp;
for(i=1;i<n;i++)
for(j=0;j<n-i;j++)
{
if(x[j].key>x[j+1].key)
{
temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
}
}
}
6. c语言 文件读写
#include "stdio.h"
main()
{
FILE *fp;
char ch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w")==NULL)
{
printf("cann't open filen");
exit(0);
}
ch=getchar();
while(ch!='#')
{
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
fclose(fp);
}
7. winsocket编程
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORDwVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if( err != 0)
{
return;
}
if(LOBYTE( wsaData.wVersion ) != 1||
HIBYTE( wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprint(sendBuf,"Welcome %s to http://www.sunxin.org",
inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf);
printf("%sn",recvBuf);
closesocket(sockConn);
WSACleanup();
}
}
注:这是Server端;File->New->Win32 Console Application,工程名:TcpSrv;然后,File->New->C++ Source File,文件名:TcpSrv;在该工程的Setting的Link的Object/library modules项要加入ws2_32.lib
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORDwVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if( err != 0)
{
return;
}
if(LOBYTE( wsaData.wVersion ) != 1||
HIBYTE( wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_porthtons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%sn",recvBuf);
send(sockClient,"This is zhangsan",strlen("This is zhangsan")+1,0);
closesocket(sockClient);
WSACleanup();
}
注:这是Client端;File->New->Win32 Console Application,工程名:TcpClient;然后,File->New->C++ Source File,文件名:TcpClient;同理,在该工程的Setting的Link的Object/library modules项要加入ws2_32.lib
8. 类的知识
C++
#include <iostream.h>
class human
{
public:
human(){ human_num++;};
static int human_num;
~human()
{
human_num--;
print();
}
void print()
{
cout<<"human num is: "<<human_num<<endl;
}
protected:
private:
};
int human::human_num = 0;
human f1(human x)
{
x.print();
return x;
}
int main(int argc, char* argv[])
{
human h1;
h1.print();
human h2 = f1(h1);
h2.print();
return 0;
}
输出:
1
1
0
0
-1
-2
----------------------------
分析:
human h1; //调用构造函数,---hum_num = 1;
h1.print(); //输出:"human is 1"
human h2 = f1(h1); //再调用f1(h1)的过程中,由于函数参数是按值传递对象,调用默认的复制构造函数, 一般分类 :: 评论 (1) :: 静态链接网址 :: 引用 (0)
本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。
许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程
度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分。读者可从本文看到strcpy
函数从2分到10分解答的例子,看看自己属于什么样的层次。此外,还有一些面试题考查面试者敏捷的思维能力。
分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的深入剖析则可进一步增强自身的内功。
2.找错题
试题1:
| void test1() { char string[10]; char* str1 = "0123456789"; strcpy( string, str1 ); } |
| void test2() { char string[10], str1[10]; int i; for(i=0; i<10; i++) { str1[i] = 'a'; } strcpy( string, str1 ); } |
| void test3(char* str1) { char string[10]; if( strlen( str1 ) <= 10 ) { strcpy( string, str1 ); } } |
| void strcpy( char *strDest, char *strSrc ) { while( (*strDest++ = * strSrc++) != ‘’ ); } |
| void strcpy( char *strDest, const char *strSrc ) //将源字符串加const,表明其为输入参数,加2分 { while( (*strDest++ = * strSrc++) != ‘’ ); } |
| void strcpy(char *strDest, const char *strSrc) { //对源地址和目的地址加非0断言,加3分 assert( (strDest != NULL) && (strSrc != NULL) ); while( (*strDest++ = * strSrc++) != ‘’ ); } |
| //为了实现链式操作,将目的地址返回,加3分! char * strcpy( char *strDest, const char *strSrc ) { assert( (strDest != NULL) && (strSrc != NULL) ); char *address = strDest; while( (*strDest++ = * strSrc++) != ‘’ ); return address; } |
| { assert( strt != NULL ); //断言字符串地址非0 int len; while( (*str++) != '' ) { len++; } return len; } |
| void GetMemory( char *p ) { p = (char *) malloc( 100 ); } void Test( void ) { char *str = NULL; GetMemory( str ); strcpy( str, "hello world" ); printf( str ); } |
| char *GetMemory( void ) { char p[] = "hello world"; return p; } void Test( void ) { char *str = NULL; str = GetMemory(); printf( str ); } |
| void GetMemory( char **p, int num ) { *p = (char *) malloc( num ); } void Test( void ) { char *str = NULL; GetMemory( &str, 100 ); strcpy( str, "hello" ); printf( str ); } |
| void Test( void ) { char *str = (char *) malloc( 100 ); strcpy( str, "hello" ); free( str ); ... //省略的其它语句 } |
| char *str = NULL; GetMemory( str ); |
| char p[] = "hello world"; return p; |
| *p = (char *) malloc( num ); |
| if ( *p == NULL ) { ...//进行申请内存失败处理 } |
| char *str = (char *) malloc(100); |
| str = NULL; |
| swap( int* p1,int* p2 ) { int *p; *p = *p1; *p1 = *p2; *p2 = *p; } |
| swap( int* p1,int* p2 ) { int p; p = *p1; *p1 = *p2; *p2 = p; } |
| | |
| void Func ( char str[100] ) { sizeof( str ) = ? } void *p = malloc( 100 ); sizeof ( p ) = ? |
| sizeof( str ) = 4 sizeof ( p ) = 4 |
| char str[10]; cout << sizeof(str) << endl; |
| char str[10]; str++; //编译出错,提示str不是左值 |
| least = MIN(*p++, b); |
| #define MIN(A,B) ((A) <= (B) ? (A) : (B)) |
| #define MIN(A,B) (A) <= (B) ? (A) : (B) #define MIN(A,B) (A <= B ? A : B ) |
| #define MIN(A,B) ((A) <= (B) ? (A) : (B)); |
| #ifndef __INCvxWorksh #define __INCvxWorksh #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __cplusplus } #endif #endif /* __INCvxWorksh */ |
| #ifndef __INCvxWorksh #define __INCvxWorksh #endif |
| void foo(int x, int y); |
该函数被C编译器编译后在symbol库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数参数数量及类型信息,C++就是考这种机制来实现函数重载的。
为了实现C和C++的混合编程,C++提供了C连接交换指定符号extern "C"来解决名字匹配问题,函数声明前加上extern "C"后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C++的函数了。
试题5:编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”
函数头是这样的:
| //pStr是指向以''结尾的字符串的指针 //steps是要求移动的n void LoopMove ( char * pStr, int steps ) { //请填充... } |
| void LoopMove ( char *pStr, int steps ) { int n = strlen( pStr ) - steps; char tmp[MAX_LEN]; strcpy ( tmp, pStr + n ); strcpy ( tmp + steps, pStr); *( tmp + strlen ( pStr ) ) = ''; strcpy( pStr, tmp ); } |
| void LoopMove ( char *pStr, int steps ) { int n = strlen( pStr ) - steps; char tmp[MAX_LEN]; memcpy( tmp, pStr + n, steps ); memcpy(pStr + steps, pStr, n ); memcpy(pStr, tmp, steps ); } |
|
| 偏移地址 | 字节数 | 数据类型 | 内 容 |
| 文件头
| 00H | 4 | Char | "RIFF"标志 |
| 04H | 4 | int32 | 文件长度 | |
| 08H | 4 | Char | "WAVE"标志 | |
| 0CH | 4 | Char | "fmt"标志 | |
| 10H | 4 | 过渡字节(不定) | ||
| 14H | 2 | int16 | 格式类别 | |
| 16H | 2 | int16 | 通道数 | |
| 18H | 2 | int16 | 采样率(每秒样本数),表示每个通道的播放速度 | |
| 1CH | 4 | int32 | 波形音频数据传送速率 | |
| 20H | 2 | int16 | 数据块的调整数(按字节算的) | |
| 22H | 2 | 每样本的数据位数 | ||
| 24H | 4 | Char | 数据标记符"data" | |
| 28H | 4 | int32 | 语音数据的长度 |
| typedef struct tagWaveFormat { char cRiffFlag[4]; UIN32 nFileLen; char cWaveFlag[4]; char cFmtFlag[4]; char cTransition[4]; UIN16 nFormatTag ; UIN16 nChannels; UIN16 nSamplesPerSec; UIN32 nAvgBytesperSec; UIN16 nBlockAlign; UIN16 nBitNumPerSample; char cDataFlag[4]; UIN16 nAudioLength; } WAVEFORMAT; |
| WAVEFORMAT waveFormat; memcpy( &waveFormat, buffer,sizeof( WAVEFORMAT ) ); |
| class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String(void); // 析构函数 String & operate =(const String &other); // 赋值函数 private: char *m_data; // 用于保存字符串 }; |
| //普通构造函数 String::String(const char *str) { if(str==NULL) { m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志''的空 //加分点:对m_data加NULL 判断 *m_data = ''; } else { int length = strlen(str); m_data = new char[length+1]; // 若能加 NULL 判断则更好 strcpy(m_data, str); } } // String的析构函数 String::~String(void) { delete [] m_data; // 或delete m_data; } //拷贝构造函数 String::String(const String &other) // 得分点:输入参数为const型 { int length = strlen(other.m_data); m_data = new char[length+1]; //加分点:对m_data加NULL 判断 strcpy(m_data, other.m_data); } //赋值函数 String & String::operate =(const String &other) // 得分点:输入参数为const型 { if(this == &other) //得分点:检查自赋值 return *this; delete [] m_data; //得分点:释放原有的内存资源 int length = strlen( other.m_data ); m_data = new char[length+1]; //加分点:对m_data加NULL 判断 strcpy( m_data, other.m_data ); return *this; //得分点:返回本对象的引用 } |
| | |
| const classA operator*(const classA& a1,const classA& a2); |
| classA a, b, c; (a * b) = c; // 对a*b的结果赋值 |
| int checkCPU() { { union w { int a; char b; } c; c.a = 1; return (c.b == 1); } } |
| 内存地址 | 存放内容 |
| 0x4000 | 0x34 |
| 0x4001 | 0x12 |
| 内存地址 | 存放内容 |
| 0x4000 | 0x12 |
| 0x4001 | 0x34 |
| 内存地址 | 存放内容 |
| 0x4000 | 0x78 |
| 0x4001 | 0x56 |
| 0x4002 | 0x34 |
| 0x4003 | 0x12 |
| 内存地址 | 存放内容 |
| 0x4000 | 0x12 |
| 0x4001 | 0x34 |
| 0x4002 | 0x56 |
| 0x4003 | 0x78 |
| int Sum( int n ) { return ( (long)1 + n) * n / 2; //或return (1l + n) * n / 2; } |
| int Sum( int n ) { long sum = 0; for( int i=1; i<=n; i++ ) { sum += i; } return sum; } |
| |
面试过程中,面试官会向应聘者发问,而应聘者的回答将成为面试官考虑是否接受他的重要依据。对应聘者而言,了解这些问题背后的“猫腻”至关重要。本文对面试中经常出现的一些典型问题进行了整理,并给出相应的回答思路和参考答案。读者无需过分关注分析的细节,关键是要从这些分析中“悟”出面试的规律及回答问题的思维方式,达到“活学活用”。
问题一:“请你自我介绍一下”
思路: 1、这是面试的必考题目。 2、介绍内容要与个人简历相一致。 3、表述方式上尽量口语化。 4、要切中要害,不谈无关、无用的内容。 5、条理要清晰,层次要分明。 6、事先最好以文字的形式写好背熟。
问题二:“谈谈你的家庭情况”
思路: 1、 况对于了解应聘者的性格、观念、心态等有一定的作用,这是招聘单位问该问题的主要原因。 2、 简单地罗列家庭人口。 3、宜强调温馨和睦的家庭氛围。 4、 宜强调父母对自己教育的重视。 5、 宜强调各位家庭成员的良好状况。 6、 宜强调家庭成员对自己工作的支持。 7、 宜强调自己对家庭的责任感。
问题三:“你有什么业余爱好?”
思路: 1、业余爱好能在一定程度上反映应聘者的性格、观念、心态,这是招聘单位问该问题的主要原因。 2、 最好不要说自己没有业余爱好。 3、不要说自己有那些庸俗的、令人感觉不好的爱好。 4、 最好不要说自己仅限于读书、听音乐、上网,否则可能令面试官怀疑应聘者性格孤僻。 5、最好能有一些户外的业余爱好来“点缀”你的形象。
问题四:“你最崇拜谁?”
思路: 1、最崇拜的人能在一定程度上反映应聘者的性格、观念、心态,这是面试官问该问题的主要原因。 2、 不宜说自己谁都不崇拜。 3、 不宜说崇拜自己。 4、 不宜说崇拜一个虚幻的、或是不知名的人。 5、 不宜说崇拜一个明显具有负面形象的人。 6、所崇拜的人人最好与自己所应聘的工作能“搭”上关系。 7、 最好说出自己所崇拜的人的哪些品质、哪些思想感染着自己、鼓舞着自己。
问题五:“你的座右铭是什么?” 思路: 1、座右铭能在一定程度上反映应聘者的性格、观念、心态,这是面试官问这个问题的主要原因。 2、不宜说那些医引起不好联想的座右铭。 3、不宜说那些太抽象的座右铭。 4、不宜说太长的座右铭。 5、座右铭最好能反映出自己某种优秀品质。 6、 参考答案——“只为成功找方法,不为失败找借口”
问题六:“谈谈你的缺点”
思路: 1、 不宜说自己没缺点。 2、 不宜把那些明显的优点说成缺点。 3、 不宜说出严重影响所应聘工作的缺点。 4、 不宜说出令人不放心、不舒服的缺点。 5、可以说出一些对于所应聘工作“无关紧要”的缺点,甚至是一些表面上看是缺点,从工作的角度看却是优点的缺点。
问题七:“谈一谈你的一次失败经历” 思路: 1、 不宜说自己没有失败的经历。 2、 不宜把那些明显的成功说成是失败。 3、 不宜说出严重影响所应聘工作的失败经历, 4、所谈经历的结果应是失败的。 5、 宜说明失败之前自己曾信心白倍、尽心尽力。 6、 说明仅仅是由于外在客观原因导致失败。 7、失败后自己很快振作起来,以更加饱满的热情面对以后的工作。
问题八:“你为什么选择我们公司?”
思路: 1、 面试官试图从中了解你求职的动机、愿望以及对此项工作的态度。 2、 建议从行业、企业和岗位这三个角度来回答。 3、 参考答案——“我十分看好贵公司所在的行业,我认为贵公司十分重视人才,而且这项工作很适合我,相信自己一定能做好。”
问题九:“对这项工作,你有哪些可预见的困难?”
思路: 1、 不宜直接说出具体的困难,否则可能令对方怀疑应聘者不行。 2、可以尝试迂回战术,说出应聘者对困难所持有的态度——“工作中出现一些困难是正常的,也是难免的,但是只要有坚忍不拔的毅力、良好的合作精神以及事前周密而充分的准备,任何困难都是可以克服的。”
问题十:“如果我录用你,你将怎样开展工作”
思路: 1、如果应聘者对于应聘的职位缺乏足够的了解,最好不要直接说出自己开展工作的具体办法, 2、可以尝试采用迂回战术来回答,如“首先听取领导的指示和要求,然后就有关情况进行了解和熟悉,接下来制定一份近期的工作计划并报领导批准,最后根据计划开展工作。”
问题十一:“与上级意见不一是,你将怎么办?”
思路: 1、一般可以这样回答“我会给上级以必要的解释和提醒,在这种情况下,我会服从上级的意见。” 2、如果面试你的是总经理,而你所应聘的职位另有一位经理,且这位经理当时不在场,可以这样回答:“对于非原则性问题,我会服从上级的意见,对于涉及公司利益的重大问题,我希望能向更高层领导反映。”
问题十二:“我们为什么要录用你?”
思路: 1、应聘者最好站在招聘单位的角度来回答。 2、 招聘单位一般会录用这样的应聘者:基本符合条件、对这份共组感兴趣、有足够的信心。 3、如“我符合贵公司的招聘条件,凭我目前掌握的技能、高度的责任感和良好的饿适应能力及学习能力 ,完全能胜任这份工作。我十分希望能为贵公司服务,如果贵公司给我这个机会,我一定能成为贵公司的栋梁!”
问题十三:“你能为我们做什么?”
思路: 1、 基本原则上“投其所好”。 2、 回答这个问题前应聘者最好能“先发制人”,了解招聘单位期待这个职位所能发挥的作用。 3、 应聘者可以根据自己的了解,结合自己在专业领域的优势来回答这个问题。
问题十四:“你是应届毕业生,缺乏经验,如何能胜任这项工作?”
思路: 1、 如果招聘单位对应届毕业生的应聘者提出这个问题,说明招聘单位并不真正在乎“经验”,关键看应聘者怎样回答。 2、对这个问题的回答最好要体现出应聘者的诚恳、机智、果敢及敬业。 3、如“作为应届毕业生,在工作经验方面的确会有所欠缺,因此在读书期间我一直利用各种机会在这个行业里做兼职。我也发现,实际工作远比书本知识丰富、复杂。但我有较强的责任心、适应能力和学习能力,而且比较勤奋,所以在兼职中均能圆满完成各项工作,从中获取的经验也令我受益非浅。请贵公司放心,学校所学及兼职的工作经验使我一定能胜任这个职位。”
问题十五:“你希望与什么样的上级共事?”
思路: 1、通过应聘者对上级的“希望”可以判断出应聘者对自我要求的意识,这既上一个陷阱,又上一次机会。 2、 最好回避对上级具体的希望,多谈对自己的要求。 3、 如“做为刚步入社会新人,我应该多要求自己尽快熟悉环境、适应环境,而不应该对环境提出什么要求,只要能发挥我的专长就可以了。”
问题十六:“您在前一家公司的离职原因是什么?”
思路: 1、 最重要的是:应聘者要使找招聘单位相信,应聘者在过往的单位的“离职原因”在此家招聘单位里不存在。 2、避免把“离职原因”说得太详细、太具体。 3、不能掺杂主观的负面感受,如“太幸苦”、“人际关系复杂”、“管理太混乱”、“公司不重视人才”、“公司排斥我们某某的员工”等。 4、但也不能躲闪、回避,如“想换换环境”、“个人原因”等。 5、 不能涉及自己负面的人格特征,如不诚实、懒惰、缺乏责任感、不随和等。 6、尽量使解释的理由为应聘者个人形象添彩。 7、如“我离职是因为这家公司倒闭。我在公司工作了三年多,有较深的感情。从去年始,由于市场形势突变,公司的局面急转直下。到眼下这一步我觉得很遗憾,但还要面对显示,重新寻找能发挥我能力的舞台。” 同一个面试问题并非只有一个答案,而同一个答案并不是在任何面试场合都有效,关键在于应聘者掌握了规律后,对面试的具体情况进行把握,有意识地揣摩面试官提出问题的心理背景,然后投其所好。
1. 兄弟不幸堕落到考研辅导这个行列,今年是第三年。 转自81.china.com 2. 兄弟辅导的中心思想是“国家意志,精神高度,加分意识”。 转自81.china.com 3. 所谓中产阶级,就是在你所生活的那个城市的中心地带,有一所100平 转自81.china.com 以上的flat,有一个亲爱的爱人叫darling,有一个可爱的孩子叫baby,有一辆小汽车,至少是宝来这个级别的叫car,嗯,还有一条经常坐在轿车的副驾驶位置上的小狗叫pet. 转自81.china.com 4. 如果我们这个国家在未来的十年内不出现重大的异变,比如台海战争, 转自81.china.com 比如比萨斯还要难以控制的疾病,那么在座的百分之九十九都会顺利地成长为中产阶级的一员;如果高中以下文化程度的人在未来的十年内,他们本身不出现重大的异变,比如将自己的学历从高中搞到专科、本科,那么,他们当中百分之九十九的将不会顺利地成长为这个阶层的一员。 转自81.china.com 5. 所谓小蜜搞乱了家庭,党校搞乱了文凭。 转自81.china.com 6. 毛泽东什么人?五千年出一个的牛人!今天后生小子菲薄他的很多,兄 转自81.china.com 弟以为,如果不是别有用心,便是思考问题不再一个层面上。 转自81.china.com 7. 短短的浅浅的窄窄的海峡。 转自81.china.com 8. 并不是每个国家都像我们伟大的祖国这样大。 转自81.china.com 9. 一对对恋人,是校园里最美的风景。如果在考研的过程中,在辅导班上 转自81.china.com 你能成就一段姻缘的话,研究生考上了可以不上的。 转自81.china.com 10. 女生傍什么大款?傍大款,仅仅从技术的角度来考虑也是最不安全的。 转自81.china.com 11. 从自己的同学中去寻找自己的恋人,然后两个人相互鼓励着温暖着打拼 转自81.china.com 十年,共同成长为我们这个社会的中产阶级的一员,然后再坐在摇椅里慢慢的看着对方慢慢老去,这是一件多么浪漫的事。 转自81.china.com 12. 你们这个年龄的女孩子,最多叫清纯,漂亮,不能叫美。高耀洁叫美, 转自81.china.com 宋庆龄叫美,袁隆平叫美,周总理,那是美的极致。兄弟往这里一站,约略也可以叫做美的典型。 转自81.china.com 13. 你们是知识女性,应该学会用知识打造自己,培育塑造自己,让自己越 转自81.china.com 老越美。 转自81.china.com 14. 西方国家的金融制度再不健全,都比我们健全。索罗斯在他们那里,毕 转自81.china.com 竟只有一个,但在我们这里,有无数个。 转自81.china.com 15. 问题不在于有没有失业,也不在于失业的多寡,而在于如何对待失业。 转自81.china.com 16. 在每一个打劫者的背后,几乎都有一个令人心酸的故事。他们没文化 转自81.china.com 阿,同志们。如果他们知道当年我们的红军是如何筹饷的时候,他们也许就不会犯这样愚蠢的错误。兄弟当时,几乎有告诉他们应该打劫什么人的冲动。 转自81.china.com 17. 赵铁锤出现的频率比总理还高。 转自81.china.com 18. 天堂里没有煤矿,兄弟祝他们在天堂里幸福。 转自81.china.com 19. 朝鲜战争的意义就在于将中国从近代以来颓靡的国运中给超拔了出来。 转自81.china.com 20. 中国共产党的第一代领导人,放屁都能砸个坑。 转自81.china.com 21. 要打出中国的军威国威来,要让他们知道山神爷是石头做的。 转自81.china.com 22. 里根提出以实力求和平大约相当于黎叔说21世纪什么最重要?人才。 转自81.china.com 23. 美国人连续十一年的关于中国人权状况的白皮书,在客观上刺激了中国 转自81.china.com 的人权进步,但那不是美国人的主观意图。 转自81.china.com 24. 决定一个国家对外政策的核心原因是国家利益。 转自81.china.com 25. 看到美国的时候,把八个字送给它。 转自81.china.com 26. 每个城市都有那么多的色情场所,我郑重地敬告你,哪些地方不是我们 转自81.china.com 这个阶层的人去的。如果你一定要去,也一定要注意安全。 转自81.china.com 27. 16个天安门广场大的嘴巴一天要张三次。 转自81.china.com 28. 你们这些女生看不上你们同班同年级的男生这很正常,你知道吗?你们的心理年龄要比同龄的男生大那么三到五岁,只要看着顺眼,不妨打造他,鼓励他,培养他,使他的心理年龄尽快和你一致起来。那时候,你知道,你的身上不仅洋溢着恋人的光芒,还洋溢着圣母玛利亚的光芒阿。 转自81.china.com 29. 器物层面,制度层面,文化层面。 转自81.china.com 30. 日本人最早跟中国学,但是中国文化里那个仁爱的传统它没有学到;战后,日本人又跟西方学,但基督教文明中的忏悔意识它也没有学到。于是它成为今天这样一个不伦不类的样子。 转自81.china.com 31. 你想搞谁就搞谁,而我连个莱温斯基都搞不定。 转自81.china.com 32. 普京讥讽道:“我需要钱吗?”思考问题就不在一个层面上。 转自81.china.com 33. 当官的一人肩上一把小铁锨,边走边挖坑。 转自81.china.com 34. 像捐钱这样的小事,留给兄弟去做。 转自81.china.com 35. 放屁,他心疼。国有资产流失了那么多,他早该上吊了。 转自81.china.com 36. 富豪榜,黑名单。消失。5-8年。 转自81.china.com 37. 一个学者考虑问题和一个政治家考虑问题,它当然又不在一个层次上。 转自81.china.com 38. 桔生淮南淮北还不一样,何况是一种制度? 转自81.china.com 39. 委员会的单数制与秘密投票箱。 转自81.china.com 40. 金钱政治是进步还是落后? 转自81.china.com 41. 正义有两个原则,一个是平等,一个是差异。罗尔斯于1972年总结的 转自81.china.com 。但我们的老祖宗在实践中早就实践了。算命先生的祖师爷叫徐子平,北宋人,当年传授这个技艺的时候,定下的行规就是只能传给失明的瞎子。所体现的就是这个正义原则的差异原则。但是今天,明眼的也抢瞎子的饭碗了。那是要遭天谴的。 转自81.china.com 42. 是汉化还是我们大家一起被西化了阿? 转自81.china.com 43. 社会演化到今天,我们的妇女何止顶半边天,顶大半个天,顶整个天 转自81.china.com 了。你们不知道,兄弟在家里是一点地位都没有的。 转自81.china.com 44. 我上管天,下管地,中间还要管空气。 转自81.china.com 45. 两千年的文化给我们留下了一个仁的传统;毛泽东给我们留下了一个平 转自81.china.com 等的传统,尽管这个平等的传统是没有多少自由的平等;而小平给我们留下了一个自由的传统,而这个自由的传统又是缺少平等的自由。兄弟想,未来的中国的发展走向,也许是仁、平等、自由这样三种传统的融合的一种发展走向吧。 转自81.china.com 46. 中美关系的大门是被美国人从外面给锸死的。 转自81.china.com 47. 尼克松走下飞机的舷梯,冲着迎接他的周总理伸出手去,她说的第一句 转自81.china.com 话是什么?“我为美国利益而来”。人家不是因为我们总理长得帅,来看帅哥来了。 转自81.china.com 48. 美国,也仅仅是在最近的10几20年里,才逐渐长成了人样。此前,他 转自81.china.com 就是禽兽,就是豺狼。 转自81.china.com 49. 在美国1787年宪法里,他们说妇女不是人,黑人不是一个完整的人。 转自81.china.com 美国妇女获得和男人一样的选举权是在1920年,而黑人,你们知道吗丁路德金的著名的演讲。他被暗杀是在1968年。 转自81.china.com 50. 美国人均汽车是一点三辆,我们有可能赶上美国吗?那是个什么概念? 转自81.china.com 陈淮算过一笔帐:全世界所有的汽车制造厂要连续生产26年,才可以满足中国人均一点三辆的汽车需求。 转自81.china.com 51. 别了,司徒雷登,那是写给谁看的?不是蒋介石,不是美国人,而是苏 转自81.china.com 联人! 转自81.china.com 52. 恐怖主义对于美国来说是锥子,而中国的壮大则是刀子。 转自81.china.com 53. 和平崛起或曰发展,是我们的一厢情愿,它的能否实现,并不仅仅取决 转自81.china.com 于我们。兄弟以为,未来的五十年,也许有三场仗是不能不打的。 转自81.china.com 转自81.china.com 毛泽东思想概论 转自81.china.com 转自81.china.com 54. 所谓马克思主义的中国化,也就是今天某些高人所讲的本土化。 转自81.china.com 55. 恩格斯说,把革命归因于少数恶意者的煽动的迷信的时代已经过去了;列 转自81.china.com 宁说革命是在成熟了的危机和伟大的转折中发生出来的,换句话说,革命是被统治者逼出来的。兄弟用句篱笆女人狗里的歌词,那就是被统治者“再也不能这样活,再也不能这样过”,于是革命发生了。 转自81.china.com 56. 此地不留爷,自有留爷处。处处不留爷,爷在毛泽东时代,是去投八路。 转自81.china.com 57. 在五四运动前后,中国工人阶级的数量是200万左右;同期,中国土匪 转自81.china.com 的数量,是2200万左右。 转自81.china.com 58. 中国共产党建立了自己的武装力量之后,参加工农武装的多了,当土匪 转自81.china.com 的少了,知道原因吗?当红军八路军的死亡概率是20%,而当土匪的死亡概率是50%。 转自81.china.com 59. 以下的这些人物为毛泽东思想的形成做出了突出贡献:陈独秀,北大文 转自81.china.com 科学长,相当于今天的文学院院长或者人文社科部主任,月薪360大洋;李大钊,北大图书馆长,法学教授,月薪220大洋;毛泽东,北大图书馆的临时工,月薪9块大洋。同期,彭德怀在一家军阀的队伍里当连长,月薪5块大洋。 转自81.china.com 60. 正是在北大,毛泽东从一个激进的民主主义者完成了到共产主义者的 转自81.china.com 转变。 转自81.china.com 61. 兄弟有同学姓杜,四月里紫藤花开的时候生了个女儿,取名杜紫藤,后 转自81.china.com 改名杜滴定。 转自81.china.com 62. 知道毛泽东多大读小学吧?16岁。8岁念私塾,因为上课看小说,被老师告诉了他父亲,于是他父亲举着扫帚疙瘩满大街的追打幼小的毛泽东。毛泽东知道跑不过他父亲,于是在跑到村子中央的池塘边的时候,他不跑了。对着追上来的气喘吁吁的父亲说:“你再追,我就跳下池塘,死给你看。”他父亲妥协了,答应不打他。于是,8岁的毛泽东第一次尝到了斗争的好处。16岁的时候,他听说在距他老家30里的地方开办了一所现代意义上的小学叫东山小学的时候,他对ta父亲说: “老爸,我要去念小学。”他爸爸上上下下打量了他好几眼,说:“你看你这么高的个子,比我还高;又是长子,你理应帮我打理一下这个家承担起你做长子的责任来,去念什么啥子小学?”毛回答:“我一定要去。” 转自81.china.com “如果我一定不同意呢?”他父亲瞪着眼珠子问。 转自81.china.com “那我就死给你看!” 转自81.china.com 谈判的结果是他父亲每月给他两块大洋,一身短衫,一身长衫,不给草鞋,允许他再念两年。于是毛泽东高高兴兴地穿着短衫,背着长衫,怀揣着两块大洋,光着脚丫子,去东山小学念小学去了。 转自81.china.com 63. 他不仅丝毫的不以为意,还会冲着你渐去渐远的身影由衷地赞叹"啊,有 转自81.china.com 个性!” 转自81.china.com 64. 走,我带你去吧。 转自81.china.com 65. 像人大那样的衰校还有没有必要考啊? 转自81.china.com 66. 一辈子都追求小概率的事件,这种人生是比较郁闷的;一辈子一次都不 转自81.china.com 追求小概率事件,这样的人生是最郁闷的。 转自81.china.com 67. 一个没有远方的人是注定走不了多远的。 转自81.china.com 68. 思路决定出路。 转自81.china.com 69. 上门板,洗澡避女人青山大学毕业的。” 转自81.china.com 71. 毛泽东思想在抗战时期成熟的原因,年青算不算?江青算不算?要考 转自81.china.com 研,趁年轻;要考研,靠爱情。-----找个恋人吧,还没有找到的。 转自81.china.com 72. 西点军校,林彪,失散的儿子,两个鸡蛋,士兵委员会,张如心,林 转自81.china.com 心如。 转自81.china.com 73. 橘子七八瓣。 转自81.china.com 74. 如果7个人人中,只有你一个人考,我可以负责任的告诉你,你死定了。 转自81.china.com 75. 以斗争求团结则团结存,以妥协退让求团结则团结亡。 转自81.china.com 76. 有时候,是需要以身体的碰撞来达到一种新的平衡的。 转自81.china.com 77. 所谓成功,其实就是一种习惯。 转自81.china.com 78. 当我们这个国家走上依法治国的路径的时候,所谓人民内部矛盾的命题 转自81.china.com 也就应该成为历史的命题了。 转自81.china.com 79. 建设社会主义没有经验,历史该轮到毛泽东犯错误了,毛泽东也就果然 转自81.china.com 犯了错误。中国的,乃至世界的历史,我们看到,它就是在左右摇摆中蹒跚而行的。 转自81.china.com 80. 梁漱溟说,主席,你发烧37度。 转自81.china.com 81. 党史上称是“凯歌行进的年代”,我们的文艺工作者描述是“激情燃烧 转自81.china.com 的岁月”。 转自81.china.com 82. 想想,兄弟们,刚刚建国的时候我们能生产什么?我们除了孩子几乎什 转自81.china.com 么都不能生产。 转自81.china.com 83. 政治/经济/文化,这是分析问题的三个基本方面。请记住:仅仅是为了 转自81.china.com 研究叙述的方便,我们才这样区分;事实上,它们并不截然两分或三分。 转自81.china.com 84. 马克思给我们提供了两对分析问题的框架。社会学之父,政治社会学 转自81.china.com 之父。 转自81.china.com 85. 亚里斯多德2000年前的政治学,到今天,我们发现,过时的话不多; 转自81.china.com 但今天,有很多话,一说出来就过时;甚至还没说出来就过时了。这是大师和小丑的区别。 转自81.china.com 转自81.china.com 邓三 转自81.china.com 86. 北京1300万人,有几个是从当年的周口店下来的? 转自81.china.com 87. 烧饼五毛钱一个。李鸟。厕所。小平你好。 转自81.china.com 88. 眼镜架在鼻鼻上,双手捂在肚肚上,腰带扎在胸膛上。 转自81.china.com 89. 我在北大最豪华的也是东南亚最大的农园餐厅请你们吃每人五块钱的 转自81.china.com 盒饭。 转自81.china.com 90. 说是五块,其实请着请着就超了,至少五块五。 转自81.china.com 91. 如果要闯荡江湖的话,怀揣着一纸全日制大学本科文凭,也足以“一剑 转自81.china.com 寒九州”。 转自81.china.com 92. 兄弟一直以为,研究生考上了可以不上,但不能不考。在备考的这段日 转自81.china.com 子里,你会觉得你的心智都得到了锤炼,兄弟想,这个过程,就是所谓涅磐的过程。 转自81.china.com 93. 思考问题,就不在一个层面上。 转自81.china.com 94. 新闻联播主要是给我们这个国家的高中以下文化程度的人看的。它的作 转自81.china.com 用是鼓劲。你应该注意,新闻联播节目之后,是那档节目?天气预报。新闻联播的阳光灿烂之后,宋英杰或者杨丹马上出来告诉你此地阳关灿烂而彼地风雨交加,间或还有冰雹。他们用自然界的阴晴圆缺来影射社会生活也不可能总是春光明媚的。再接下来才是焦点访谈。告诉我,国家电视台核心的一套节目在7-8点的黄金时间段里安排这样三档节目,是不是刻意的?你会说,老师,我怎么就没想到呢?呵呵,思考问题就不在一个层面上。记住,要提升自己思考问题的层面。 转自81.china.com 95. 你应该具备的是两种眼光:一种是历史的纵深眼光;一种是宽广的世界 转自81.china.com 眼光。也就是上下五千年,纵横数万里。 转自81.china.com 96. 一个人的身高往往与他的智慧成反比。 转自81.china.com 97. 要盯着镜子里的你,至少看成是小平老人家。 转自81.china.com 98. 鸡蛋,它连小鸡都能孵出来,它什么营养能缺? 转自81.china.com 99. 一天要保证八种以上新鲜蔬菜的摄入量。 转自81.china.com 100. 韬光养晦,说白了,就是装孙子。但是,装孙子,不是为了做孙子。 转自81.china.com 101. 所谓可持续发展,就是不发断子绝孙财。这里面有一个代际公平的 转自81.china.com 问题。 转自81.china.com 102. 所谓以人为本,就是拿人当人。记住,你是人。我们是人。 转自81.china.com 103. 人治条件下,最高统治者的身边,一般有两种人。一种是野心家, 转自81.china.com 一种是唯唯诺诺的奴才。两种人谁上台,都不会给那个国家带来稳定。 转自81.china.com 104. 讲依法治国与以德治国相结合,难道我们的法律是缺德的吗? 转自81.china.com 105. 义务教育所要解决的是一个起点的公平问题。所谓免费义务教育, 转自81.china.com 那是一个笑话。 转自81.china.com 106. 我们的运动员是实验室里制造出来的运动员。 转自81.china.com 107. “兄弟”是一个有文化的词:论语里有“四海之内皆兄弟也”; 转自81.china.com 陶渊明杂咏十二首也有“落地为兄弟,何必骨肉亲?”。 转自81.china.com 108. 女生可以用“小妹以为”“小女子以为”。 转自81.china.com 109. 空格,大二号,标准的宋体字。 转自81.china.com 110. 你的英语词汇量如果仅仅有2000,兄弟就可以说:“你还有很大 转自81.china.com 的发展空间。” 转自81.china.com 111. 初级阶段的九个特征用一句话来概括,就是政治经济文化全面落 转自81.china.com 后。用我们同学的话来说就是:“白天停水,晚上停电。要米没米,要面没面。打开书本,找到答案,原来是社会主义初级阶段。往后翻,我靠,还要100年不变!” 转自81.china.com 112. 有一个技术问题不好解决。三个代表,金庸,小说创作。 转自81.china.com 113. 顾准吴敬琏的境界,兄弟也是景行行止,高山仰止,虽不能至,而 转自81.china.com 心向往之。 转自81.china.com 114. 岱年先生正是在江西农场养成了冥想的习惯,这一冥想,冥想出了 转自81.china.com 一个哲学史的大家。-----看人家怎么对待挫折的? 转自81.china.com 115. 臣民意识与公民意识。 转自81.china.com 116. 自由迁徙权。 转自81.china.com 117. 村民意识,村落共同体意识。 转自81.china.com 118. 熟人社会与陌生人社会。 转自81.china.com 119. 单位人与社会人。 转自81.china.com 120. 屁股决定脑袋。 转自81.china.com 121. 教授与叫唤的兽。 转自81.china.com 122. 处处不留爷,爷就去打劫。技术含量不高的工种。 转自81.china.com 123. 性格决定命运,胸襟决定格局,思路决定出路。 转自81.china.com 124. 胸襟要大,格局要宽。 转自81.china.com 125. 大象过河,横断截流。 转自81.china.com 126. 你一定来自那温郁的南方。 转自81.china.com 127. 你看你看你看,民主与科学顶个球。 转自81.china.com 128. 象你我这样的党员,想腐败是没有机会的。这是一个制度的制约。 转自81.china.com 129. 胡长清所创造的纪录很快被另一个人给破了。 转自81.china.com 130. 兄弟是一个单纯并热情的人,阿甘是兄弟的偶像。 转自81.china.com 131. 小拇指说:拜佛的时候,我是领队啊。 转自81.china.com 132. 悦纳自己
第一部分:选择题
QUESTION NO: 1
1、public class Test {
public static void changeStr(String str){
str="welcome";
}
public static void main(String[] args) {
String str="1234";
changeStr(str);
System.out.println(str);
}
}
Please write the output result :
QUESTION NO:2
1. public class Test {
2. static boolean foo(char c) {
3. System.out.print(c);
4. return true;
5. }
6. public static void main( String[] argv ) {
7. int i =0;
8. for ( foo('A'); foo('B')&&(i<2); foo('C')){
9. i++ ;
10. foo('D');
12. }
13. }
14. }
What is the result?
A. ABDCBDCB
B. ABCDABCD
C. Compilation fails.
D. An exception is thrown at runtime.
QUESTION NO: 3
1. class A {
2. protected int method1(int a, int b) { return 0; }
3. }
Which two are valid in a class that extends class A? (Choose two)
A. public int method1(int a, int b) { return 0; }
B. private int method1(int a, int b) { return 0; }
C. private int method1(int a, long b) { return 0; }
D. public short method1(int a, int b) { return 0; }
E. static protected int method1(int a, int b) { return 0; }
QUESTION NO: 4
1. public class Outer{
2. public void someOuterMethod() {
3. // Line 3
4. }
5. public class Inner{}
6. public static void main( String[]argv ) {
7. Outer o = new Outer();
8. // Line 8
9. }
10. }
Which instantiates an instance of Inner?
A. new Inner(); // At line 3
B. new Inner(); // At line 8
C. new o.Inner(); // At line 8
D. new Outer.Inner(); // At line 8//new Outer().new Inner()
QUESTION NO: 5
Which method is used by a servlet to place its session ID in a URL that is written to the servlet’s response output stream?
A. The encodeURL method of the HttpServletRequest interface.
B. The encodeURL method of the HttpServletResponse interface.
C. The rewriteURL method of the HttpServletRequest interface.
D. The rewriteURL method of the HttpServletResponse interface.
QUESTION NO: 6
Which two are equivalent? (Choose two)
A. <%= YoshiBean.size%>
B. <%= YoshiBean.getSize()%>
C. <%= YoshiBean.getProperty("size")%>
D. <jsp:getProperty id="YoshiBean" param="size"/>
E. <jsp:getProperty name="YoshiBean" param="size"/>
F. <jsp:getProperty id="YoshiBean" property="size"/>
G. <jsp:getProperty name="YoshiBean" property="size"/>
QUESTION NO: 7
Which of the following statements regarding the lifecycle of a session bean are correct?
1. java.lang.IllegalStateException is thrown if SessionContext.getEJBObject() is invoked when a stateful session bean instance is passivated.
2. SessionContext.getRollbackOnly() does not throw an exception when a session bean with bean-managed transaction demarcation is activated.
3. An exception is not thrown when SessionContext.getUserTransaction() is called in the afterBegin method of a bean with container-managed transactions.
4. JNDI access to java:comp/env is permitted in all the SessionSynchronization methods of a stateful session bean with container-managed transaction demarcation.
5. Accessing resource managers in the SessionSynchronization.afterBegin method of a stateful session bean with bean-managed transaction does not throw an exception.
第二部分:概念题
1. 描述Struts体系结构?对应各个部分的开发工作主要包括哪些?
2. XML包括哪些解释技术,区别是什么?
3. JSP有哪些内置对象和动作?它们的作用分别是什么?
4、SQL问答题
SELECT * FROM TABLE
和
SELECT * FROM TABLE
WHERE NAME LIKE '%%' AND ADDR LIKE '%%'
AND (1_ADDR LIKE '%%' OR 2_ADDR LIKE '%%'
OR 3_ADDR LIKE '%%' OR 4_ADDR LIKE '%%' )
的检索结果为何不同?
5、SQL问答题
表结构:
1、 表名:g_cardapply
字段(字段名/类型/长度):
g_applyno varchar 8;//申请单号(关键字)
g_applydate bigint 8;//申请日期
g_state varchar 2;//申请状态
2、 表名:g_cardapplydetail
字段(字段名/类型/长度):
g_applyno varchar 8;//申请单号(关键字)
g_name varchar 30;//申请人姓名
g_idcard varchar 18;//申请人身份证号
g_state varchar 2;//申请状态
其中,两个表的关联字段为申请单号。
题目:
1、 查询身份证号码为440401430103082的申请日期
2、 查询同一个身份证号码有两条以上记录的身份证号码及记录个数
3、 将身份证号码为440401430103082的记录在两个表中的申请状态均改为07
4、 删除g_cardapplydetail表中所有姓李的记录
public class Test {
public static void changeStr(String str){
str="welcome";
}
public static void main(String[] args) {
String str="1234";
changeStr(str);
System.out.println(str);
}
}
这一题我想他主要考查 static这个关键字,changestr是个静态的方法(类方法)那么str应该也是一个静态成员,所有的对象都是公用这样的一个成员,那么对他的修改应该是可以保持的。而为什么最后的结果却是初始值1234,我有点迷惑
终于明白了:按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
不管是在c/c++中还是在java函数调用都是传值调用,.
当参数是对象的时候,传递的是对象的引用,这个和c/c++传递指针是一个道理,在函数中改变引用本身,不会改变引用所指向的对象,而在QUESTION NO: 1中只是改变了引用,所以在main函数中输出还是原来的那个值:1234
参数是对象时传的是地址。但str="welcome";相当于str=new String("welcome");,所以原对象没变。
可以参考以下代码:
public class Test {
public int ss = 999;
public Test(int s){
ss = s;
}
public static void changeStr(Test t){
t.ss = 888;
}
public static void main(String[] args) {
Test t = new Test(999);
changeStr(t);
System.out.println(t.ss);
}
}
public class Test {
public int ss = 999;
public Test(int s){
ss = s;
}
public static void changeStr(Test t){
t = new Test(888);
}
public static void main(String[] args) {
Test t = new Test(999);
changeStr(t);
System.out.println(t.ss);
}
}
QUESTION NO:2
1. public class Test {
2. static boolean foo(char c) {
3. System.out.print(c);
4. return true;
5. }
6. public static void main( String[] argv ) {
7. int i =0;
8. for ( foo('A'); foo('B')&&(i<2); foo('C')){
9. i++ ;
10. foo('D');
12. }
13. }
14. }
What is the result?
A. ABDCBDCB
B. ABCDABCD
C. Compilation fails.
D. An exception is thrown at runtime
做一下这个吧!!
第一题终于清楚了。
对象是传引用的。但是下面还是有区别
public class test6 {
public int ss = 999;
public test6(int s){
ss = s;
}
public static void changeStr(test6 t){
t.ss = 888;
}
public static void change(test6 t){
t = new test6(222);
}
public static void main(String[] args) {
test6 t = new test6(999);
changeStr(t);
System.out.println(t.ss);
change(t);
System.out.println(t.ss);
}
}
import javax.swing.JOptionPane;
public class Test {
public void changeStr(String str){
str="welcome";
}
public void main(String[] args) {
String str="1234";
str="welcome";
//changeStr(str);
JOptionPane.showMessageDialog(null,str);
}
}
如果这样做的话结果是welcome
在我我想说的是在C语言以后所有的参数传递都是值传递,问题是传的值是是什么,而没有什么引用传递之类的东西。
关于输出为1234而不是welcome 还有待进一步分析。
我现在去上课了,回来再和大家细说
对第一题的详细分析:
Java中函数参数传递是值传递,在C语言以后的都是这样的,关键是传进来的值是什么(这一点我在上面说了到一次)。
①如果参数是基础类型,如int型的,则传进来的是int型变量的值,这个值放在堆里。
举个例子:
void fun(int i){};
int i = 5;
fun(i);
传进fun函数的是5;
②如果参数是引用类型。如String型的,则传进来的是String型变量的值,这个值放在栈里,此值是该变量将要指向的对象的地址。
举个例子:
void fun(String str0){};
String str = "Hello";
fun(str);
fun()方法调用时第一件事就是,做了一个赋值操作:str0 = str;
这个操作的结果就是将str变量的值传给str0变量的值,也就是使得str0也指向str所指向的对象。对str0所指向的对象做修改操作,也就是对str所指的对象做修改。
有了上面的两点,我想做第一个题目一定是没什么问题的了:
说明:为了方便分析我把changeStr()方法中的参数名改成了str0。
改动后的代码如下:
1.public class Test {
public static void changeStr(String str0){
str0="welcome";
}
public static void main(String[] args) {
String str="1234";
changeStr(str);
System.out.println(str);
}
}
哎,第一题没那么复杂,都说的离谱了,具体讨论请见TIJ的附录一 关于别名和引用那一章. 我们不争论JAVA到底是传值还是传引用,因为两者某种意义上都是正确的.传值的认为传递引用本身是传值行为,这没错,可我们一般把reference当成了对象,所以说成传引用也说得过去,概念就不多说了. 为什么str在changeStr之后没变?这是因为JAVA对所有的外覆类性(基本类型的对应类)是采用所谓的恒常对象(唯读对象,read- only),这些外覆类中的任何函数行为的调用都不会改变原对象,而是产生一个新对象,这就是为什么我们在需要动态增加String时要用 StringBuffer的原因.可对于我们自己所创建的对象,并没有这个"恒常"的特性,所以在这里有个"别名"现象,也就是几个引用同时指向一个对象,任何一个引用对对象的修改都将影响到其他. 在这个例子中,changeStr函数的行为其实产生了一个新的对象,函数内的str是局部性的,它指向新的对象,可对原对象没有产生任何影响. 不知道我的解释清楚了,更具体讨论请见Thinking in Java |
对第一题的详细分析:
Java中函数参数传递是值传递,在C语言以后的都是这样的,关键是传进来的值是什么(这一点我在上面说了到一次)。
①如果参数是基础类型,如int型的,则传进来的是int型变量的值,这个值放在堆里。
举个例子:
void fun(int i){};
int i = 5;
fun(i);
传进fun函数的是5;
②如果参数是引用类型。如String型的,则传进来的是String型变量的值,这个值放在栈里,此值是该变量将要指向的对象的地址。
举个例子:
void fun(String str0){};
String str = "Hello";
fun(str);
fun()方法调用时第一件事就是,做了一个赋值操作:str0 = str;
这个操作的结果就是将str变量的值传给str0变量的值,也就是使得str0也指向str所指向的对象。对str0所指向的对象做修改操作,也就是对str所指的对象做修改。
有了上面的两点,我想做第一个题目一定是没什么问题的了:
说明:为了方便分析我把changeStr()方法中的参数名改成了str0。
改动后的代码如下:
1.public class Test {
2. public static void changeStr(String str0){
3. str0="welcome";
4. }
5. public static void main(String[] args) {
6. String str="1234";
7. changeStr(str);
8. System.out.println(str);
9. }
10.}
第7行代码执行过程如下:
将str的值赋给str0,使得str0和str指向同一个String类对象1234
而在changeStr()方法中第3行代码执行的结果是将str0值(也就是对象的地址)做了修改,str0的值为String类对象welcome的地址,这样一来,使得str和str0所指向的对象不再是同一个对象了,而且str的值并没有改变,也就是说str还是指向String类对象1234的。
综上所述,程序最终的结果一定是1234。
补充:
ziyongkun 在 2006-05-10 10:08:00 发的贴子里说的不是很对,并不是一个副本的问题,它们会指向同一个对象的。
QUESTION NO:2
1. public class Test {
2. static boolean foo(char c) {
3. System.out.print(c);
4. return true;
5. }
6. public static void main( String[] argv ) {
7. int i =0;
8. for ( foo('A'); foo('B')&&(i<2); foo('C')){
9. i++ ;
10. foo('D');
12. }
13. }
14. }
========================================================================
考察的是for语句的执行过程:
for(1;2;3)
过程如下:
1;
2;
3;
2;
.
.
.
当i<2时,便不再执行。其实是基础&细心~~~~~~~
4、SQL问答题
SELECT * FROM TABLE
和
SELECT * FROM TABLE
WHERE NAME LIKE '%%' AND ADDR LIKE '%%'
AND (1_ADDR LIKE '%%' OR 2_ADDR LIKE '%%'
OR 3_ADDR LIKE '%%' OR 4_ADDR LIKE '%%' )
的检索结果为何不同?
=========================================================
前者检索全部,后者有三种情况检索不出:NAME=null或ADDR=null或1_ADDR LIKE 2_ADDR 3_ADDR 4_ADDR其一为null.
4、SQL问答题
SELECT * FROM TABLE
和
SELECT * FROM TABLE
WHERE NAME LIKE '%%' AND ADDR LIKE '%%'
AND (1_ADDR LIKE '%%' OR 2_ADDR LIKE '%%'
OR 3_ADDR LIKE '%%' OR 4_ADDR LIKE '%%' )
的检索结果为何不同?
答:前者检索所有记录,后者只能检索出 NAME 和ADDR中非Null的记录。
5、SQL问答题
表结构:
1、 表名:g_cardapply
字段(字段名/类型/长度):
g_applyno varchar 8;//申请单号(关键字)
g_applydate bigint 8;//申请日期
g_state varchar 2;//申请状态
2、 表名:g_cardapplydetail
字段(字段名/类型/长度):
g_applyno varchar 8;//申请单号(关键字)
g_name varchar 30;//申请人姓名
g_idcard varchar 18;//申请人身份证号
g_state varchar 2;//申请状态
其中,两个表的关联字段为申请单号。
题目:
1、 查询身份证号码为440401430103082的申请日期
select A.g_applydate
from g_cardapply A inner join g_cardapplydetail B on A.g_applyno = B.g_applyno
where B.g_idCard = '440401430103082'
2、 查询同一个身份证号码有两条以上记录的身份证号码及记录个数
select g_idCard,count(*) as Cnt from g_cardapplydetail
group by g_idcard
having count(*) > 1
3、 将身份证号码为440401430103082的记录在两个表中的申请状态均改为07
update g_cardapplydetail set g_state = '07'
where g_idcard = '440401430103082'
update A set g_state = '07'
from g_cardapply A inner join g_cardapplydetail B on A.g_applyno = B.g_applyno
where B.g_idcard = '440401430103082'
4、 删除g_cardapplydetail表中所有姓李的记录
delete from g_cardapplydetail
where g_name like '李%'
3、 将身份证号码为440401430103082的记录在两个表中的申请状态均改为07
update g_cardapplydetail set g_state = '07'
where g_idcard = '440401430103082'
update A set g_state = '07'
from g_cardapply A inner join g_cardapplydetail B on A.g_applyno = B.g_applyno
where B.g_idcard = '440401430103082'
5、SQL问答题:
/*Select g_cardapply. g_applydate
From g_cardapply, g_cardapplydetail
Where g_cardapply. g_applyno=g_cardapplydetail. g_applyno
And g_cardapplydetail.g_idcard='440401430103082'*/
/*Select *From (select count(*) g_count , g_idcard
From g_cardapplydetail
Group by g_idcard ) a
Where a. g_count >= 2*/
/*Update g_cardapply
set g_state='07'
where g_applyno in (select distinct g_applyno
from g_cardapplydetail
where g_idcard ='440401430103082')
update g_cardapplydetail
set g_state='07'
where g_idcard='440401430103082' */
/*Delete from g_cardapplydetail
Where g_name like '李%'*/
通过测试
PS:偶GF做的,自己先汗一下
2. What are three ways in which a thread can enter the waiting state?
解析: 操作系统问题
4. In C++, there're four type of Casting Operators, please enumerate and explain them especially the difference.
解析: C++类型转换问题
答案:
7 以下代码有什么问题,如何修改?
#include <iostream>
#include <vector>
using namespace std;
void print(vector<int>);
int main()
{
vector<int> array;
array.push_back(1);
array.push_back(6);
array.push_back(6);
array.push_back(3);
//删除array数组中所有的6
vector<int>::iterator itor;
vector<int>::iterator itor2;
itor=array.begin();
for(itor=array.begin(); itor!=array.end(); )
{
if(6==*itor)
{
itor2=itor;
array.erase(itor2);
}
itor++;
}
print(array);
return 0;
}
void print(vector<int> v)
{
cout << "n vector size is: " << v.size() << endl;
vector<int>::iterator p = v.begin();
}
我的答案是,迭代器问题,只能删除第一个6,以后迭代器就失效了,不能删除之后的元素。
但我不知道怎么改
void print(const vector<int>&);
int main()
{
vector<int> array;
array.push_back(1);
array.push_back(6);
array.push_back(6);
array.push_back(3);
//删除array数组中所有的6
array.erase( remove( array.begin(), array.end(), 6 ) , array.end() );
print(array);
return 0;
}
void print(const vector<int>& v)
{
cout << "n vector size is: " << v.size() << endl;
copy(v.begin(), v.end(), ostream_iterator<int>(cout, " ") );
}
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> array;
array.push_back(1);
array.push_back(6);
array.push_back(6);
array.push_back(6);
array.push_back(6);
array.push_back(6);
array.push_back(3);
array.push_back(9);
array.push_back(8);
array.push_back(5);
//ɾ³ýarrayÊý×éÖÐËùÓеÄ6
vector<int>::iterator itor;
itor=array.begin();
for(itor=array.begin(); itor!=array.end();++itor )
{
if(6==*itor)
{
itor=array.erase(itor);
--itor;
}
}
cout << "vector size is: " << array.size() << endl;
for(itor=array.begin(); itor!=array.end();++itor )
{
cout<<*itor<<" ";
}
system("pause");
return 0;
}
2. What are three ways in which a thread can enter the waiting state?
尝试答一下
CPU调度给优先级更高的thread,原先thread进入waiting
阻塞的thread获得资源或者信号,进入waiting
还有什么
static_cast 数制转换
dynamic_cast 用于执行向下转换和在继承之间的转换
const_cast 去掉const
reinterpret_cast 用于执行并不安全的orimplmentation_dependent类型转换
我给你一个完整的解释:
执行itor=array.erase(itor);这句话后,itor不会移动,而只是把删除的数后面的数都往前移一位,所以删除了第一个6后,指针指向第2个6,然后在来个itor++,指针就指向array.end()了,给你画个草图:
1 6 6 3 array.end() //最开始指针itor指向第一个6;
1 6 3 array.end() //删除第一个6后,指向第二个6
1 6 3 array.end() //itor++后,就指向3了,所以不能删除
SAP R/3系统是业界最先进、最稳定的ERP系统,国际和国内大型企业采用该系统的比例遥遥领先于其它ERP系统的总和。SAP R/3内建了二次开发平台,使用的开发语言叫做ABAP,是一种类似于COBOL的编程语言。ABAP在报表输出方面功能相对较弱(只能按行打印在屏幕上或者导出到Excel中处理),所以日常工作中经常需要在外部开发程序。通过程序接口自动读取SAP R/3的数据表(视图),在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。
SAP R/3的接口方式主要有RFC、IDOC、BAPI三种,本文要介绍的是相对比较简单的RFC(Romote Function Call,远程函数调用)。SAP系统RFC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标准或自定义函数,获得函数返回的数据进行处理后显示或打印。下面是RFC调用的模型: 
本文主要不是讨论SAP R/3函数的开发,因为使用SAP的公司一般都有专门的ABAP开发人员。大家如果有机会接触ABAP平台,可以通过事务代码SE37进入ABAP开发平台的"函数编制器"进行函数开发测试。如图:
下面主要以VB为例介绍一下SAP接口RFC的开发思路。在SAP客户端SAP Gui Client安装的时候,注意选择安装附带的SDK包(最保险是选择完全安装)。RFC接口程序开发,主要用的是"SAP.Functions"这个控件,通过控件在外部程序模拟SAP Gui Client的用户登录和函数调用,然后返回函数的值。请看下面的程序片段和重点注解(尤其是test_Click()):Private Sub Command1_Click()
' 定义R/3用户名和密码变量(用户名应由SAP管理员开运行函数的权限)
Dim logname As String * 22, password As String * 22
Call logonr3(logname, password) ' 调用SAP登录界面程序
If logflag Then ' 调用生产、开发系统开关
StatusBar1.Visible = True
StatusBar1.SimpleText = "正在登录SAP R/3系统..."
Dim R3AppServer As String, R3Client As String, R3SystemNo As String
If Form2.opPRD.Value Then
' 以下服务器参数请根据客户配置情况更改
R3AppServer = "10.3.1.4" ' 生产系统服务器IP
R3Client = "800" '生产系统集团代码
R3SystemNo = "00" '生产系统号
Else
R3AppServer = "10.3.3.1" ' 开发系统服务器IP
R3Client = "101"
R3SystemNo = "00"
End If
Unload Form2 ' 释放 Form2 , 所有控件及值不可用
Set Functions = CreateObject("Sap.Functions") ' 创建RFC的本地对象
Set Connect = Functions.Connection ' 设置连接
Connect.ApplicationServer = R3AppServer ' 赋值服务器IP
Connect.Client = R3Client ' 赋值SAP集团代码
Connect.Language = "ZH" ' 置SAP系统界面中文
Connect.User = Trim(logname) ' 赋值SAP登录用户名
Connect.password = Trim(password) ' 赋值SAP登录用户密码
Connect.SystemNumber = R3SystemNo ' 赋值SAP系统号
If Not Connect.Logon(0, True) Then ' 软件登录SAP并判断
MsgBox "登录SAP R/3失败,请重新登录!", vbOKOnly + vbExclamation, "系统提示"
Command1.SetFocus
Else ' 登录SAP成功
Command1.Enabled = False
Command2.Enabled = True
test.Enabled = True
End If
StatusBar1.SimpleText = ""
StatusBar1.Visible = False
End If
End Sub
Private Sub Command2_Click() ' 注销SAP登录
Connect.LogOff
Command2.Enabled = False
Command1.Enabled = True
test.Enabled = False
End Sub
Private Sub Command3_Click() ' 退出SAP接口演示程序
If Form1.Command2.Enabled Then
MsgBox "退出前请断开SAP R/3系统!", vbOKOnly + vbInformation, "系统提示"
Else
End
End If
End Sub
Private Sub Form_Load()
Command2.Enabled = False
test.Enabled = False
logoflag = False
End Sub
Private Sub test_Click() ' SAP RFC远程调用处理主演示
Dim GetCustomers As Object
Dim Customers As Object
Dim i As Integer
' 通过RFC接口远程运行SAP内部函数RFC_CUSTOMER_GET
' 赋要调用的SAP内建函数名
Set GetCustomers = Functions.Add("RFC_CUSTOMER_GET")
GetCustomers.Exports("KUNNR") = "0000000103" ' 向函数入口赋值(客户代码)
' 向函数入口赋查询表名称
Set Customers = GetCustomers.Tables("CUSTOMER_T")
If GetCustomers.Call Then ' 调用成功遍历显示客户所有信息条目
For i = 1 To Customers.rowcount
MsgBox Customers(i, "KUNNR")
Next i
Else
MsgBox " 搜索出错! 出错信息: " + GetCustomers.Exception
End If
End Sub
SAP的RFC调用是其接口技术中最简单和易用的一种方式,该方式开发比较简便,特别适合于外部报表开发,但对于大数据量的查询效率相对较低。大家在熟练掌握后,可以进一步学习高级的IDOC和BAPI接口开发技术。
我从事技术工作,
这几年的面试与被面试总结
先说我去被面试的经验吧。
回答清楚了2个问题,就能顺利过关了。
1。为什么要离开上一家公司。
2。公司为什么要雇佣你。
问第一个问题的是hr(或老板),呵呵 ,即使你技术过关,hr那里没有好的影响,结果是一个字,难!
如何回答呢? hr想推论出你在他的公司能呆多久。这个时候,你甚至可以明确告诉他,我在贵公司至少能呆n(n>=1)年----当然,你没有把握的话,绝对不能乱说,社会上混,要讲信用的。
有一次,我就在这个问题上吃了大亏,我看公司环境还不错,就我自做主张回答1年,结果,hr心目中是m(m>=2)年,呵呵,结果可想而知了。要知道,技术面试都过关了,Hr面试是2选1,在回家的路上,我只能祈祷对手自动放弃或找到了其他更好的工作。:)
问第二个问题的是技术官。你要让他知道你已经做过哪些商业作品。一定要是商业作品。在里面负责哪方面具体工作,对于你熟悉的地方要多说。最好就是能争取笔试或上机,因为用用口说的话,大家理解都不一样,误差可能很大,结果对你相当不利。在这个问题上我也吃过亏的,曾有一个我很看好的职位,认为把握很大,业务理解上也很有优势,和技术官一谈,结果是game over。要知道,在其他公司的上机和笔试中,我都能在应聘者中取得高分。
再说我去面试别人的经验吧。
当时,我的任务是出题,给分。若你觉得题很难,那么,请千万不要放弃,显然,你的对手也觉得难。只要坚持,我会认为这人有耐心很毅力,在以后的工作中也是好的合作者。题一定要做完,表现出认真的态度,若有疑问或卡壳,还可以寻求面试官的帮助,这些不会减分,相反,会增加你和他们的接触机会,面试官会评估你的沟通能力。
有一次,有1个人来面试,题没有完全ok,但很规范,态度很认真,他把他知道的都做上去了,我给了他技术类的高分。后来,顺利进入公司,再后来进步很快,成了重要角色。
若文章对你有帮助的话,请在此讨论。
祝你成功
1.链表和数组的区别在哪里?
2.编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?
3.编写实现数组排序的一种算法。说明为什么你会选择用这样的方法?
4.请编写能直接实现strstr()函数功能的代码。
5.编写反转字符串的程序,要求优化速度、优化空间。
6.在链表里如何发现循环链接?
7.给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。
8.写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)
9.给出一个函数来输出一个字符串的所有排列。
10.请编写实现malloc()内存分配函数功能一样的代码。
11.给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
12.怎样编写一个程序,把一个有序整数数组放到二叉树中?
13.怎样从顶部开始逐层打印二叉树结点数据?请编程。
14.怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?
另外:
一、单项选择题:(共12题,每题2分,共24分)
1. 下面哪一个不是C++的标准数据类型? ( )
A. int B. char
C. bool D. real
2. break关键字在哪一种语法结构中不能使用? ( )
A. for语句 B. switch语句
C. if语句 D. while语句
3. 类的继承方式有几种? ( )
A. 两种 B. 三种
C. 四种 D. 六种
4. extern关键字的作用是什么? ( )
A. 声明外部链接 B. 声明外部头文件引用
C. 声明使用扩展C++语句 D. 声明外部成员函数、成员数据。
5. C库函数strstr的功能是? ( )
A. 查找子串 B. 计算字符串长度
C. 字符串比较 D. 连结字符串
6. stl::deque是一种什么数据类型? ( )
A. 动态数组 B. 链表
C. 堆栈 D. 树
7. STL库里含有下面的哪一种泛型算法? ( )
A. KMP查找 B. 折半查找
C. 冒泡排序 D. 快速排序
8. 现在最快且最通用的排序算法是什么? ( )
A. 快速排序 B. 冒泡排序
C. 选择排序 D. 外部排序
9. Win32下的线程的哪一种优先级最高? ( )
A. THREAD_PRIORITY_HIGHEST B. THREAD_PRIORITY_IDLE
C. THREAD_PRIORITY_TIME_CRITICAL D. THREAD_PRIORITY_ABOVE_NORMAL
10. 下面四个选项中,哪一个不是WinMain函数的参数? ( )
A. HINSTANCE B. INT
C. LPSTR D. WPARAM
11. VC++的编译器中,运算符new底层的实现是什么? ( )
A. VirtualAlloc() B. HeapAlloc()
C. GlobalAlloc() D. AllocateUserPhysicalPages()
12. 下面哪一本C++参考书最厚? ( )
A. 《Think in C++》 B. 《深入浅出MFC》
C. 《C++ Primer》 D. 《Effective C++》
二、不定项选择题:(共6题,每题3分,共18分,多选、错选、漏选均不给分)
1. vector::iterator重载了下面哪些运算符? ( )
A. ++ B. >>
C. *(前置) D. ==
2. CreateFile( )的功能有哪几个? ( )
A. 打开文件 B. 创建新文件
C. 文件改名 D. 删除文件
3. 下面哪些是句柄(HANDLE)? ( )
A. HINSTANCE B. HWND
C. HDC D. HFONT
4. 下面哪些不是OpenGL标准几何元素的绘制模式? ( )
A. GL_FOG B. GL_LINE_STRIP
C. GL_POINTS D. GL_TRIANGLE_FAN
5. 下面哪些运算符不能被重载? ( )
A. 做用域运算符“::” B. 对象成员运算符“.”
C. 指针成员运算符“->” D. 三目运算符“? :”
6. 下面哪些人曾参与了世界上第一个C++编译器的开发? ( )
A. Bill Gates B. Stanley Lippman
C. Anderson Hejlsberg D. Bjarne Stroustrup
三、填空题:(共8题,每题3分,共24分)
1. 一个大小为320 X 192,颜色为灰度索引色的设备相关位图有______字节。如果此位图颜色为24位真彩色,则它的大小有______字节。
2. Windows API的中文意义是________________。
3. 计算反正弦的库函数是______;计算浮点数绝对值的库函数是______;计算浮点数n次方的库函数是______;将浮点数转化为字符串的库函数是______。
4. 如果i等于5,那么( ++i ) - -的返回值是_____。
5. API LoadBitmap()的功能是从______中读取位图数据到内存。
6. new和_____对应,malloc和_____对应,他们之间_____交叉混用。calloc的功能是___________,realloc的功能是____________。
7. SendMessage和PostMessage都会向窗体发送一个消息,但SendMessage_________而PostMessage____________。
8. 输出指定圆心、半径、边数的圆上的点:
const int nCount = 12;
const double dOrgX = 5.0,
dOrgY = 3.0;
const double dRadius = 2.0;
for( int i = 0; i < nCount; i++ )
{
double dAngle = M_PI * 2.0 / (double)nCount * i;
cout << "第" << i << "点:X = " << ________; cout << ", Y = " << __________ << endl;
}
三、判断题:(共12题,每题2分,共24分)
1. 一个类必须要有一个不带参数的构造函数。 □
2. 你不能写一个虚的构造函数。 □
3. 类里面所有的函数都是纯虚函数时才是纯虚类。 □
4. const成员函数对于任何本类的数据成员都不能进行写操作。 □
5. 函数中带默认值的参数必须位于不带默认值的参数之后。 □
6. char *p = "Test"; p[0] = 'R'; □
7. cout << "Test"; □
8. stl::list不支持随机访问叠代器。 □
9. stl::vector的效率比stl::list高。 □
10. VC和VC++是一回事,而VC++是一种比C++更难一些的语言。 □
11. 理论上,new和malloc造成的内存泄露都会由操作系统回收。 □
12. 在C++中struct和class的差别很大,所以从语法上不能混用。 □
四、简述题(共3题,每题5分,共15分)
1. 请简述PeekMessage和GetMessage的区别。
2. 请列出你所知道的在Windows SDK平台上,实现计时功能的方法。
3. 请简述你所知道的const的各种用法。
五、编程题:(共3题,第1小题7分,第2小题14分,第3小题24分)
1. 深度遍历二叉树。
struct Node
{
Node *Parent;
Node *Left, *Right;
};
void Through(Node *Root)
{
}
2. 二分法查找。
int DicFind( int *Array, int Count, int Value )
{
}
3. 写出字符串类String的默认构造函数、析构函数和重载赋值运算符。
已知类String的原型为:
class String
{
public:
String( const char *pStr = NULL ); // 默认构造函数
~String( void ); // 析构函数
String &operate = ( const String &Source ); // 重载赋值运算符
private:
char *m_pData; // 指向字符串的指针
};
1。 一人岁数的3次方是四位数,四次方是六位数,并知道此人岁数的3次方和4次方用遍了0~9十个数字。编写一程序求此人的岁数。
2。对1,2,3, 4, 5 这五个数任意取出两个数,列出他们的所有组合。
public static int getAge() {
int age;
int third;
int fourth;
for (int i = 11; true; i++) {
if (i < 200) {
third = (int) Math.pow(i, 3);
fourth = (int) Math.pow(i, 4);
if (getLength(third, fourth) == 10) {
age = i;
break;
}
}
}
return age;
}
public static int getLength(int args1, int args2) {
String str1 = String.valueOf(args1);
String str2 = String.valueOf(args2);
String str = str1 + str2;
if (str.length() != 10) {
return -1;
}
int[] intarray = new int[10];
for (int i = 0; i < str.length(); i++) {
intarray[i] = Integer.parseInt(str.substring(i,i+1));
}
Arrays.sort(intarray);
if(intarray[0]!=0 && intarray[9]!=9)
return -1;
return 10;
}
第二题还更简单了
for(int i=1; i<6; i++){
for(int j=1; j<6; j++){
if(i==j){
System.out.println(j+""+j);
}else{
System.out.println(i+""+j);
System.out.println(j+""+i);
}
}
}
public class A {
// http://community.csdn.net/Expert/topic/4667/4667929.xml?temp=.57922
public static void main(String[] args) {
String t;
String[] s = new String[5];
int j = s.length;
for(int i=0; i<j; i++) {
s[i] = new Integer(i+1).toString();
}
for(int i=0; i<j; i++) {
t = s[i];
for(int a=0; a<j; a++) {
t += s[i];
System.out.println(t);
}
System.out.println();
}
}
}
第二题还更简单了
for(int i=1; i<6; i++){
for(int j=1; j<6; j++){
if(i==j){
System.out.println(j+""+j);
}else{
System.out.println(i+""+j);
System.out.println(j+""+i);
}
}
}
============================================================
楼上的没看清题目,它是让你对1,2,3, 4, 5 这五个数任意取出两个数,列出他们的所有组合,所以重复的数字不应该算在里面。
第二题应该改为:
for(int i=1; i<6; i++){
for(int j=1; j<6; j++){
if(i==j){
break;
}else{
System.out.println(i+""+j);
System.out.println(j+""+i);
}
}
}
public class B {
public static void main(String[] args) {
for (int i = 1; i < 6; i++) {
int t = i;
for(int a = 0; a<5; a++) {
int c = a+1;
if(c == t) {
continue;
}else {
System.out.println(t*10+c);
}
}
System.out.println();
}
}
}
第二题 public class Test { public static void main(String[] args) { int[][] a=new int[5][]; for(int i=0;i<a.length;i++) { a[i]=new int[i+1]; } for(int i=1;i<=a.length;i++) { for(int j=i+1;j<=a.length;j++) { System.out.print(i); System.out.print(j+" "); } System.out.print(" "); } for(int i=a.length;i>0;i--) { for(int j=i-1;j>0;j--) { System.out.print(i); System.out.print(j+" "); } System.out.print(" "); } } } |
public class Test { public static int getDigits(String str) { int[] intarr = new int[10]; for (int i = 0; i < 10; i++) intarr[i] = 0; for (int i = 0; i < str.length(); i++) { int j = Integer.parseInt(str.substring(i, i + 1)); intarr[j] = 1; } int num = 0; for (int i = 0; i < 10; i++) num = num + intarr[i]; return num; } private static int getAge() { int age; int third; int fourth; for (age = 1; age < 100; age++) { third = (int) Math.pow(age, 3); fourth = (int) Math.pow(age, 4); if (third < 1000 || third >= 10000) continue; if (fourth < 100000 || fourth >= 1000000) continue; String str = String.valueOf(third) + String.valueOf(fourth); if (getDigits(str) == 10) return age; } return 0; } } |
第二道题
class Combine
{
public static void main(String[] args)
{
for(int i=1; i<5; i++)
{
for(int j=i+1; j<6; j++)
{
System.out.println(i+""+j);
System.out.println(j+""+i);
}
}
}
public class Age
{
public static void main(String [] args)
{
String str1 = null;
String str2 = null;
String str3 = null;
String str4 = "0123456789";
for(int i=10;i<50;i++)
{
str1 = Integer.toString(i*i*i);
str2 = Integer.toString(i*i*i*i);
str3 = str1+str2;
if((str1.length() == 4) && (str2.length() ==6))
{
boolean flag = true;
for(int j=0;j<10;j++)
if(str3.indexOf(str4.charAt(j))==-1)
flag = false;
if(flag){
System.out.println(">>>"+i);
System.out.println(str3);
}
}
}
}
}
本篇文章包含了在用Struts开发web应用时经常碰到的一些异常和错误,根据异常或错误信息本身,经常可以找到潜在的错误发生原因。
下面列出了一些Struts的常见错误和异常,并给出了一些可能发生此类错误或异常的原因。有的后面有相关连接,你可以通过它找到更多的信息。
Cannot retrieve mapping for action | |
异常 | javax.servlet.jsp.JspException: Cannot retrieve mapping for action /Login (/Login是你的action名字) |
可能原因 | action没有再 |
Cannot retrieve definition for form bean null | |
异常 | org.apache.jasper.JasperException: Cannot retrieve definition for form bean null |
可能原因 | 这个异常是因为Struts根据struts-config.xml中的mapping没有找到action期望的form bean。大部分的情况可能是因为在form-bean中设置的name属性和action中设置的name属性不匹配所致。换句话说,action和form都应该各自有一个name属性,并且要精确匹配,包括大小写。这个错误当没有name属性和action关联时也会发生,如果没有在action中指定name属性,那么就没有name属性和action相关联。当然当action制作某些控制时,譬如根据参数值跳转到相应的jsp页面,而不是处理表单数据,这是就不用name属性,这也是action的使用方法之一。 |
No action instance for path /xxxx could be created | |
异常 | No action instance for path /xxxx could be created |
可能原因 | 特别提示:因为有很多中情况会导致这个错误的发生,所以推荐大家调高你的web服务器的日志/调试级别,这样可以从更多的信息中看到潜在的、在试图创建action类时发生的错误,这个action类你已经在struts-config.xml中设置了关联(即添加了<action>标签)。 |
在
| |
在
| |
你的classpath的问题。例如web server没有发现你的资源文件,资源文件必须在 | |
Problem in | |
Problem with | |
[推荐]计算机行业日语常用语
作者 :光棍
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
第1回
セットに関すること
例えば:
Ⅰ:中国語で 将B設給A
日本語で言えば ①AにBをセットする それとも ②BをAに入れる
Ⅱ:中国語で 将B和A交換
日本語で言えば AとBを入れ換える
Ⅲ:中国語で 求A和B的差
日本語で言えば AとBの差を取る
Ⅳ:中国語で 求A減B
日本語で言え AからBを引く
Ⅴ:中国語で A加B後再放入A(或B)
日本語で言えば AにBを加えて、A(或B)にいれる
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
第2回
昨日は第1回でした、今日はその第2回で、よろしければ読んでください!
皆さん,Q&A、メール等のような文書
例えば:有るものに対して100%自分がAと思っている,その場合
中国語で言えば: 応該是+A(名詞)
日本語で言えば:
(名詞)A+のではないかと思います。 丁寧
名詞A+でしょうか やや丁寧
名詞A+です あまり丁寧ではない
例:
中国語で: 他的理解不対、応該是××
日本語で: 彼が理解したのは間違っていると思い、何か××のではない かと思います。
彼が理解したのは間違っていると思い、正しいことは××でしょうか。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
第3回
今日はその第3回で、よろしければ読んでください!
置き換える’の使用方法
①A和B 全部表示東西時
日本語で言えば:AをBに置き換える
中国語で言えば:将A从該位置取走、用B替換到該位置上
②A表示東西、B表示場所時
日本語で言えば:AをBに置き換える
中国語で言えば:将A移動到B中
③A和B 全部表示東西
日本語で言えば: AとBを置き換える
中国語で言えば: A与B互換 【A⇔B】
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
第4回
さて、先週第三回までやってきましたが、今日はその第四回で、よろしければ読んでください!
①我方認為応該…
こちら側は××と思っております。
◆例:こちら側は以上の通り処理を行なうのが正しいと思っております。
②○○中是「××」記述的、但我方認為応該…
○○には「××」と書いてありますが、こちら側は…と思っております。
◆ 例:詳細設計書には「A=0」と書いてありますが、こちら側はA≠0と思っております。
③如果用○○的方法来処理、将会産生××的結果。
もし○○のように処理すれば、××になります。
◆ 例:もしこのように処理すれば、仕様書と合わない結果になる(恐れがある)。
④因為○○的原因、請××。
○○ため××して下さい。
◆ 例:MAIN PGMでAを使用するため、Aを定義してください。
⑤○○中是「××」記述的、但実際上△△不存在。
○○には××と書いてありますが、実は△△が存在していない。
◆ 例:詳細設計書には三つのSELECT条件が書いてありますが、実は種別という項目が存在していません。
⑥根拠○○和○○ 从◇◇中取得●●。
○○と○○より、◇◇から●●取得する。
◆例:商品コードと銘柄コードより、銘柄マスタから銘柄名を取得する。
(待续) 转自WWW.JSOB.COM
-------------------------------------------------------------------
http://www.jsob.com
对日软件外包IT人的乐园!
中国金马对日软件外包项目交易网(Japanese Software Outsourcing Business Online Market)
是中国第一家对日软件项目外包交易网,无偿提供对日软件外包的合作机遇,对日外包论坛的信息交流平台
JSOB 站点的BBS的内容主要是日语学习,日本项目经验指教,日本软件项目信息交流,希望能得到在日华人朋友的帮助和指教,这里还却非常缺斑竹,有兴趣的可以直接在论坛事务中发帖申请,条件就一个,日语懂一点,对中日软件外包话题比较有兴趣就可以了,多谢指教。JSOB的ADMIN的联系方法是 jsob@hotmail.com 再次感谢!
怎样只用4行代码编写出一个从字符串到长整形的转换函数?
我的方法,不过好象比4行多 *_#!~
long atol(char *str)
{
char c = *str;
if( !isdigit(c) ) str++;
for(long value = 0; *str != ''; value = value * 10 + (*str -'0'),str++);
return c == '-' ? -value : value ;
}
void stol(const char * des, long& num)
{
for (int base = 1, i = 0; des[i] != ''; base = 10, ++i)
{
num *= base;
num += (int)(des[i] - '0');
}
}
num 要初始化为0
void stol(const char * des, long& num) { for (int i=num=0; des[i] != ''; i++) { num *= 10; num += (int)(des[i] - '0'); } } |
void stol(char *str, long &num)
{
while(*str != '')
{
num = num * 10 + (*str - '0');
str++;
}
}
void stol(const char * des, long& num)
{
char p = des[0];
for (int b = 1, pos = 1, base = 1; des[pos] != ''; b = 10, ++pos, base *= 10)
{
(num *= b) += (int)(des[pos] - '0');
}
p == '-' ? (num *= -1) : (num = (int)(des[0] - '0') * base + num);
}
改了一下
真的是微软的笔试题么?
我只用了一行。
#include <iostream>
using namespace std;
long str2long(char* p,long xxx=0L)
{
return *p==''?xxx:str2long(p,xxx*10+(*p+++0-'0'));
}
int main()
{
char *str="123456789",*p=str;
cout<<str2long(p);
getchar();
return 0;
}
用STL,四行
#include <sstream>
#include <iostream>
#include <string>
using namespace std;
long ToLong(string& s)
{
long l;
istringstream iss(s);
iss>>l;
return l;
}
int main(int argc, _TCHAR* argv[])
{
string s = "-12356";
cout<<ToLong(s);
return 0;
}
谢谢刚才上面的帖子提醒负数的问题,我更正了,还是只用一行:
#include <iostream>
using namespace std;
long str2long(char* p,long xxx=0L,bool IsPositive=true)
{
return *p==''?(IsPositive?xxx:xxx*(-1)):(*p=='-'?str2long(++p,0L,false):str2long(p,xxx*10+*p+++0-'0',IsPositive));
}
int main()
{
char *str="-123456789",*p=str;
cout<<str2long(p);
getchar();
return 0;
}
COMPOSITE(组合)
适用性:
1.想表示对象的部分整体层次结构
2.希望用户忽略组合对象和单个对象的不同。
思考:
组合模式的所有组件应该具备同一个接口。一直感觉,这种组合是一种递归组合的概念。所有的组件,按照树的结构组织起来,树的叶结点行为可能和中间结点的行为并不一致,这看上去违背了Liskov原则,似乎是一个容易引起迷惑的地方。
树的叶结点可能并不能增加子结点,删除子结点的行为也可能失败。而一个中间结点则可能不具备一些叶结点才具备的具体功能。用户需要在这两者之间平衡。
我对COMPOSITE的理解可以概括成组件的递归组合。这个概括过于简短,我不确定是否确实抓住了这个模式的本质,还是我过于缺乏理解。如果我的理解没有问题的话,那么,GUI系统的嵌套窗口对象可算是典型的COMPOSITE模式了。
DECORATOR(装饰)
适用性:
1.在不影响其他同类对象的情况下,给某个对象透明的增加一些额外的功能。
思考:
考虑重载某个虚方法,并且,在这个方法中调用父类的重载方法。派生类的方法对父类的方法进行了“修饰”。这种方法依赖于类的派生。
考虑一个接口A,和实现了该接口的一系列的类,以及实例。现在,有一个装饰类,也实现了接口A,并且,持有一个到其他实例的指针:
Interface A;
class Decorator : public A{
A * instance;
//实现接口A,在相关方法中调用instance的同名方法。
};
我们看到,只要在Decorator实现的A接口的方法中,在调用instance的同名方法前后增加一些功能,就可以起到改变instance行为的效果。
和Strategy的区别在于:Strategy是一种有扰的设计,要求设计的类本身具备策略调整能力。而Decorator并不要求设计类时考虑支持Decorator。
FLYWEIGHT(享元)
意图:
运用共享技术有效地支持大量细粒度的对象。
适用性:
1.一个程序应用了大量的对象,造成很大的存储开销。
2.对象的大多数状态可变为外部状态。
3.如果删除对象的外部状态,那么可以用相对较少的公象对象取代很多组对象。
4.应用程序不依赖于对象标识
思考:
上述的适用性和别的模式中介绍的不太一样。基本上,适合使用FlyWeight模式的场景需要同时满足上述四个条件,而别的模式大多只要满足适用性的一两条,就可能适合采用该模式。
从第一个适用性条件可以看出,这基本上属于开销优化的范围。因此,除非事先有足够的领域知识能够加以预见,否则,是不必在早期设计中考虑使用该模式的。要想成功运用该模式,必须的一个条件是:除了那些外部状态,余下的状态将是需要共享的。这也就意味着一般而言,FLYWEIGHT是只读的--变化的部分仍然需要加以分离出来--从这个意义上来说,“享元”的中文翻译更好地表达了这层意思。一个最好的情况是,共享的这些对象没有外部状态,且只作为系统共享的只读对象。关于第四条,可以认为是一种补充说明,对象标识本身其实也是可以作为变化的部分加以分离的。
上面的讨论强调了“只读”,事实上,本模式并不要求FLYWEIGHT是只读的。但是,必须看到修改FLYWEIGHT的后果:这种影响是全局的,接近于全局变量的变种。某些时候也许我们确实需要这种全局的作用效果,但是滥用这一能力可能导致理解上的困难和程序行为的判断困难。FlyWeight的主要目的不在于此。
通常,享元也并不能当作一个纯粹的只读对象,那么,将变化的部分加以分离可能是必须的工作,也有必要对分离的效果加以评估再决定是否和如何运用FlyWeight模式。
PROXY(代理)
意图:
为其他对象提供一种代理以控制对这个对象的访问。
适用性:
书中列出了几种运用proxy的场景作为适用性的说明:
1.远程代理,为一个不在同一地址空间的对象提供局部代理。
2.虚代理,根据需要创建很大的对象。
3.保护代理控制对原始对象的访问。
4.智能引用,取代简单指针,在访问对象时提供附加操作。例如:智能指针;第一次访问持久对象时,将它装入内存;在访问一个实际对象前,检查其是否加锁。
思考:
相对于Decorator而言,通常Proxy是更重量级的。Proxy和Bridge模式也有很多相似之处:透过一个接口去访问真正实现功能的对象。 Decorator和Proxy的区别在于,Decorator目标仅仅在于增加某些方法的职责,并不打算全面掌控目标对象,另外,Decorator也并不确定自己将要修饰的可能会是什么对象。Proxy模式则相反,Proxy需要全面了解甚至需要构建被代理对象,而Proxy和被代理对象之间的关系也是静态决定的。有一点是相同的:一个实际对象既可以有多个Decorator,也可以有多个Proxy。
Proxy和Bridge虽然有相似性,但是Bridge的目的仅仅是为了维持接口和实现的各自演化,Bridge模式并不打算用来支持创建非常复杂的实现。Bridge模式的接口和实现在语意上是完全一致的。而Proxy模式,虽然一般而言Proxy和被代理对象之间具备一致的接口,但这完全是不必要的。当弱化Proxy的额外处理能力,强化Decorator的职责范围,这三个模式之间的实现区别将会不那么显著,我们需要警惕的是,这三者之间的意图则是差别非常巨大的。
1、管理者要是坐下,部下就躺下了。
2、管理就是行动。
3、管理就是树立榜样。
4、高层管理不等于高高在上。
5、管理者必须进行问题管理,而不是危机管理。
6、干部怕的就是不知道自己怕什么。
7、没思路的领导不想互动,没控制力的领导不敢互动。
8、干部怎样对待问题?要100%地落实责任,即“见数也见人”的原则。每个1%的问题都可以转化为100%的责任,100%的责任人。
9、干部怎样对员工?创造一个充满活力的氛围。
10、干部怎样对市场?创与闯。既要创新、创造;又要有闯劲、冲劲。
11、干部怎样对待管理?悟性和韧性。
12、干部的目标:做超级领导,即你的领导水平达到了能够让下属在没有领导的时候仍能够正常工作。形成有活力的员工,有合力的组织。
13、干部是事业成败的关键。
14、如果你或你的部门没有了上升的空间,也将失去生存空间。
15、终端的问题就是领导的问题。
16、看不出问题是最大的问题。
17、重复出现的问题是作风上的问题。
18、部下素质低不是你的责任,但是不能提高部下的素质是你的责任。
19、观念不变原地转,观念一变天地宽。
20、管事先管人,管人带作风。
21、渐进就是守旧。所以经营理念创新,就要反渐进,必须一步到位。
22、不只做一颗螺丝钉,要经营一部机器。
23、先画靶子再打枪。
24、特殊论就是给问题放行。
25、“立刻办”是奔着有预算的目标立刻办;“想想看”是没有预算的闭门造车。
26、开发的是市场而不是产品。
27、市场目标的确定不是以个人能力为限,而是以用户满意度为准。
28、对市场目标的确定就是以在市场上有竞争力增值为标准。
29、带动全球经济增长的火车头减速并不意味着所有的车厢都减速。
30、零增长不等于零需求。
31、有效供给才能创造出市场。
32、海尔人只有创业没有守业。
33、海尔国际化战略能否成功,主要是靠每一个海尔人的国际化,有了每一个人的国际化才能保证海尔集团的国际化。
34、企业竞争力的实现取决于创新的细胞——SBU。
35、企业核心竞争力就是获取用户资源的能力。
36、一个企业的竞争力是看一个企业的员工是增值的资产还是负债。
37、要以秒为计算单位。
38、客户的要求不等于客户的需求。
39、造势产品输入的是用户的需求,输出的是用户的满意。
40、企业一旦站立到创新的浪尖上,维持的办法只有一个,就是要持续创新。
41、要持续造势,就要把企业做成一条流动的河。源头是创新的SBU,河的终点是用户的满意度,即对企业忠诚的用户。
42、把每位员工经营成创新的SBU并不断经营出高素质的人才的决定性因素就是管理者能否经营自我。
43、成为SBU的四个要素是:市场目标、市场定单、市场效果、市场报酬。
44、SBU具体的体现就是速度和创新。
45、经营企业就是要经营人,经营人首先要尊重人。
46、止谤莫如自修。战胜非议的唯一途径就是战胜自我。
47、挑战目标首先要挑战自我。
48、工作要简化,不要简单化。
49、求人不如求己。
50、“想干与不想干”是有没有责任感问题,是“德”的问题;“会干与不会干”是“才”的问题,但是不会干是被动的,是按照别人的要求去干;“能干与不能干”是创新的问题,即能不能不断提高自己的目标。
51、没有市场定单的管理者就是不要管理的管理者;没有市场定单的员工就是不干工作的员工,责任不在员工身上,而在于管理者;没有市场定单的工作就是无效工作。
52、决胜在终端。
53、流程再造就是先要再造人。
54、企业内部管理革命是为了创造企业外部的市场。
55、不是因为有些事情难以做到,我们才失去了斗志,而是因为我们失去了斗志,那些事情才难以做到。
56、我们所有的质量问题,都是人的问题,设备不好是人不好;零部件不合格是人不合格;我们所有发展不起来的问题都是思路问题,不是缺人是缺思路;不是缺件是缺思路。
57、企业发展的空间无限大,企业与用户的距离无限小。
58、有价值的定单是企业发展的永恒的主题,企业要发展必须有定单而且是有价值的定单。
59、质量无止境,企业无边界,名牌无国界。
60、“一站到位”的服务,“一票到底”的流程。
61、员工齐心,管理用心,对用户真心。
62、企业生命之树的土壤是用户。
63、企业做到极致,满足用户需求,无有他奇,只是本然。
64、要在国际市场竞争中取胜,第一是质量,第二是质量,第三还是质量。
65、质量不打折、服务不打折、信誉不打折。
66、质量一次就做对。
67、有缺陷的产品就是废品。
68、在一个管理好的企业内部没有激动人心的事情发生。
69、管理的关键不在于知而在于行。
70、没有定单就没有目标,没有目标就没有工资。
71、盘活资产首先要盘活人。
72、在别人否定自己之前先自我否定。
73、只有自己才能打倒自己。
74、突破自我,突破思维定势,突破昨天。
75、智力比知识重要,素质比智力重要,觉悟比素质更重要。
76、创新的目标是创造有价值的定单;创新的本质是创造性的破坏,破坏所有阻碍创造有价值定单的枷锁;创新的途径是创造性的模仿和借鉴,即借力。
77、监控就是爱护,委任就是信任。
78、观念创新就是目标创新,目标创新就是提出别人认为不可能达到的目标,并用创新的办法实现它。
79、每个中高级管理人员只有自己先找到市场才能找到市场中竞争的方向。
80、不能用职能管理的手推职能管理的山。
81、永远战战兢兢,永远如履薄冰。
82、职能签字是事先没有市场目标的签字,事先无人负责的签字。用户的签字才是有效的签字。
83、用户的钞票才是企业的选票,用户的口碑才是企业的金杯。
84、只有真正实现了问题清零和买断损失,才能卖出有价值的定单。
85、要效果,不要借口。
86、没有思路就没有出路。
87、举一纲而万目张,失一机而万事毁。
88、管理无小事。
89、物流以时间消灭空间,商流以空间消灭时间。
90、什么是不简单?能够把简单的事千百遍都做对,就是不简单;什么不容易?大家公认的非常容易的事情认真地做好,就是不容易。
91、图难于其易,为大于其细。
92、把不可能变成可能。
93、昨天的成功经验与辉煌可能是明天成功的阻碍。
94、要做到实事求是,有两点很重要:其一是能不能实事求是,即思维方式的改变问题;其二是敢不敢实事求是,即思想境界的提高问题。
95、解决无效管理,首先要在思想观念上树立以几何级数去提高工作效果的信心;其次,要有创新是无止境的观念,创新的空间存在于每个地方、每个人、每件事上。
96、一切结论产生在调查研究之后;在调查研究中,如果找不出原因和解决办法就不能放过。
97、抓管理肯定要数,但如果就数抓数,最后连数也得不到,或者只抓到一个假数。抓好提高人的素质工作,数自然会产生;不抓人的工作,数就会越来越差,不能见数不见人。
98、以人为本的管理就是管理人员的创新精神。
99、真正的人才是在寻找实现自我的机遇。
100、市场是每个人的上级。
将一个单链表反序,只有一个链表头节点head,还有两个指向节点元素类型的指针p和q,不许申请新的节点及指针变量什么的.用c或c++实现算法.
int MyList::Reverse()
{
ListNode *ptr = _ptrFront;
ListNode *ptrpre = 0;
_ptrFront = _ptrEnd;
_ptrEnd = ptr;
while(ptr!=_ptrFront)
{
ListNode *temp = ptr->Next();
ptr->Next(ptrpre);
ptrpre = ptr;
ptr = temp;
}
_ptrFront->Next(ptrpre);
return 0;
}
void InvertLinkedList( LinkList &L )
{
LinkList p,s;
// 逆置头指针L所指链表
p = L; L = NULL; // 设逆置后的链表的初态为空表
while ( p ) { // p 为待逆置链表的头指针
s = p; p = p->next; // 从 p 所指链表中删除第一个结点(s 结点)
s->next = L; L = s; // 将 s 结点插入到逆置表的表头
}
}
p=head->next;q=p->next;head=q->next;p->next=NULL;
do
{
q->next=p;
p=q;
q=head;
head=head->next;
}while(head);
令P指向节点1,Q指向节点2,Head指向节点3,由于P转换后为尾节点,所以P->Next指向NULL
循环移动,直到Head为NULL
哦,只有一个head,改一下:
int MyList::Reverse()
{
ListNode *ptr = _ptrFront;
ListNode *ptrpre = 0;
//_ptrFront = _ptrEnd;
//_ptrEnd = ptr;
while(ptr!=NULL)
{
ListNode *temp = ptr->Next();
ptr->Next(ptrpre);
ptrpre = ptr;
ptr = temp;
}
//_ptrFront->Next(ptrpre);
_ptrFront = ptrpre;
return 0;
}
int MyList::Reverse()
{
ListNode *ptr = _ptrFront;
ListNode *ptrpre = 0;
//_ptrFront = _ptrEnd;
//_ptrEnd = ptr;
while(ptr!=NULL)
{
_ptrFront = ptr->Next();
ptr->Next(ptrpre);
ptrpre = ptr;
ptr = _ptrFront;
}
_ptrFront = ptrpre;
return 0;
}
#include <iostream.h>
struct A
{
int m_value;
A *next;
};
A *Reverse(A *head)
{
A *p, *q;
if (head->next == NULL || head->next->next == NULL)
return head;
p = head->next;
q = p->next;
p->next = head;
head->next = NULL;
while (q != NULL)
{
head = p;
p = q;
q = q->next;
p->next = head;
}
return p;
}
int main(){
A array[5];
for(int i=0; i<5; i++)
{
array[i].m_value = i;
if (i == 4)
array[i].next = NULL;
else
array[i].next = &array[i+1];
}
A *head = array;
head = Reverse(head);
while (head != NULL)
{
cout<<head->m_value<<endl;
head = head->next;
}
return 0;
}
yiyo2025(EricKong)
你写的这个函数有个很明显的BUG哦
if (head->next == NULL || head->next->next == NULL)
return head;
???
这样当链表只有两个接结点的时候,第三个结点为空,直接返回头指针,根本没改变两个结点的顺序!
我帮你改了一下,呵呵
A *Reverse(A *head)
{
A *p1,*p2;
p1=head;
if(head->next==NULL)
return head;
p2=p1->next;
p1->next=NULL;
while(p2->next!=NULL)
{
head=p2->next;
p2->next=p1;
p1=p2;
p2=head;
}
p2->next=p1;
return p2;
在windows下,写出运行结果,说明为什么?
1,
int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("line11%d,%d",*ptr,*(++ptr));
printf("line22%d,%d",*ptr,*(ptr++));
2,
int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)=*(ptr++)+123;
printf("%d,%d",*ptr,*(++ptr));
同理,这一段输出: int arr[]={6,7,8,9,10}; int *ptr=arr; *(ptr++)=*(ptr++)+123; printf("%d,%d,%d",*ptr++,*(++ptr),*(++ptr)); 为10,10,9 |
即使是相同编译器,利用debug和release模式编译后, 老实说,很不同意。 debug 和 release 发生在源码区别上,至少 vc 如此, 编译器都是一样编译的,怎么可能不同? 除非发生以下情况 #ifdef _DEBUG operator ++(a, 0){ ... } #else operator ++(a, 0){ ... } #endif |
1,在pritf语句中,表达式从右向左计算。
2,++ptr是在printf执行过程之中计算的。
3,ptr++是在printf执行完成以后计算的。
4,以下四个表达式执行之后结果一样的:
*(ptr++)=*(ptr++)+123;
*(++ptr)=*(++ptr)+123;
*(++ptr)=*(ptr++)+123;
*(ptr++)=*(++ptr)+123;
5,下面这个表达式和上面的四个执行之后结果是不一样的,:
*(ptr++)+=123; //为什么不一样?或者用堆栈的前序表达式和后序表达式能够说清楚吧!
*(ptr++)+=123; 等价代码为 *ptr = *ptr + 123; ptr++; 而*(ptr++)=*(ptr++)+123; 等价为 *ptr = *ptr + 123; ptr++; ptr++; 再因为调用printf的时候是从右向左压栈,因此先计算后面的表达式。 所以会有以上结果 |
一、判断题(对的写T,错的写F并说明原因,每小题4分,共20分) 1、有数组定义int a[2][2]={{1},{2,3}};则a[0][1]的值为0。( ) 2、int (*ptr) (),则ptr是一维数组的名字。( ) 3、指针在任何情况下都可进行>,<,>=,<=,==运算。( ) 4、switch(c) 语句中c可以是int ,long,char ,float ,unsigned int 类型。( ) 5、#define print(x) printf("the no, "#x",is ") 二、填空题(共30分) 1、在windows下,写出运行结果,每空2分,共10分。 char str[ ]= "Hello"; char *p=str; int n=10; sizeof(str)=( ) sizeof(p)=( ) sizeof(n)=( ) void func(char str[100]) { } sizeof(str)=( ) 2、void setmemory(char **p, int num) { *p=(char *) malloc(num);} void test(void) { char *str=NULL; getmemory(&str,100); strcpy(str,"hello"); printf(str); } 运行test函数有什么结果?( )10分 3、设int arr[]={6,7,8,9,10}; int *ptr=arr; *(ptr++)+=123; printf("%d,%d",*ptr,*(++ptr)); ( ) 10分 二、编程题(第一小题20,第二小题30分) 1、 不使用库函数,编写函数int strcmp(char *source, char *dest) 相等返回0,不等返回-1; 2、 写一函数int fun(char *p)判断一字符串是否为回文,是返回1,不是返回0,出错返回-1
问题
1如果信息采集管理系统(ICM)崩溃了怎么办?
2你如何加速打补丁的过程?
3打补丁的过程中出错了,你怎么办?
4请提供克隆过程和克隆之后采取的手工操作的大概步骤。
5介绍一下AutoConfig。AutoConfig是如何知道XML文件中的哪个树脂需要被放入哪一个文件的?
6你能告诉我,你对一个发生故障的自服务登录问题做哪些测试吗?你要检查哪个配置文件操作选项和文件?
7如果你不能看到并发管理日志和输出文件,是哪里出错了?
8你是如何更改并发管理日志和输出文件的位置的?
9如果用户正遇到性能方面的问题,你如何找到问题的原因?
10你如何更改应用程序的密码?
11请写出DBC文件的位置,并且解释它的重要性和应用程序如何知道DBC文件名?
答案
1所有其他的管理器都会继续工作。ICM只会处理队列控制请求,意思是开启和关闭其他并发的管理器。
2
2.1你可以合并多个补丁。
2.2你可以为一个非交互的补丁创建一个响应文件。
2.3你可以通过选项(nocompiledb, nomaintainmrc, nocompilejsp)来应用补丁,并且在应用了所有的补丁之后,一次运行它们。
3 查看失败工作的日志,找到并且纠正错误,用adctrl 工具重新开启工作。
IT工作市场是如此的紧张,每个可获得的职位都有一堆人在申请。Naveen Nahata为Oracle E-Business Suite的数据库管理员申请者提供了以下一些面试时的技术问题,它可以帮助申请者们快速脱颖而出。如果你的面试官有类似的问题问你,发个邮件给我,我将会把它添加在列表中。――编者按
问题
1如果信息采集管理系统(ICM)崩溃了怎么办?
2你如何加速打补丁的过程?
3打补丁的过程中出错了,你怎么办?
4请提供克隆过程和克隆之后采取的手工操作的大概步骤。
5介绍一下AutoConfig。AutoConfig是如何知道XML文件中的哪个树脂需要被放入哪一个文件的?
6你能告诉我,你对一个发生故障的自服务登录问题做哪些测试吗?你要检查哪个配置文件操作选项和文件?
7如果你不能看到并发管理日志和输出文件,是哪里出错了?
8你是如何更改并发管理日志和输出文件的位置的?
9如果用户正遇到性能方面的问题,你如何找到问题的原因?
10你如何更改应用程序的密码?
11请写出DBC文件的位置,并且解释它的重要性和应用程序如何知道DBC文件名?
答案
1所有其他的管理器都会继续工作。ICM只会处理队列控制请求,意思是开启和关闭其他并发的管理器。
2
2.1你可以合并多个补丁。
2.2你可以为一个非交互的补丁创建一个响应文件。
2.3你可以通过选项(nocompiledb, nomaintainmrc, nocompilejsp)来应用补丁,并且在应用了所有的补丁之后,一次运行它们。
3 查看失败工作的日志,找到并且纠正错误,用adctrl 工具重新开启工作。
4在源文件上(所有层)运行pre-clone,使用RMAN复制数据库(或者从热或者冷备份中重新存储数据库),拷贝文件系统,然后在目标文件(所有层)上运行post-clone 。
手工步骤(可能会更多):
4.1改变所有的非网站配置选项数值(快速克隆的话,只改变网站级别的配置文件选项)。
4.2 修改工作流和并发管理器表。
4.3更改打印机。
5 AutoConfig 使用了一个上下文文件来维护关键的配置文件。一个上下文文件就是一个XML文件,在$APPL_TOP/admin 目录下,进行集中式的存储。
当你运行AutoConfig 的时候,它读取XML文件,并且创建所有的AutoConfig 管理配置文件。
对于AutoConfig维护的每个配置文件,都存在一个临时文件来判断哪个数值是从哪个XML文件中得来的。
6
6.1检查DBC文件中的guest的用户名和密码,配置选项guest的用户名和密码、数据库。
6.2查看apache/jserv是否启动了。
6.3运行IsItWorking, FND_WEB.PING, aoljtest等。
7很有可能是FNDFS监听器停止了。看看FND_CONCURRENT_REQUESTS 表中的OUTFILE_NODE_NAME 和 LOGFILE_NODE_NAME 的数值。看看FND_NODES 表。看看tnsnames.ora 中的FNDFS_ entry 。
8日志问卷爱女的位置是由$APPLCSF/$APPLLOG 参数来决定的,输出文件的位置是由$APPLCSF/$APPLOUT 决定的。
9
9.1追踪这个会话(用等待)并且使用tkprof 来分析追踪文件。
9.2生成statspack 报告并进行分析。
9.3使用top/iostat/sar/vmstat 监控O/s 。
9.4通过ping这类基本的测试结果来判断网络的瓶颈。
10
10.1 使用FNDCPASS 来更改APPS密码。
10.2 手工修改wdbsvr.app/cgiCMD.dat 文件。
10.3 更改所有从其他环境指过来的数据库链接。
11
11.1位置:$FND_TOP/secure directory
11.2 重要性:在其他事务中指向数据库服务器。
11.3 应用程序通过使用“Applications Database Id.”来了解DBC文件的名字。
1。有几种方法计算运行一个方法所需的时间。
2。怎样调用一个类的私有方法。
1。1种方法是在函数调用前new一个Date,返回后再new一个Date,相减可得,当然也可以在函数内部的首句和末句new Date计算(感觉比较傻) 2。可以将此类的private function封装在一个public function中,再调用公用方法 PS:感觉自己想的太简单,还是听高手正解~~ |
感觉和楼上的一样呀.
计算方法运行的时间应该还可以写一个Thread类型的计时器,进入方法体的时候开启这个线程,结束的时候停止.这样就可以算出运行了多长时间了.
调用一个类的PRIVATE方法的话,继承了那个类也算可以调用它的PRIVATE方法吧.
1.在调用发前new两个Date,调用后new一个Date,分别为date1,date2,date3
则方法运行时间为:(date3-date2)-(date2-date1)
因为new一个Date也需要时间
2.如果非要在类外部直接通过对对象发消息传递是不可能的,他破坏了面向对象程序的封装性
1. 方法如下:
(1).通过在方法首先与结束处加上Date来相减; ---上面已提
(2).通过在首行与结束加对另外一个线程来实现; ---上面已提
(3).通过Proxy的方式,即调用时通过proxy来调用,在proxy中加入时间运行算;
(4). 如果你支持AspectJ的话,就更好办了。
2. 调用private方法,我想的到只有一种,就是"反射"。
怎么没人用System.currentTimeMillis(),而要new一个Date
a1: //initialize paramter long a = System.cur....(); //invoke this method a = System.curr...() - a; System.out.println(a); a2: cannot。 |
1)System.currentTimeMillis();最常用的测时间方法,也是优化程序的工具。
2)要想直接调用一个类的私有方法,最好的办法就是用内部类
1)System.currentTimeMillis();最常用的测时间方法,也是优化程序的工具。
2)要想直接调用一个类的私有方法,最好的办法就是用内部类
这两个问题可以找到共同点,那就是 “反射”,
第一个问题用 AOP,
第二个问题可以这样。
import java.lang.reflect.Method;
class A {
private int count;
private int getCount() {
return count;
}
private void setCount(int count) {
this.count = count;
}
public String toString() {
return "Count :" + count;
}
}
/**
* @author Daniel Young
*/
public class B {
public static void main(String[] args) {
A a = new A();
Class clazz = a.getClass();
try {
Method method = clazz.getDeclaredMethod("setCount",
new Class[] { int.class });
method.setAccessible(true);
method.invoke(a, new Object[] { new Integer(5) });
System.out.println("Created & initialized instance :" + a);
} catch (Exception e) {
e.printStackTrace();
}
}
}
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
求str1中abcd出现的次数
以下是我写的但是不对 输不出来,麻烦帮我看看那里错了?我用的是每4个一比较,逐个比较
#include "stdio.h"
#include "string.h"
main()
{
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
char *p,*t;
p=str1;
t=str2;
int k=0;
int i=0;
int j=0;
int len=strlen(str1);
for(i=0;i<=len-1;i++)
p++; t=str2;
for(j=0;j<4;j++)
if(*p==*t)
{
p++;
t++;
}
k++;
if(j==3)
printf("%d",k);
return k;
}
#include <stdio.h> #include <string.h> main() { int i; int j; int num; int len; char str1[] = "abcdnabcdmabcduabcdoabcdg"; char str2[] = "abcd"; char *p, *t; p = str1; t = str2; num = 0; len = strlen(str1); for(i = 0; i < len; i++) { if(*p == 'a') { for(j = 0; j < 4; j++) { if(p++ == t++) ; } t = str2; num++; } else { p++; } } printf("%dn", num); } |
int strstr_cnt(const char *string ,const char *substring)
{
int i,j,k,count=0;
for(i=0;string[i];i++)
for(j=i,k=0;string[j]==substring[k];j++,k++)
if(!substring[k+1])
count++;
return(count);
}
int substr_time(const char *strSrc, const char *strSub)
{
int appTime = 0;
cout << strlen(strSub)<<endl;
while(*strSrc != '')
{
if( *strSrc == strSub[0] )
{
if(!strncmp(strSrc,strSub,strlen(strSub)))
{
appTime++;
}
}
strSrc++;
}
return appTime;
}
#include <iostream>
using namespace std;
int main()
{
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
const int len = 4;
int num = 0;
int j = 0;
for(int i=0; str1[i] != ''; i++)
{
if(str1[i] == str2[j])
{
if(j == len - 1)
{
num ++;
j = 0;
}
else
{
j++;
}
}
else
j = 0;
}
cout<< num<< endl;
}
#include "stdio.h" void get_next(char *ch, int len ,int *next ) { int j,k; j=0; k=-1; next[0]=-1; while(j<len) { if(k==-1||ch[j]==ch[k]) { j++; k++; if(ch[j]==ch[k]) next[j]=next[k]; else next[j]=k; } else k=next[k]; } } int kmpindex(char *s,char *t,int s_len, int t_len,int star) { int next[20],i=star,j=0,v; get_next(t,t_len,next); while(i<s_len&&j<t_len) { if(j==-1||s[i]==t[j]) { i++; j++; } else j=next[j]; if(j==t_len) v=i-t_len; else v=-1; } return(v); } void main() { int j,s_len,t_len, n=0 , star=0; char *s="abcdnabcdmabcduabcdoabcdg"; char *t="abcd"; while(star<=s_len-t_len&&j!=-1) { j=kmpindex(s,t,s_len,t_len,star); star=j+t_len+1; if(j!=-1)n++ ; } printf("%dn", n ); } |
int getcount(char *str1,char *str2)
{int len=0;n=0;
for(;str1!='';str1++)
{ while(len<strlen(str2))
{if(*str1==*str2++)
len++;
else break;
}
if(len==strlen(str2))
n++;
}
return n;
}
#include <stdio.h>
#include <stdlib.h>
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
int Find_str(char *,char *);
void main()
{
int num;
num = Find_str(str1,str2);
printf("the num is %d",num);
}
int Find_str(char *str1,char *str2)
{
char *ptr1;
char *ptr2;
char *ptr;
int retcode = 0;
ptr1 = str1;
while(*ptr1!='')
{
if(*ptr1==*str2)
{
ptr=ptr1;
ptr2=str2;
while((*ptr!='')&&(*ptr2!='')&&(*ptr==*ptr2))
{
ptr++;
ptr2++;
}
if(*ptr2=='')
{
retcode++;
}
}
ptr1++;
}
return retcode;
}
#include "stdio.h" #include "string.h" void main() { char str1[] = "abcdnabcdmabcduabcdoabcdg"; char str2[] = "abcd"; unsigned count = 0; unsigned j = 0; unsigned k; for (unsigned i = 0; i < strlen(str1) - 3;) { k = 0; j = i; while (str1[i] == str2[k]) { i++; k++; } if (k >= strlen(str2)) { i = j + 4; count++; } else if (k == 3) { i = j + 3; } else if (k == 2) { i = j + 2; } else { i = j + 1; } } printf("%dn",count); } |
可以先自己写一个查找字符串的函数,
如 int find(char str1[], char str2[], int i);
其中str1为原字符串,str2为被查找字符串(假设str1和str2最后一个字符是 ''),
i是从这个字符串中最几个字符开始查找。 当找到后,返回被查找
字符串第一个出现的位置,如果未找到,返回-1.
然后在主程序中用如下代码
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
int count = 0;
int pos; // 4为str2的长度(可以用strlen得到,不会连这个函数也不让用吧?
for(pos = find(str1, str2, 0); pos != -1;
pos = find(str1, str2, pos + 4))
count++;
printf("the repeat count: %dn", count);
1.介绍一下STL,详细说明STL如何实现vector。
2.如果用VC开发程序,常见这么几个错误,C2001,c2005,c2011,这些错误的原因是什么。
3.继承和委派有什么分别,在决定使用继承或者委派的时候需要考虑什么。
4.指针和引用有什么分别;如果传引用比传指针安全,为什么?如果我使用常量指针难道不行吗?
5.参数传递有几种方式;实现多态参数传递采用什么方式,如果没有使用某种方式原因是什么;
6.结合一个项目说明你怎样应用设计模式的理念。
7.介绍一下你对设计模式的理解。(这个过程中有很多很细节的问题随机问的)
8.C++和C定义结构的分别是什么。
9.构造函数可否是虚汗数,为什么?析构函数呢,可否是纯虚的呢?
10,拷贝构造函数相关问题,深拷贝,浅拷贝,临时对象等。
11.结合1个你认为比较能体现OOP思想的项目,用UML来描述。(最好这个项目继承,多态,虚函数都有体现)这个问题大概会占面试时间的一半,并且会问很多问题,一不小心可能会被问住)。
12。基类的有1个虚函数,子类还需要申明为virtual吗?为什么。
13.C也可以通过精心封装某些函数功能实现重用,那C++的类有什么优点吗,难道仅仅是为实现重用。
14.C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系。
15.为什么要引入抽象基类和纯虚函数?
16.介绍一下模板和包容器。如何实现?(也许会让你当场举例实现)
17.你如何理解MVC。简单举例来说明其应用。
18,多重继承如何消除向上继承的二义性。
关于问题2:我想是我说自己常用VC编程,他们觉得那你要常常用的话,这种常见错误肯定知道原因。我当时想:你就不能说错误提示是什么,我也好分析一下,那么多错误代码,我哪记得哪个对应哪个啊。
以下回答部分问题,有的还是没有找到答案:
1.没用过STL,只是有听说过,特点是泛型,也是基于多态和模板技术。向量是可以看作是动态数组。再深的就答不出了。
2.见MSDN.
3.这是他们问的最后一个问题。我当时不知道使用中有什么差别,离开前问了他们。继承和委派差别主要是语义不同。详见《高质量C++编程》和《设计模式》第一章。
4.定义引用必须要初始化,指针不必。后面的不知道。
5.传值,传地址,传引用;多态通常使用后两个;不知道有无使用传值的。
6.略。最好能抽象层次比较高。
7.这个我觉得他当时问的有问题,C++和C定义结构没有区别,只是在定义结构类型变量的时候,C++不需要struct关键字。
9.构造函数不可是虚函数,析构函数可以是,也可以是纯虚的。见《thinking in c++》第14章
10.钱能那本《C++程序设计》有很详细的说明。
11.略。最好能体现你基类设计的比较好,多态等应用。
12.不需要。
13.应该是白盒和黑盒的区别。欢迎补充。
14.特点封装,继承,重载,多态;多态是通过虚函数和滞后联编实现。那个著名的图就不画了。他们可能会让你写几个类来说明,或者给你几个,让你描述。
15.见钱能那本《C++程序设计》,P370-P375.这里略。
16.不知道,但是《thinking in c++》有说明。
17.model,view,controler.我以改变用户输入方式不应当影响视图来说明的。
18.《thinking in c++》有说明
LINK2001....以前真的去查过.....
一.由于编码错误导致的LNK2001。
1.不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。例如,
如果在C++ 源文件内声明了一变量“var1”,却试图在另一文件内以变量
“VAR1”访问该变量,将发生该错误。
2.如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定
义将导致LNK2001错误。
3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生
LNK2001。
4.试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。
5.要注意函数和变量的可公用性,只有全局变量、函数是可公用的。
静态函数和静态变量具有相同的使用范围限制。当试图从文件外部访问
任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。
函数内声明的变量(局部变量) 只能在该函数的范围内使用。
C++ 的全局常量只有静态连接性能。这不同于C,如果试图在C++的
多个文件内使用全局变量也会产生LNK2001错误。一种解决的方法是需要时在
头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种
方法是使用时给该变量赋以常数。
二.由于编译和链接的设置而造成的LNK2001
1.如果编译时使用的是/NOD(/NODEFAULTLIB)选项,程序所需要的运行
库和MFC库在连接时由编译器写入目标文件模块, 但除非在文件中明确包含
这些库名,否则这些库不会被链接进工程文件。在这种情况下使用/NOD将导
致错误LNK2001。
2.如果没有为wWinMainCRTStartup设定程序入口,在使用Unicode和MFC
时将得到“unresolved external on _WinMain@16”的LNK2001错误信息。
3.使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内,
源文件中对“func”的引用,在目标文件里即对“__imp__func” 的引用。
如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行连接,将在__imp__func上发
生LNK2001;如果不使用/MD选项编译,在使用MSVCxx.LIB连接时也会发生LNK2001。
4.使用/ML选项编译时,如用LIBCMT.LIB链接会在_errno上发生LNK2001。
5.当编译调试版的应用程序时,如果采用发行版模态库进行连接也会产
生LNK2001;同样,使用调试版模态库连接发行版应用程序时也会产生相同的
问题。
6.不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可
能包含早先的版本没有的符号和说明。
7.在不同的模块使用内联和非内联的编译选项能够导致LNK2001。如果
创建C++库时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头
文件里却关闭了函数内联(没有inline关键字),这时将得到该错误信息。
为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数。
8.不正确的/SUBSYSTEM或/ENTRY设置也能导致LNK2001
编译器错误 C2001
常数中有换行符
字符串常数不能继续到第二行,除非进行下列操作:
用反斜杠结束第一行。
用一个双引号结束第一行上的字符串,并在下一行用另一个双引号开始该字符串。
用 n 结束第一行是不够的。例如:
printf("Hello, // error
world");
printf("Hello,n // error
world");
printf("Hello, // OK
world");
printf("Hello," // OK
" world");
下一行开始处位于行继续符后的空格包含在字符串常数中。以上显示的示例都没有将换行符嵌入字符串常数中。可以按如下所示嵌入换行符:
printf("Hello,n
world");
printf("Hello,
nworld");
printf("Hello,n"
"world");
printf("Hello,"
"nworld");
//////////////////////////////////////////////////////////////////////////////
编译器错误 C2005
#line 应输入行号,却找到“token”
#line 指令后面必须跟行号。下面的示例生成 C2005:
// C2005.cpp
int main() {
int i = 0;
#line i // C2005
// try ...
// #line 0
}
//////////////////////////////////////////////////////////////////////////////
编译器错误 C2011
“identifier”:“type”类型重定义
该标识符已定义为 type 类型。如果多次将某个类型库导入同一个文件,也可能生成 C2011。
例如:
struct S;
union S; // Error C2011
多重继承上的二义性见例子:
class A{
public:
ostream &print(ostream&)const;
void highlight();
};
class B{
public:
bool onExhibit()const;
private:
bool highlight(int zoo_location);
};
calss C:public B
{
ostream &print(ostream&)const;
void dance(dance_type)const;
};
class D:public C,public A
{
void cuddle()const;
};
void main()
{
//以下调用都是二义的
C::print(ostream&)const;
A::print(ostream&)const;
}
如果在两个或多个基类中都找到了声明,则调用是二义的.
解决二义的方法是采用虚拟继承.
一.所有对象都必须由你建立
1. 存储在哪里
1. 寄存器:我们在程序中无法控制
2. stack:存放基本类型的数据和对象的reference,但对象本身不存放在stack中,而是存放在Heap中
3. Heap:存放用new产生的数据
4. Static storage:存放在对象中用static定义的静态成员
5. Constant storage:存放常量
6. NON-RAM:硬盘等永久存储空间
2. 特例:基本型别
基本类型数据存放在Stack中,存放的是数据。而产生对象时,只把对象的reference存放在stack中,用于指向某个对象,对象本身存放在Heap中。
3. Java中的数组
当你产生某个存储对象的数组时,真正产生的其实是存储reference的数组。引数组建立后,其中的每一个reference都会被自动设为null,表示“不指向任何对象”。
二.建立新的数据型别:Class
1. 数据成员和函数
1.1 基本成员的缺省值
1) 当class的某个成员属于基本型别时,即使你没有为它提供初值,Java仍保证它有一个缺省值。
2) 只有当变量身份是“class内的成员时,Java才保证为该变量提供初值。
三.函数(Mehtods),引数(arguments),返回值(return values)
1. 引数列
当引数传递的是对象时,传递的是对象的reference。
四.注解用内嵌式文档
Java提供两种注解风格:/*XXXX*/、//XXXX
第3章 控制程序流程
一.使用Java运算符
1.关系运算符
1.) 当对两个对象运用关系运算符进行比较时,比较的是object reference,如:
Integer n1 = new Integer(3);
Integer n2 = new Integer(3);
System.out.println(n1==n2);
结果为false,因为两个object reference(n1和n2)值是不同的
2) quals()的缺省行为也是拿referenct来比较。不过Java中的class覆写了equals方法,如:
Integer n1 = new Integer(3);
Integer n2 = new Integer(3);
System.out.println(n1.quals(n2));//值为true
2. 逻辑运算符
1) 只能将and、or、not施用于boolean值身上。如果逻辑运算符两边的值存在non-boolean值,将会出错,如:
int test1 = 1;
System.out.println((test && 1<2);//编辑出错,test是non-boolean值
3. 位移运算符
如果所操作的位移对象是char、byte、short,位移动作发生之前,其值会先被晋升为int,运算结果会是int。
二.流程控制
1. 迭代(iteration)
1.1 逗号运算符
逗号运算符只能用于for循环的控制表达式中的initialization和step两部分中,如:for(int i=0, j=I+1; I<5; i++, j=I*2)
1.2 break和continue
break表示退出循环;continue表示退出本次循环,回来循环起始位置。
1.3 label
label只有放在迭代语句之前才起作用,在label和迭代语句之间插入任何语句都不会起作用。
2. Switch
switch中的选择器必须是int或char型,如:
float i = 2;
switch ( i )//将出错,因为i不是int或char之一
3. 计算细节
1) 从float或double转为整数值,总是以完全舍弃小数的方式进行。
4. Math.random()的输出范围是[0, 1]。
我的项目比较复杂,需要调用动态链接库,这样在JNI传送参数到C程序时,需要对参数进行处理转换。才可以被C程序识别。
大体程序如下:
在这里要注意的是,path里一定要包含类库的路径,否则在程序运行时会抛出异常:
java.lang.UnsatisfiedLinkError: no sms in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1491)
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
at java.lang.System.loadLibrary(System.java:834)
at com.mobilesoft.sms.mobilesoftinfo.SendSMS.<clinit>(SendSMS.java:14)
at com.mobilesoft.sms.mobilesoftinfo.test.main(test.java:18)
Exception in thread "main"
指引的路径应该到.dll文件的上一级,如果指到.dll,则会报:
java.lang.UnsatisfiedLinkError: C:sms.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1560)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1485)
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
at java.lang.System.loadLibrary(System.java:834)
at com.mobilesoft.sms.mobilesoftinfo.SendSMS.<clinit>(SendSMS.java:14)
at com.mobilesoft.sms.mobilesoftinfo.test.main(test.java:18)
Exception in thread "main"
通过编译,生成com_mobilesoft_sms_mobilesoftinfo_SendSMS.h头文件。(建议使用Jbuilder进行编译,操作比较简单!)这个头文件就是Java和C之间的纽带。要特别注意的是方法中传递的参数jbyteArray,这在接下来的过程中会重点介绍。
对于我要调用的C程序的动态链接库,C程序也要提供一个头文件,sms.h。这个文件将要调用的方法罗列了出来。
在有了这两个头文件之后,就可以进行C程序的编写了。也就是实现对JNI调用的两个方法。在网上的资料中,由于调用的方法实现的都比较简单,(大多是打印字符串等)所以避开了JNI中最麻烦的部分,也是最关键的部分,参数的传递。由于Java和C的编码是不同的,所以传递的参数是要进行再处理,否则C程序是会对参数在编译过程中提出警告,例如;warning C4024: 'SmsSend' : different types for formal and actual parameter 2等。
Sms.c的程序如下:
对于C或C++,在程序上是会有稍微的不同,这可以由读者对其进行适当的修改。这里要注意的是GetArrayLength,GetByteArrayElements等这些JNI中已经包含的方法,这些方法是专门对转换参数类型而提供的。具体的方法有很多,在下一篇中会做专门的介绍。
在完成了上述的文件后,可以对sms.c进行编译,生成.dll文件(建议在release中编译,这样动态链接库的容积会比较小!)
完成.dll文件的编译后,就可以在Java中调用C程序中的方法了。例如文件test.java
在这个文件中要注意的有一点,就是在传递字节数组到C程序中时,最后的结尾一定要以0结束。这是一个偷懒的做法,不过是个有效的做法。因为大多数情况下,接口是由第三方提供的。所以我们一般是不知道在C的方法里,具体是怎么处理参数的。而C又是要求数组是有长度。所以,在Java中,如果你不想写程序传数组的长度,那么在数组中以0结尾就是最方便的方法了。当然,如果有更好的方法也希望大家提出。
到这里,一个完整的Java通过JNI调用动态链接库的程序就完成了。实际上也不是很复杂。只要多注意一下细节,是很容易得出来的。
最近在公司里做了一个手机的项目,需要JAVA程序在发送短信的时候和第三方的短信服务器连接。短信接口是用C++写的。琢磨了三天,大致搞懂了JNI的主体部分。先将心得整理,希望各位朋友少走弯路。
首先引用一篇文章,介绍一个简单的JNI的调用的过程。
JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。
JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。
简单介绍及应用如下:
一、JAVA中所需要做的工作
在JAVA程序中,首先需要在类中声明所调用的库名称,如下:
static {
System.loadLibrary(“goodluck”);
}
在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具 体实现。如下:
public native static void set(int i);
public native static int get();
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
例如程序testdll.java,内容为:
public class testdll
{
static
{
System.loadLibrary("goodluck");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}
用javac testdll.java编译它,会生成testdll.class。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。
二、C/C++中所需要做的工作
对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。
接上例子。我们先看一下testdll.h文件的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class testdll */
#ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
/*
* Class: testdll
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
在具体实现的时候,我们只关心两个函数原型
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); 和
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。
好,下面我们用testdll.cpp文件具体实现这两个函数:
#include "testdll.h"
int i = 0;
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
{
return i;
}
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
{
i = j;
}
编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll 。把goodluck.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。
我的项目比较复杂,需要调用动态链接库,这样在JNI传送参数到C程序时,需要对参数进行处理转换。才可以被C程序识别。
大体程序如下:
public class SendSMS {
static
{
System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("sms");
}
public native static int SmsInit();
public native static int SmsSend(byte[] mobileNo, byte[] smContent);
}
在这里要注意的是,path里一定要包含类库的路径,否则在程序运行时会抛出异常:
java.lang.UnsatisfiedLinkError: no sms in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1491)
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
at java.lang.System.loadLibrary(System.java:834)
at com.mobilesoft.sms.mobilesoftinfo.SendSMS.(SendSMS.java:14)
at com.mobilesoft.sms.mobilesoftinfo.test.main(test.java:18)
Exception in thread "main"
指引的路径应该到.dll文件的上一级,如果指到.dll,则会报:
java.lang.UnsatisfiedLinkError: C:sms.dll: Can't find dependent libraries
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1560)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1485)
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
at java.lang.System.loadLibrary(System.java:834)
at com.mobilesoft.sms.mobilesoftinfo.SendSMS.(SendSMS.java:14)
at com.mobilesoft.sms.mobilesoftinfo.test.main(test.java:18)
Exception in thread "main"
放下利害、放下尊严、放下身份,爱情面前,比法律更人人平等。 真正聪明的女人都会知道,她无论和什么男人说话时,懂得的事都应该比男人少。 男人有权就会变得蛮横,女人要变得蛮横才会有权。 最理想的夫妻关系是,亲密而带适当,坦诚中保留部分隐秘,既可两情,又有个人天地。 男人都会喜欢听话的女人,但男人若是喜欢一个女人,就会不知不觉听那女人的话。 女人成功背后多有一个伤她的男人,男人成功背后多有一个爱她的女人。 做情人的时候,女人会让男人心痛 男人认为女人可爱最重要 迁就,容忍,屈服,接纳,适应,宽恕,谅解,妥协,毅力,认命,婚姻爱情可训练出“十项全能” 一个成功的男人就是能够赚到比女人花得更多钱的人, 一个女人会为未来担心,直到她找到一个丈夫为止, 男人想做女人的初恋情人, 聪明的女人都知道,软弱是对付男人最好的战略。 男人就算有了一万个女人也希望这个一万个女人只有他一个男人。 女人走投无路的时候会和男人结婚,男人走投无路的时候女人会和他离婚。 爱,毋须找出合理的借口,不爱,则信手拈来千万个理由。 爱须冒险,情更伤神,若无二者,何谓人生? 为何总是鼓吹爱得要生要死,而不可以爱得环欢喜喜? 男人对女人应该多一点爱,少一点了解。 女人在任何一场争吵中都会说最后一句话,
做妻子的时候,女人会让男子头痛
女人认为男人可靠最重要
一个成功的女人就是能够找到一个这样的男人
一个男人从不会为未来担心,直到他找到一个妻子为止。
女人想做男人的最后一个情人。
女人对男人应该多一点了解,少一点爱。
一个男人若继续说话,就是一场新的战争的开始
1.字符串函数
长度与分析用
datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格
substring(expression,start,length) 不多说了,取子串
right(char_expr,int_expr) 返回字符串右边int_expr个字符
字符操作类
upper(char_expr) 转为大写
lower(char_expr) 转为小写
space(int_expr) 生成int_expr个空格
replicate(char_expr,int_expr)复制字符串int_expr次
reverse(char_expr) 反转字符串
stuff(char_expr1,start,length,char_expr2) 将字符串char_expr1中的从
start开始的length个字符用char_expr2代替
ltrim(char_expr) rtrim(char_expr) 取掉空格
ascii(char) char(ascii) 两函数对应,取ascii码,根据ascii吗取字符
字符串查找
charindex(char_expr,expression) 返回char_expr的起始位置
patindex("%pattern%",expression) 返回指定模式的起始位置,否则为0
2.数学函数
abs(numeric_expr) 求绝对值
ceiling(numeric_expr) 取大于等于指定值的最小整数
exp(float_expr) 取指数
floor(numeric_expr) 小于等于指定值得最大整数
pi() 3.1415926.........
power(numeric_expr,power) 返回power次方
rand([int_expr]) 随机数产生器
round(numeric_expr,int_expr) 安int_expr规定的精度四舍五入
sign(int_expr) 根据正数,0,负数,,返回+1,0,-1
sqrt(float_expr) 平方根
3.日期函数
getdate() 返回日期
datename(datepart,date_expr) 返回名称如 June
datepart(datepart,date_expr) 取日期一部份
datediff(datepart,date_expr1.dateexpr2) 日期差
dateadd(datepart,number,date_expr) 返回日期加上 number
上述函数中datepart的
写法 取值和意义
yy 1753-9999 年份
qq 1-4 刻
mm 1-12 月
dy 1-366 日
dd 1-31 日
wk 1-54 周
dw 1-7 周几
hh 0-23 小时
mi 0-59 分钟
ss 0-59 秒
ms 0-999 毫秒
日期转换
convert()
4.系统函数
suser_name() 用户登录名
user_name() 用户在数据库中的名字
user 用户在数据库中的名字
show_role() 对当前用户起作用的规则
db_name() 数据库名
object_name(obj_id) 数据库对象名
col_name(obj_id,col_id) 列名
col_length(objname,colname) 列长度
valid_name(char_expr) 是否是有效标识符 查看全文
IE信息设定: HKEY_CURRENT_USERSoftwareMicrosoftWindowsShellNoRoamMUICache
1、浮点数格式:
a、浮点数的范围:
-2(2m-1)*(1-2-n)
2、帮助文档的制作
每一节的标题注脚:$
每一节的跳转命(不能是中文):#
每一节的关键字索引:K
节序号:+
跳转文本在RTF文件中是带双下划线的文本
3、Dumpbin.exe:用于检查COFF目标文件,标准COFF目标库文件,可执行文件,和动态连接库文件
4、Q:ZIP与RAR之类密码能否用SOFTICE或TRW动态跟踪破解?——《看雪论坛》
A:
不能,WinZip和WinRAR是通过与CRC结合的方式进行加密,它们在解压的时候会不管3721先把带上用户输入的密码的CRC放进解压流程中,先
解出来再说,最后才进行原始的CRC判定,如果最后得到的CRC与原来的不一样,那就是解压失败。因为CRC是不可逆推的,所以也没办法得到原始的密码,
同时也因为把对比的过程放在了最后,所以才没办法用SoftICE等工具进行破解,只能穷举(目前来说)。
5、Q:为什么在WinNT/2000/XP系统,bpx hmemcpy断点无效?
A:
hmemcpy是Win9x系统内部的一个函数,俗称万能断点,但在一般的编程书籍上很少提到,原因它是底层的东西,没有特殊需要,一般不直接调用。它的
操作很简单,只是将内存中的一块数据拷贝到另一个地方,Win9x系统里很频繁地调用它处理数据。在Win
NT/2K系统上相关的函数是memcpy,但在Win NT/2K上不同于Windows
9x上,很少再调用memcpy来处理数据了,用此函数设断基本上什么也拦不住。
6、Q:为何同一函数有几种形式,如MessageBoxA(W)?
A:
MessageBoxA(W)是MessageBoxA,MessageBoxW两种形式缩写,Windows函数是区分字符集的:A表示ANSI,W表
示Wide,即Unicode (Wide
character-set),前者就是通常使用的单字节方式,而后者是双字节方式,方便处理双字节字符。Win98基本是使用ANSI字符串来进行内部
操作的,但它仍可处理少数Unicode字串符函数,如MessageBoxW、MessageBoxExW等。而Win2000/XP所有核心函数都是
Unicode字串符。
7、Q:为什么SoftICE或TRW再运行一些软件时会中断跳出?
A:用命令FAULTS off关闭错误跟踪功能。
8、Q:F11与F12区别?
A:F11对应的命令是:G@ss:sp,假如你目前正中断在程序中,下这个指令会在堆栈的返回地址设个暂时断点并执行到此断点。
F12
对应的命令是:P RET
。SoftICE或TRW将一直单步执行直到它找到一条返回语句(RET、RETF),也就是说让SoftICE一直执行代码,直到出现 RET
(XXXX) 命令,再跳出来拦截,这时,当前 IP(EIP) 会是停在 RET (XXXX) 后的某一条语句上,通常是在某一个CALL
XXXXXXXX 后面。
说明:F11功能键在SoftICE中有效,在TRW中可以用pmodule命令代替F11或F12,可瞬间回到到前程序领空。
9、Q:SoftICE与TRW2000的断点有什么不同?
A:在这里以G命令来解释,如对G
401000命令,大家都知道是执行到401000停下,但SoftICE认为是到当前段的401000停下(也就是说在当前应用程序领空),而
TRW200却不管段址如何,只要EIP是401000便停下。 这样一般跟踪一软件只要G
401000便解决。这个功能看起来简单,却极为有用。有了这条命令,只要把当前跟踪到的EIP记下,下一次一G便到。而在SoftICE下,一般先用其
Symbol Loader装载程序,先来到当前应用程序的领空,然后再G 401000才能到达指定地址处。其它断点命令,如bpx原理与此类似。
10、Q:如何在对话框中加入工具条
在 OnInitDialog 中加入下面代码:
BOOL CYourDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Create the toolbar. To understand the meaning of the styles used, you
// can take a look at the MSDN for the Create function of the CToolBar class.
ToolBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS |CBRS_FLYBY | CBRS_BORDER_BOTTOM);
// I have assumed that you have named your toolbar''s resource as IDR_TOOLBAR1.
// If you have given it a different name, change the line below to accomodate
// that by changing the parameter for the LoadToolBar function.
ToolBar.LoadToolBar(IDR_TOOLBAR1);
CRect rcClientStart;
CRect rcClientNow;
GetClientRect(rcClientStart);
// To reposition and resize the control bar
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST,0, reposQuery, rcClientNow);
CPoint ptOffset(rcClientNow.left - rcClientStart.left,rcClientNow.top-rcClientStart.top);
CRect rcChild;
CWnd* pwndChild = GetWindow(GW_CHILD);
while (pwndChild)
{
pwndChild->GetWindowRect(rcChild);
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild->MoveWindow(rcChild, FALSE);
pwndChild = pwndChild->GetNextWindow();
}
CRect rcWindow;
GetWindowRect(rcWindow);
rcWindow.right += rcClientStart.Width() - rcClientNow.Width();
rcWindow.bottom += rcClientStart.Height() - rcClientNow.Height();
MoveWindow(rcWindow, FALSE);
// And position the control bars
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
return TRUE; // return TRUE unless you set the focus to a control
}
Q:如何改变对话框的形状?
可用下面一些函数:
CreatePolygonRgn
CreateRectRgn
CreateRoundRectRgn 等.
CRgn m_rgn; // Put this in your dialog''s header file. i.e. a member variable
// This Gets the size of the Dialog: This piece of code is to be placed in the
// OnInitDialog Function of your dialog.
CRect rcDialog
GetClientRect(rcDialog);
// The following code Creates the area and assigns it to your Dialog
m_rgn.CreateEllipticRgn(0, 0, rcDialog.Width(), rcDialogHeight());
SetWindowRgn(GetSafeHwnd(), (HRGN) m_rgn, TRUE);
Q:如何实现非客户区移动?
可用下面二种方法
// Handler for WM_LBUTTONDOWN message
void CYourDialog::OnLButtonDown(UINT nFlags, CPoint point)
{
CDialog::OnLButtonDown(nFlags, point);
PostMessage( WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM( point.x, point.y));
}
// Handler for WM_NCHITTEST message
LONG CYourDialog::OnNcHitTest( UINT uParam, LONG lParam )
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
UINT nHitTest = CDialog::OnNcHitTest(CSize(xPos, yPos));
return (nHitTest == HTCLIENT) ? HTCAPTION : nHitTest;
}
Q:如何使对话框初始为最小化状态?
在 OnInitDialog 中加入下面代码:
SendMessage(WM_SYSCOMMAND, SC_MAXIMIZE, NULL);
Q:如何限定对话框大小范围?
在 WM_SIZING中加入下面代码:
void CYourDialog::OnSizing(UINT fwSide, LPRECT pRect)
{
if(pRect->right - pRect->left <=200)
pRect->right = pRect->left + 200;
if(pRect->bottom - pRect->top <=200)
pRect->bottom = pRect->top + 200;
CDialog::OnSizing(fwSide, pRect);
}
Q:如何在对话框中加入状态条?
定义 CStatusBar 变量:
CStatusBar m_StatusBar;
定义状态条指定状态:
static UINT BASED_CODE indicators[] =
{
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM
};
在 OnInitDialog 中加入下面代码:
m_StatusBar.CreateEx(this,SBT_TOOLTIPS,WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,AFX_IDW_STATUS_BAR);
// Set the indicators namely caps and nums lock status
m_StatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT));
CRect rect;
GetClientRect(&rect);
m_StatusBar.SetPaneInfo(0,ID_INDICATOR_CAPS,SBPS_NORMAL,rect.Width()/2);
m_StatusBar.SetPaneInfo(1,ID_INDICATOR_NUM,SBPS_STRETCH ,rect.Width()/2);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,ID_INDICATOR_NUM);
m_StatusBar.GetStatusBarCtrl().SetBkColor(RGB(180,180,180));
11. Microsoft Distributed Transaction Coordinator服务(MSDTC.EXE)默认监听3372TCP端口
12. #pragma alloc_text( "textsection", function1, ... )
13. Unicode 字符串数据类型是C语言规范的一部分,使用下列方法来使用Unicode 字符串:
l将字符串常量加上前缀L。例如,L”Some text”是一个Unicode 字符串,而”Some text”是8-bit ANSI。
l使用wchar_t数据类型。DDK头文件定义了WCHAR为wchar_t,PWSTR为wchar_t*。
l使用常数UNICODE_NULL去终止Unicode 字符串,UNICODE_NULL被定义为16 bits的零。
cvs服务器的安装作者:weiqiong 发表时间:2002/12/30
08:32pm安装cvs后服务器和客户端就都安装了,主要是需要配置服务器端:1.查看是否安装cvs(我的redhat7.3缺省是装了的)rpm
-qa|grep
cvs一般安装在/usr/bin/cvs,如果未安装,到www.cvshome.org下载一个最新的rpm安装即可2.建立cvs用户组,便于管理
cvs用户groupadd cvs3.建立cvs组的cvsroot用户和所属的目录useradd -g cvs -G cvs -d
/home/cvsroot cvsroot4.为cvsroot用户添加密码passwd
cvsroot5.改变/home/cvsroot的目录属性chmod 775
/home/cvsroot6.初始化cvs源代码库,此操作生成目录/home/cvsroot/CVSROOT,其下为一些初始化文件cvs -d
/home/cvsroot init7.创建可以登陆cvs服务的用户及密码,需要创建文件passwdvi
/home/cvsroot/CVSROOT/passwd文件内容如下:weiqiong:xxxxxx:cvsrootchenxu:xxxxxx:
cvsroot此文件的意思是weiqiong和chenxu两个用户可以登陆cvs服务器,登陆后其权限为用户cvsroot的权限注意:cvs用户和
服务器用户是可以不一样的8.xxxxxx为密码,由以下文件生成:vi /home/cvsroot/passwdgen.pl文件内容:
#!/usr/bin/perlsrand (time());my $randletter = "(int (rand (26)) + (int
(rand (1) + .5) % 2 ? 65 : 97))";my $salt = sprintf ("%c%c", eval
$randletter, eval $randletter);my $plaintext = shift;my $crypttext =
crypt ($plaintext, $salt);print
"${crypttext}n";9.如果需要密码为:some,则敲入:passwdgen.pl
"some"回车即可得到加密密码,用其替换passwd文件中的xxxxxx10.加入cvs服务(我的redhath7.3缺省就有cvs服务,所以
不用加)vi /etc/servicescvspserver 2401/tcp #pserver cvs servicecvspserver
2401/udp #pserver cvs service
11.cvs服务由inted来唤起,因此需要改动inetd提供的服务,如果你的redhat使用的是inetd
方式则在文件/etc/inetd.conf中加入如下的内容:cvspserver stream tcp nowait root
/usr/bin/cvs cvs --allow-root=/home/cvsroot pserver
我的redhat7.3使用的是xinetd方式,所以在xinetd.d目录下添加需要启动的服务: cd /etc/xinetd.d vi
cvspserver 文件内容: service cvspserver { disable = no flags = REUSE
socket_type = stream wait = no user = root server = /usr/bin/cvs
server_args = -f --allow-root=/home/cvsroot pserver log_on_failure +=
USERID }12.重新启动inetd或者xinetd: /etc/rc.d/init.d/xinetd
restart13.检查cvspserver服务是否已经启动netstat -l |grep cvspserver应该有如下结果:tcp 0
0 *:cvspserver *:* LISTEN14.试用: cvs -d
:pserver:weiqiong@202.204.114.37:/home/cvsroot login
敲入命令回车后提示输入weiqiong的密码,你按照自己设置的密码输入,如果没有什么错误信息出现就是成功了(我的机器IP地址是
202.204.114.37,也可以用localhost)
14、ActiveX控件的调试:2005.3.27-2005.3.28
这次编写的ActiveX控件是DynaGraph,用于实时显示三组动态曲线。
a、如何实现控件属性的加载和保存,如VB中的ReadProperties和WriteProperties?
在DoPropExchange(CPropExchange* pPX)中进行,诸如:
PX_Long(pPX,"Height",m_lHeight,250);
PX_Long(pPX,"Width",m_lWidth,380);
参见MSDN/ActiveX controls:Serializing
b、由于粗心,导致产生"参数无效错误",错误如下:
m_rtBound.left=GRID_EDGE_SPACE;m_rtBound.left=GRID_EDGE_SPACE;m_rtBound.right
=m_rtGrid.right-GRID_EDGE_SPACE;m_rtBound.bottom=m_rtGrid.bottom-GRID_EDGE_SPACE;
由于把top写成了left,导致top没有赋值,出现溢出[不在有效范围内]
c、由于VC的Bug,导致在添加属性和方法时,相应的ID没有同步,从而导致很多的属性和方法的ID没有相互对应,导致"无效参数数目"错误,而且无法对其进行跟踪(因为ID错位)。
方法(以DrawGraph为例):
BEGIN_DISPATCH_MAP(CDynaGraphCtrl, COleControl)
DISP_FUNCTION(CDynaGraphCtrl, "DrawGraph", DrawGraph, VT_EMPTY, VTS_PI4 VTS_PI4 VTS_PI4 VTS_I2)
END_DISPATCH_MAP()
dispidDrawGraph = 15L,
afx_msg void DrawGraph(long FAR* pPressData, long FAR* pSpeedData, long FAR* pCtrlData, short sLen);
void CDynaGraphCtrl::DrawGraph(long FAR* pPressData,long FAR* pSpeedData,long FAR* pCtrlData,short sLen)
属性(以BackColor为例):
BEGIN_DISPATCH_MAP(CDynaGraphCtrl, COleControl)
DISP_PROPERTY_EX(CDynaGraphCtrl, "BackColor", GetBackColor, SetBackColor, VT_COLOR)
END_DISPATCH_MAP()
dispidBackColor = 3L,
afx_msg OLE_COLOR GetBackColor();
afx_msg void SetBackColor(OLE_COLOR nNewValue);
OLE_COLOR CDynaGraphCtrl::GetBackColor() { }
void CDynaGraphCtrl::SetBackColor(OLE_COLOR nNewValue) {}
16、ODBC connect string sample:
“DBQ=E:工程PROGRAMME舱盖升降系统HATCHHatchDB.mdb;UID=SA;PWD="";DRIVER=Microsoft Access Driver (*.mdb)”
17、由于坐标的不一致,导致移动控件始终不是按照预期的目的在移动。即少用了一个ScreenToClient(),正确代码如下[Hatch]:2005/4/11
GetCursorPos(&pt);
ScreenToClient(&pt);
if(pt.x!=m_ptLPPPosOldX.x)
{
m_ctlLPPointer.GetWindowRect(&m_rtLPPointer);
ScreenToClient(&m_rtLPPointer);
m_rtLPPointer.left-=m_ptLPPPosOldX.x-pt.x;
m_rtLPPointer.right-=m_ptLPPPosOldX.x-pt.x;
m_ctlLPPointer.SetWindowPos(&CWnd::wndTop,m_rtLPPointer.left,m_rtLPPointer.top,
m_rtLPPointer.right-m_rtLPPointer.left,m_rtLPPointer.bottom-m_rtLPPointer.top,
SWP_SHOWWINDOW);
m_ptLPPPosOldX=pt;
}
18、VB的ActiveX中的Extender在VB中是不兼容的,所以如果要在VC中使用VB开发的控件,则不能包含Extender。4/11/05
19、自绘控件的无闪烁更新,使用InvalidateControl(&m_rtBound);更新绘图区域,而不用更新没有变化的区域。[DynaGraph: DrawGraph]4/12/2005
20、向导中文乱码:原因尚未查证,但是可以使用Dialog替代PROPPAGE则可解决这个问题。
21、
在对话框中加入属性页,当对话框失去焦点后,对话框便假死:主要是因为在创建属性页时,没有将扩展属性中的WS_EX_CONTROLPARENT加上,
导致对话框无法处理属性页的相关消息,而我的属性页又没有建立相应的消息处理机制,故此。下例中this是对话框[Hatch:
OnInitDialog]:2005-4-14
m_PSheet.Create(this,WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|WS_OVERLAPPED,
WS_EX_OVERLAPPEDWINDOW|WS_EX_DLGMODALFRAME|WS_EX_CONTROLPARENT);
22、
在子对话框类中的CPropertySheet
m_PSheet成员变量,初始化时执行添加属性页时,不能多次显示—隐藏子对话框:主要是因为m_Psheet对像没有执行析构,添加进去的属性页仍然
存在,解决的办法是可以在创建显示之前,删掉以前的即可,如下[Hatch: OnInitDialog]:2005-4-14
while(m_PSheet.GetPageCount()>0)
m_PSheet.RemovePage(0);//删掉以前的
m_PSheet.AddPage(&m_TestPage);
m_PSheet.AddPage(&m_ConfigPage);
m_PSheet.Create(this,WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER|WS_OVERLAPPED,
WS_EX_OVERLAPPEDWINDOW|WS_EX_DLGMODALFRAME|WS_EX_CONTROLPARENT);
23、DC[Device Contexts(设备相关):MSDN]
设
备相关是一个Windows数据结构,它包含了诸如显示器或打印机等设备的绘制属性.所有的绘制调用是直接通过设备相关对象进行的,其中封装了诸如画线,
形状和文本等Windows APIs.设备相关允许在Windows中独立使用.设备相关可以用来绘制屏幕,绘制打印或者绘制媒体文件.
CPaintDC:
CPaintDC对象封装了Windows的通用习惯,调用BeginPaint函数,然后在设备相关中进行绘制,再调用EndPaint函数.
CpaintDC在构造函数中调用BeginPaint,在析构函数调用EndPaint.这简化的处理是创建CDC对象--绘制—销毁CDC对象.在框
架中,许多事件是自动处理的.特别是,你的OnDraw函数是一个CpaintDC已经准备好的(通过OnPrepareDC),并且你只是简单地绘制.
它通过框架进行销毁,在设备相关中在调用OnDraw函数返回是释放给Windows.
CClientDC:CclientDC对象封装了只有在客户窗口区相关的设备相关.CClientDC的构造函数调用GetDC函数,它的析构函数调用ReleaseDC函数.
CWindowDC:CWindowDC对象封装了响应整个窗口的设备相关,包括框架.
CMetaFileDC:CMetaFileDC对象封装了绘制到一个窗口媒体文件.调用OnDraw的方式与CpaintDC相比较,你自己必须在这里面调用OnPrepareDC
24、串口操作函数
a.打开串口
HANDLE CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess, DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
b.设置缓冲
BOOL SetupComm( HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue);
c、关闭串口
BOOL CloseHandle(HANDLE hObject);
d、配置串口
BOOL GetCommState( HANDLE hFile, LPDCB lpDCB );
BOOL SetCommState( HANDLE hFile, LPDCB lpDCB );
BOOL BuildCommDCB( LPCTSTR lpDef, LPDCB lpDCB);
BOOL BuildCommDCBAndTimeouts(LPCTSTR lpDef, LPDCB lpDCB,LPCOMMTIMEOUTS lpCommTimeouts);
e、串口属性
BOOL GetCommProperties( HANDLE hFile, LPCOMMPROP lpCommProp);
f、串口读写
BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped );
BOOL ReadFileEx(
HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPOVERLAPPED lpOverlapped,
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );
BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped);
BOOL WriteFileEx(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite,
LPOVERLAPPED lpOverlapped, LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );
g、重叠操作
BOOL GetOverlappedResult(HANDLE hFile, LPOVERLAPPED lpOverlapped,
LPDWORD lpNumberOfBytesTransferred, BOOL bWait );
h、超时
BOOL GetCommTimeouts( HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts);
BOOL SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts);
i、通信状态和通信错误
BOOL ClearCommError( HANDLE hFile, LPDWORD lpErrors, LPCOMSTAT lpStat);
25.数据库在执行插入语句时,始终不能插入数据:4/25/2005
原是语句如下:
INSERT INTO ExpResult(Name,ExpID,MinPress,MaxPress,AvrPress,ResultA,ResultB,ResultC,ResultD,Result,
DateStart,DateStop,Reserved1,Reserved2,Reserved3) VALUES ('23_0',1,0.000000,0.000000,0.000000, 24.000000,
234.000000,234.000000,0.000000,'',0,0,0,0.000000,'')
原因:因为我在数据库中对字符串设置了默认值为NULL,二在这儿有两个'',操作就不成功,将其改为下面的格式即可:
INSERT INTO ExpResult(Name,ExpID,MinPress,MaxPress,AvrPress,ResultA,ResultB,ResultC,ResultD,Result,
DateStart,DateStop,Reserved1,Reserved2,Reserved3)
VALUES ('23_0',1,0.000000,0.000000,0.000000,
24.000000,234.000000,234.000000,0.0000,'Null',0,0,0,0.0000,'Null')即不能给无效
的数据进去罢了.
26.使用SQL语句创建表单,关键字需要自增,使用Counter,如下:2005/5/9
szSQL.Format("CREATE
TABLE Data200504(IDD Counter PRIMARY KEY UNIQUE NOT NULL,StepDisplace
INTEGER,PPPress SINGLE,PRESSAB INTEGER,CtrlPressC INTEGER,DateTimes
INTEGER)");
27.在表单中的字段名字不能用保留字,否则在执行SQL时会不成功,诸如:Date,DateTime等。
28.
奇耻大辱啊,因为系统所使用的ActiveX和DLL没有注册,造成编译后的文件无法正常运行,有的是悄然无声;有的出现内存访问冲突.在注册后也出现这
样的问题,主要是因为注册的空降位置在system32下,而在当前路径下仍然有一份相应的文件.还有就是非system32下的进行注册怎么也不好
使,不知到底是为啥.最后写成一个只执行一次的批处理文件来解决此问题[register.bat],内容如下:[氡气 5/10/2005]
Copy G:Share氡气ReleaseMSCOMCTL.ocx C:WINNTsystem32
Copy G:Share氡气ReleaseFM20.dll C:WINNTsystem32
Copy G:Share氡气ReleaseMSCOMM32.ocx C:WINNTsystem32
Copy G:Share氡气ReleaseMSCOMCT2.ocx C:WINNTsystem32
Copy G:Share氡气ReleaseMyPic.ocx C:WINNTsystem32
regsvr32.exe /s MSCOMCTL.ocx
regsvr32.exe /s FM20.dll
regsvr32.exe /s MSCOMM32.ocx
regsvr32.exe /s MSCOMCT2.ocx
regsvr32.exe /s MyPic.ocx
29.因为发行版本的程序,调试版本的控件而导致程序无法启动.[氡气]
30.在多线程里面调用成员对象[ActiveX]的方法产生异常,原因未知,估计是因为变量作用域问题.[舱盖升降系统,工作线程中调用m_ctlLEDP1.SetValue("11.22");]
解决方法:最好不要在线程里面操作有关界面的东西,而是发送消息来进行处理
原因:VB开发的控件没有正常版权,在[系统信息]中看到版本和制造商为“不可用”,即为版权问题。而VC开发的是有上面的正确信息,调用一切正常。问题有待于进一步研究2005-6-3
ACTIVEX 控件是 COM对象. 它按COM的方式运行. 对于运行在单线程公寓模型内的 COM 来说, 它是线程不安全的,不能直接将 COM 裸指针传递至其它的线程. 如果你确信要这么做,请对COM接口进行 线程调度:
IMyObject* p = ...;
IStream* pStream = 0;
HRESULT hr = CoMarshalInterThreadInterfaceInStream(__uuidof(p), p, &pStream);
if(FAILED(hr))
{
... ERROR !
}
DWORD dwID;
HANDLE hThread = CreateThread(NULL, 0, ThreadFnc, (void*)pStream, 0, &dwID);
....
DWORD WINAPI ThreadProc(LPVOID lp)
{
IStream* pStream = (IStream*)lp;
IMyObject* pItf = NULL;
HRESULT hr=CoGetInterfaceAndReleaseStream(pStream, __uuidof(pItf), (void**)&pItf);
if(FAILED(hr))
// ERROR
pStream->Release();
return 0;
}
// ....
hr = pItf->CallSomtMethod(para);
...
pItf->Release();
return 0;
}
COM库是针对线程有效的,因此你需要在线程起始处AfxOleInit()或者在起始处 ::CoInitialize(NULL); 结束处 ::CoUninitialize();
31.在AD采集时,始终出现前一个通道影响后一个通道,原因可能是因为没有通道建立延时[调用的DLL][ 舱盖升降系统]
32.AD采集数据线不能太长,如超过1m,这样会采集不到正确的数据.[舱盖升降系统]
33.DA输出时,输出信号会一直保留,直到下一次输出为止.[ 舱盖升降系统2005/5/20]
34.对话框中的打印实例:[轴承测试,6/17/2005]
void CDataMan::OnBtnPrint()
{
if(NULL==m_ctlDataIndex.GetFirstSelectedItemPosition())
{
AfxMessageBox("你没有选中待打印的记录,不能进行打印!");
return;
}
CDC dc;
CPrintDialog printDlg(FALSE);
if (printDlg.DoModal()==IDCANCEL)
return;//Get printer settings from user
dc.Attach(printDlg.GetPrinterDC());
//将纸张改为横向的
LPDEVMODE lpDM=printDlg.GetDevMode();
lpDM->dmOrientation=DMORIENT_LANDSCAPE;
lpDM->dmFields|=DM_ORIENTATION;
dc.ResetDC(lpDM);
//Get and attach a printer DC
dc.m_bPrinting = TRUE;
CString strTitle; // Get the application title
strTitle.LoadString(AFX_IDS_APP_TITLE);
DOCINFO di; // Initialise print document details
::ZeroMemory (&di, sizeof (DOCINFO));
di.cbSize = sizeof (DOCINFO);
di.lpszDocName = strTitle;
BOOL bPrintingOK = dc.StartDoc(&di);
// Begin a new print job. Get the printing extents and
//ore in the m_rectDraw field of a CPrintInfo object
CPrintInfo Info;
m_nWidth =dc.GetDeviceCaps(HORZRES);
m_nHeight=dc.GetDeviceCaps(VERTRES);
Info.m_rectDraw.SetRect(0,0,m_nWidth,m_nHeight);
m_fRatioX=(float)m_nWidth/PAGE_WIDTH;
m_fRatioY=(float)m_nHeight/PAGE_HEIGHT;
OnBeginPrinting(&dc,&Info);
//Call your "Init printing" function
for(UINT page = Info.GetMinPage(); page <=
Info.GetMaxPage() && bPrintingOK; page++)
{
dc.StartPage(); // begin new page
Info.m_nCurPage = page;
OnPrint(&dc,&Info);
//Call your "Print page" function
bPrintingOK = (dc.EndPage() > 0); // end page
}
OnEndPrinting(&dc, &Info);
// Call your "Clean up" function
if (bPrintingOK)
dc.EndDoc();// end a print job
else
dc.AbortDoc();// abort job.
dc.DeleteDC();// delete the printer DC]
}
void CDataMan::OnBeginPrinting(CDC *pDC, CPrintInfo *pInfo)
{
POSITION pos=m_ctlDataIndex.GetFirstSelectedItemPosition();
int nRow=m_ctlDataIndex.GetNextSelectedItem(pos);
m_uaPrint.RemoveAll();
do{
m_uaPrint.Add(nRow);
nRow=m_ctlDataIndex.GetNextSelectedItem(pos);
}while(nRow>=0);
m_penTable.CreatePen(PS_SOLID,1,RGB(10,10,10));
m_pOldPen=pDC->SelectObject(&m_penTable);
m_RptFont.CreateFont(FONT_HEIGHT*m_fRatioX,0, 0, 0,
FW_NORMAL, FALSE, FALSE, 0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH| FF_ROMAN, NULL);
//因为我在表格中只使用一种字体,所以可以在这里将字体选入设备中
m_pOldFont=pDC->SelectObject(&m_RptFont);
int nPage=m_uaPrint.GetSize();
nPage=nPage/(TABLE_ROW_NUMBER-1);
nPage+=(m_uaPrint.GetSize()%(TABLE_ROW_NUMBER-1)==0)?0:1;
pInfo->SetMinPage(1);
pInfo->SetMaxPage(nPage);
}
void CDataMan::OnPrint(CDC *pDC, CPrintInfo *pInfo)
{
int nTabs[TABLE_COLUMN_NUMBER]={
(COL_1+TABLE_LEFT_SPACE)*m_fRatioX,(COL_2+TABLE_LEFT_SPACE)*m_fRatioX,
(COL_3+TABLE_LEFT_SPACE)*m_fRatioX,(COL_4+TABLE_LEFT_SPACE)*m_fRatioX,
(COL_5+TABLE_LEFT_SPACE)*m_fRatioX,(COL_6+TABLE_LEFT_SPACE)*m_fRatioX};
CString szPrint;
TEXTMETRIC metrics;
pDC->GetTextMetrics(&metrics);
pDC->FillSolidRect(0,0,m_nWidth,m_nHeight,RGB(0XFF,0XFF,0XFF));
//打印文字内容//////////////////////////////////////////////////
szPrint.Format("令号: %s",m_ctlDataIndex.GetItemText(m_uaPrint.GetAt(0),2));
pDC->TextOut((PAGE_LEFT_SPACE+TABLE_LEFT_SPACE)*m_fRatioX,
(PAGE_TOP_SPACE+TABLE_TOP_SPACE)*m_fRatioX,szPrint);
szPrint.Format("附件号: ");
pDC->TextOut((PAGE_LEFT_SPACE+TABLE_LEFT_SPACE)*m_fRatioX,
(PAGE_TOP_SPACE+TABLE_TOP_SPACE+TABLE_ROW_HEIGHT)*m_fRatioY,szPrint);
//表单标题
szPrint=m_szRptTitle;
int nPosX=pInfo->m_rectDraw.right/2-(szPrint.GetLength()*metrics.tmMaxCharWidth)/2;
pDC->TextOut(1600*m_fRatioX,(PAGE_TOP_SPACE+TABLE_TOP_SPACE)*m_fRatioY,szPrint);
//列标题
szPrint.Format("t附件名称t轴承型号t轴承序号t测试时长(s)t测试类型t测试结果(KHz)");
pDC->TabbedTextOut(TABLE_LEFT_POSITION*m_fRatioX,(TABLE_TOP_POSITION+TABLE_TOP_SPACE)*m_fRatioY,szPrint,sizeof(nTabs),nTabs,0);
//"操作员","测试日期","轴承型号","轴承编号","测试结果","时间长度","门限电压","A导通","B导通","标志信息"
int nIndex=0;
int nRow;
for(nRow=1;nRow<=TABLE_ROW_NUMBER-1&&nRow<=m_uaPrint.GetSize();nRow++)//打印
{
nIndex=m_uaPrint.GetAt(nRow-1);
szPrint.Format("t%st%st%st%st%st%s",m_ctlDataIndex.GetItemText(nIndex,3),
m_ctlDataIndex.GetItemText(nIndex,4),m_ctlDataIndex.GetItemText(nIndex,5),
m_ctlDataIndex.GetItemText(nIndex,7),m_ctlDataIndex.GetItemText(nIndex,8),
m_ctlDataIndex.GetItemText(nIndex,9));
pDC->TabbedTextOut(TABLE_LEFT_POSITION*m_fRatioX,
(TABLE_TOP_POSITION+nRow*TABLE_ROW_HEIGHT+TABLE_TOP_SPACE)*m_fRatioY,
szPrint,sizeof(nTabs),nTabs,0);
}
m_uaPrint.RemoveAt(0,nRow>=TABLE_ROW_NUMBER?11:nRow-1);//去掉已经打印的部分
szPrint.Format("t工作者:%st日期:%s", m_ctlDataIndex.GetItemText(nIndex,0),
m_ctlDataIndex.GetItemText(nIndex,1));
int nRootTab[]={(COL_1+TABLE_LEFT_SPACE)*m_fRatioX,(PAGE_WIDTH-PAGE_RIGHT_SPACE-900)*m_fRatioY};
pDC->TabbedTextOut(TABLE_LEFT_POSITION*m_fRatioX,
(TABLE_TOP_POSITION+TABLE_ROW_NUMBER*TABLE_ROW_HEIGHT+TABLE_TOP_SPACE)*m_fRatioY,szPrint,sizeof(nRootTab),nRootTab,0);
//打印表格/////////////////////////////////////////////////////////////////////
for(nRow=0;nRow<TABLE_ROW_NUMBER+1;nRow++)
{//打印横线
pDC->MoveTo(TABLE_LEFT_POSITION*m_fRatioX,(TABLE_TOP_POSITION+nRow*TABLE_ROW_HEIGHT)*m_fRatioY);
pDC->LineTo((PAGE_WIDTH-PAGE_RIGHT_SPACE)*m_fRatioX,(TABLE_TOP_POSITION+nRow*TABLE_ROW_HEIGHT)*m_fRatioY);
}
int
nColPos[]={COL_1*m_fRatioX,COL_2*m_fRatioX,COL_3*m_fRatioX,COL_4*m_fRatioX,COL_5*m_fRatioX,COL_6*m_fRatioX,COL_END*m_fRatioX};
for(int nCol=0;nCol<sizeof(nColPos)/sizeof(int);nCol++)
{//打印竖线
pDC->MoveTo(nColPos[nCol],TABLE_TOP_POSITION*m_fRatioY);
pDC->LineTo(nColPos[nCol],(TABLE_TOP_POSITION+TABLE_ROW_NUMBER
*TABLE_ROW_HEIGHT)*m_fRatioY);
}
}
void CDataMan::OnEndPrinting(CDC *pDC, CPrintInfo *pInfo)
{
pDC->SelectObject(m_pOldFont);
pDC->SelectObject(m_pOldPen);
m_pOldFont=NULL;
m_pOldPen=NULL;
m_penTable.DeleteObject();
m_RptFont.DeleteObject();
}
35.数据库的模糊匹配问题:在数据库的模糊匹配问题上,在不同地方使用的是不同的通配符,这一定的注意,要不然在一个地方测试通过了,但是在另一个地方
却会出现无名的异常.在ACCESS里面的通配符为'*'(匹配多个字符)和'?'(匹配单个字符)。但是在ODBC中使用时,却是使用'%'(匹配多个
字符)和"_"(匹配单个字符)。我在Hatch
中使用的是CDatabase和CRrectset,里面就应该使用"%"和"_"才能正常匹配。【2005-6-28 Hatch/CData
SELECT
Name,MinPress,MaxPress,ResultName1,ResultName2,ResultName3,ResultName4,
ResultA,ResultB,ResultC,ResultD,DateStart,Operator,ExpNo,PdtNo FROM
ExpResult, ExpItem, ExpRsltInfo WHERE Name LIKE 'sd%' AND
ExpID=ExpItem.IDD AND ExpNo='sd'"
36.在使用CListCtrl时,如果要显示表格线条,只需要将其扩展属
性中加上LVS_EX_GRIDLINES即可,可以使用GetExtendedStyle()来的到现有的List属性,而使用
SetExtendedStyle()来进行设置即可.[6/30/2005]
37.在使用CListCtrl时,使用了Sort进行排序,这时
却只显示了最后的一行,其余的全部都是空行.Sort的选项有:None,Ascending和Descending.当选择为None时就正常显示,其
余的升序和降序都不能正常显示.[6/30/2005]
38.对于BSTR*类型参数的传递,在DynaGraph中的SetCaption定义如下:7/7/2005
void SetCaption(BSTR* pInfo, short nChoose);
我要调用他来进行Caption改变,但是我测试了很久都未能实现[以前成功使用过,不过太久了],而我又不想定义太多的变量来进行操作,所以问题变产生了。可行的解决方式如下[懒人方式]:
BSTR str;
str=(BSTR)m_szValue.GetBuffer(0);
m_ctlDGG.SetCaption(&str,++n);
39.字符编码转换问题.[7/13/2005 Antipush use Dynagraph.ocx]
在
进行VC
ActiveX(DynaGraph.ocx)在VB(Antipush)中使用时,出现了在ActiveX中不能正确识别所传入的字符串,究其原因,是
因为字符编码不一致所造成的.之后在VB中使用编码转换函数进行转换之后在传入ActiveX中,问题得到圆满解决.
在VB中用于编码转换的函数是:StrConv(string,conversion,LCID),conversion选择的是vbFromUnicode.
如果是要用API进行转换,可以使用MultiByteToWideChar(…),可以参看MSDN的 Unicode and Character Set Functions
如果要查看编码方面的资料,可以到http://www.paper.edu.cn/home.jsp,有一篇叫做《汉字编码及其应用的研究》的论文。
40.VB中解决传递引用(byref)空指针(NULL)的问题. [7/13/2005 Antipush use Dynagraph.ocx]
在VB
中,首先是没有指针,其次是没有真正意义上的空指针,而引用是针对传入的变量而言,而不是常数,再有就是ActiveX是没有重新声明接口的方式,故是没
有办法传递引用参数类型的ActiveX的空指针的.只有通过别的办法来进行解决,例如传递标志,特殊数字等.但是如果是API的话,可以把传引用
(byref)的声明更改为传值(byval)的声明即可以解决.
41.在VB中的几个常值:TRUE=-1;FALSE=0;vbNull=1;Null=asc.还需要注意的是,在不同语言的开发工具之间,对于数字的编码以不一定相同.(0)[7/13/2005]
42.IO输入有信号正/负之分,连接反了不能采集到信号。
一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?
当时我没答出来,后来问考官,它告诉我正解,大家下讨论一下。
设ListNode *p 指向链表某一节点
p->data = p->next->data;
ListNode *t = p->next;
p->next = p->next->next;
delete t;
题目有问题啊
如果是单循环链表就没有问题了
typedef struct linknode
{
int data;
struct linknode *next;
}node;
void del(node *p)
{
node *q;
q=p;
while(q->next!=p)
{
q=q->next;
}
q->next=p->next;
free(p);
}
//当然还有很多细节没有考虑
大概思路就是这样
void del(node *p)
{
node *q;
q=p;
while(q->next!=p)
{
q=q->next;
}
q->next=p->next;
free(p);
}
请问各位前辈
#include<iostream>
using namespace std;
void main()
{
float a = 1.0f;
cout << &a << endl;
cout << (int)&a << endl;
cout << (int&)a << endl;
cout << boolalpha << ( (int)a == (int&)a ) << endl; // 输出什么?
float b = 0.0f;
cout << (int)b << endl;
cout << (int&)b << endl;
cout << boolalpha << ( (int)b == (int&)b ) << endl; // 输出什么?
}
其中:(int&)a 与 (int)&a 有什么区别
谢谢先!!!
(int&)a == static_cast<int&>(a)
(int)&a == reinterpret_cast<int>(&a);
(int&)a 不经过转换, 直接得到a在内存单元的值
(int)a a在内存中的值转换成int类型
float类型在内存中存储的形式是 ,符号位 指数 尾数
由754标准:阶码采用增码(该数补码的反符号),尾数采用原码
所以1.0f 在内存中的形式为
0011 1111 1000 0000 0000 0000 0000 0000
所以输出的是 0x3f800000
0 在内存中的的存储形式
0000 0000 0000 0000 0000 0000 0000 0000
(int&)a 把a强制转换成整形引用类型
(int)&a 把a的地址强制转换成整型
不过最好不要(int)&a
1,把一个32位数倒置
2,输入一个数字,把这个数字变成字符型
谁能帮帮我?
我的思路是把1里面的数拆到数组里,但是好象会超过LONG 的范围
2提我不知道怎么判断我输入了多大的数啊?
32位数倒置什么意思?
是2进制位倒置还是10进制位导致?
bool itoa(int num , char* p , int leng)
{
int count = 0;
int flag = 0;
char* q;
char* ip;
if (leng == 0 || p == NULL)
return 0;
if (num < 0)
{
num =- num;
flag = 1;
count ++;
*p = '-';
}
if (num == 0)
{
*p = '0';
*(p+1)=0;
return 1;
}
while (num > 0 && leng > count)
{
*(p+count) = '0' + num%10;
num /= 10;
count ++;
}
if (num > 0) return 0;
*(p + count) = 0;
q = p + count - 1;
ip = p;
if (flag)
ip = p + 1;
while(q > ip)
{
char a = *q;
*q = *ip;
*ip = a;
q --;
ip ++;
}
return 1;
}
void main()
{
int s = -1234567890;
char a[11];
if (itoa(s,a,11))
printf("%s",a);
}
我是女生,看到有的男生想追自己喜欢的女孩子又不敢追,还想人家倒追她,我很反感.
从一个女生的角度,我比较了解女孩子的心理。女孩子大多不会主动出击,去追求自己喜欢的男孩,除了确实太喜欢了或者是那种比较有个性的勇敢的女孩子。所以,如果你很喜欢一个女孩子,并且认为她对你也有点意思,那就主动点,别跟她搞拉锯战,自己难受,说不定你喜欢的人也痛苦。
任何一个女孩子在被人追的时候,心理都是很复杂的。她也许很开心,但是又带着点惶恐,她对这个闯进自己平静的生活的男孩子,有着欲拒还迎的矛盾心理,她不是故意的。不要以为她在考验你,她其实也在和自己斗争,她怕受到伤害。
不要怕你的主动会带来她的反感,你不主动,她也不主动,也就慢慢淡下来了。如果你开始的表白被她拒绝,那也很正常呀。不要气馁,谁知道这个女孩子心里在想什么呢?
也许你再表白两次,她就会被你打动,一个心地善良的好女孩是很容易感动的。
如果你受到一次挫折,就立刻离开,再也不去答理这个女孩,把自己紧紧地保护起来,默默地舔舐伤口,在你痛苦的同时,殊不知,那个女孩子也许也正在心里遗憾、后悔呢!也许她会偷偷哭泣,后悔拒绝了你,再看到你漠然的眼神,她也很痛心,但是她却不会对你说,绝对不会请求你回来追她。你的过度的自尊心,可能会伤害了女孩子敏感的心。
她会认为你不是真诚的喜欢他,要不怎么会就这么放弃了她?
有人说,男生真难,追女孩子太不容易了。可是我的感觉却是,这种现象跟男人和女人的社会角色定位是分不开的,从生理和社会的角度,女人总是被动的。如果反过来,让男人都脉脉含羞,女人变得勇往直前,世界才乱了套呢!女人的羞涩总是美好的、动人的呀~我总是听说是某个勇敢的男人战胜了多少困难,最终获得佳人芳心。相反的例子却少得很。
有的男生,就怕别人说自己什么死缠烂打,落下不好的名声。可是我觉得男生追求自己喜欢的女孩子,受了点挫折还继续对这个女孩子好,说明人家确实很喜欢,很有诚意,如果没成功,也不遗憾,并没什么啊?谁让人家喜欢了?最讨厌别人跟着瞎掺乎,也最讨厌那种自己没主意,过于在乎别人对自己看法的男生,活该这种男生找不到女朋友。
是男人就勇敢点,女孩子本来就感性,容易沉浸在爱情里。虽然你付出了辛苦,而一旦你的真心打动了她,那么你得到的将是更多更久的加倍的爱。这样的例子,在身边比比皆是。女孩子对自己的男朋友都是很温柔很贴心的,为了换来这份甜蜜,开头的辛苦算什么啊?而且大多好女孩都爱得挺投入挺专一的。
所以,建议有的男生勇敢一点,去追求自己喜欢的女孩子,不要那么畏畏缩缩,一来是让人觉得你没男人气概,二来是你自己怪难受的,然而最最最重要的还是:最后你什么都得不到。幸福总是自己挣来的,别指望别人施舍给你!
再补充一句,我觉得主动点儿挺好的,因为你的目标是你自己真心喜欢的,女孩子往往被动,被动的只能选择接受和拒绝,所以我宁愿主动出击,爱我所爱,无怨无悔!
----- 人生很美好,快乐在其中,要学会寻找!
一、应该给MM留下什么样的第一印象(时间:刚开始接触MM)
1、我认为最关键的,是要让MM看到你的上进心。
男人的最大魅力在于事业有成,年轻人工作时间不长谈不上“有成”,这时候你就要让MM觉得你是个有上进心的人。
别的可以胡说八道,但这个问题不能含糊,你一定要告诉MM,你对未来充满信心,你不满足于现状,并且你已经有了长远的计划,总之你的未来不是梦。
2、要显得有信心、有责任心
不要像个小孩子,女孩子都很懒希望能找个依靠,你要拿出自己的信心和责任心来。
有一个错的选择总比没有选择要好的多。
3、不要太正经,但也不要太随便
该正经的地方就正经,该调侃的的时候就调侃。
女孩子都喜欢有点玩世不恭的男人,所以别显得对什么都特别在意,那样太呆板。
4、显得成熟一点
遇事镇定、从容不迫的男人对MM有致命的吸引力。
二、如何与MM展开进一步接触(时间:开始追的阶段)
1、这个阶段最关键的是不能着急,不要把事情弄的那么清楚,让人家一眼就能看出你在 追人家。
想一想,一般人都不会一眼就看上你,但也不会看一眼就讨厌你,都是老百姓家的孩子(除非你长得象周润发刘德华或者凯文科斯特纳),好感是需要随着了解的不断增加而实现的,所以问题的关键是你要得的进一步发展的机会。
站在女孩子的角度替人家想一想:你这么直接了当的冲过来要搞对象,女孩子肯定有心理压力。这要是接触一阵后发现不喜欢你,那不就成了耍你了么?所以如果你开始就摆出志在必得的姿势出来,基本上会被立刻闷回去。
2、要低姿态起步
首先要把关系定位成“朋友”,本来是“普通朋友”,你希望成为“好朋友”,有品位的还可以要求对方成为“红颜知己”什么的,总之千万不要说“追你”。
你想想,你如果根本不提“追”,那么女孩子也就更没机会“拒绝”你——你没追她怎么拒绝你?!
这样可以减轻女孩子的心理压力,使你们能顺利的交往下去。不要幻想认识三天就答应嫁给你,要充分的交往、了解,感情不是凭空产生的。
3、交往的过程中不要太急躁
要有张有弛,不要整天缠着人家,谁这样对你,你也会腻。我有个好朋友对我说,追女孩子的关键是八个字—— “忽冷忽热、欲擒故纵”(这是我同学多少年心血的结晶)。
你整天缠着人家自然不觉得你好,你适当的冷个一两天,女孩子就会想起你在的好处了。
还有就是不要拿出“非你不娶”的志气来,太掉价了不好,有时候可以耍点花招。
4、要适当的创造机会
前面说了,不要使事情立刻变成“你在追别人”,而你又需要得到接近女孩子的机会,这时就要看你的创造力了。
你可以搜集情报,想办法把守株待兔变成一场邂逅;也可以装做漫不经心的找出最最充足的理由邀请对方和你一起做什么事。
总之这个是最有技术含量的地方,实在不行可以找前辈请教。
5、切忌切忌:随便送人家礼物是不礼貌的
有些人追女孩子心切,喜欢经常买东西送人家,殊不知追女孩子最忌讳这个。
俗话说“无功不受禄”,你这样送人家东西就是在施加压力,人家会觉得欠你的,所以会 想办法还给你,如果没办法还给你就会想办法不和你交往,免得总是欠你人情。
如果你想显示自己的诚意,倒不妨请女孩子一起消费,比如说找好的餐厅吃饭,或者找贵 的地方一起玩什么的,女孩子自然能看出你花了很多钱,但钱终究是两个人一起花了而不是变成东西带回家。
三、“女朋友”到底是什么?
1、“女朋友”是一种事实,而不是一份承诺
你和女孩子开始交往,从“普通朋友”变成“好朋友”,再到“非常非常好、无话不谈的朋友”,某一个阳光灿烂的午后,你“不小心”拉了她的手;“月上柳梢头”,你突然袭击吻了她。这时她就已经是你的女朋友了,无论她是否承认,她心理已经认为你是他男朋友了。
我知道最高明的,直到上床了都没问过“你是否愿意做我女朋友”,最后还是女孩子急了 :“你怎么还不求我做你女朋友啊!”
所以说,千万不要急于把窗户纸捅破,情况越朦胧对你越有利。
2、“表白”是什么?
前面说了,表白实际上就是一个形式而已,正确的顺序应该是:事实上已经成为你女朋友 了,你才能向人家表白,水到渠成。 很多人弄不明白这个问题,总以为人家先答应做自己女朋友,然后再如何如何,我只能说非常非常“单纯”,也非常非常“愚蠢”。
3、有没有“迫不得已非表白不可”的时候?
有,比如说出现第三者,或者你和女孩子关系没有成熟但两个人可能分开一段时间。
这时候的表白就是条件不成熟的表白,风险非常大,类似于下围棋的时候形势严峻,落後的一方迫于无奈放出“胜负手”,赢了就赢了,输了也只能说“倒霉都是天生的”。
4、“爱”字不要轻易出口
经常看见论坛出现“大胆的表白”,说实话我真的认为这是非常不成熟的一种表现。“爱”是一个神圣的字,意味着追求,也意味着承诺,甚至体现出一种责任。
随便说“爱”的男人是不负责任的。
四、文明恋爱,不可强求
1、不是每个MM都能追到手的
好女孩子总会有很多人追,不可能遂了每个人的心愿,总会有失败者。举个例子,就算你刻苦钻研掌握了最搞超的追MM原理,你一样追不上TWINS里的任何一个。
换个角度考虑问题,一个小学没毕业的农村小保姆,即使对你再好,每个月赚600给你买700的礼物(透支),愿意为你“当牛做马”,你也不会爱上她。如果她每天哭哭啼啼的缠着,你肯定觉得烦。
所以说爱情是需要物质基础的,至少需要平衡。
2、追MM做是一种严肃的社会活动
千万不要把人家搞烦了,要给自己留后路。大丈夫何患无妻?有些MM确实势利眼(少数),如果不服气,你可以发愤图强,用事实证明“她当时瞎了眼”,绝对不要误人误己。
最后补充两点:
①千万不要在MM面前显得愤世嫉俗,愤世嫉俗有时候意味着“你很失败”。
编写一个C语言程序,实现父、子进程之间进行CPU的竞争与同步的过程。
可以由一个父进程创建两到三个子进程,每个进程独立完成不同的任务,如输出不同的数据等,以此来观察各进程占有CPU的情况。(可以利用wait函数来进行进程同步的控制。)
int main()
{
pid_t pid;
int i;
pid = fork();
if (pid == 0){
for (i = 0; i < 14; i++){
sleep (rand()%4);
printf("-SON-n");
}
return 0;
}
sleep (rand()%4);
printf("+FATHER+ Waiting for son's termination...n");
waitpid (pid, NULL, 0);
printf("+FATHER+ ...endedn");
return 0;
}
有1,2,....一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),使用交换,而且一次只能交换两个数.
//这是昨天在华为的面试题,楞是没做出来.
#include<stdio.h>
#include<stdlib.h>
int print( int*, int );
int swap( int&, int& );
int main()
{
int *a, n, i;
scanf( "%d", &n );
a = ( int* ) malloc ( ( n + 1 ) * sizeof( int ) );
for( i = 1; i <= n; i++ )
a[i] = i;
for( i = 1; i <= n; i++ )
swap( a[i], a[rand()%n+1] );
print( a, n );
for( i = 1; i <= n; i++ )
{
while( a[i] != i )
swap( a[i], a[a[i]] );
}
print( a, n );
return 0;
}
int swap( int &i, int &j )
{
int temp = i;
i = j;
j = temp;
return 0;
}
int print( int a[], int n )
{
int i;
for( i = 1; i <= n; i++ )
printf( "%4d", a[i] );
printf( "n" );
return 0;
}
TO:zez(思恩 闭关练功ing...) , 你的第一种算法不行吧, 第一个位置没交换好你就i++了,
象我的程序一样要加一句话才行:
int i,b;
for (i =0;i<n; i++)
{
while( a[i] != ( i + 1 ) )
{
b=a[i];
a[i]=a[a[i]-1];
a[a[i]-1]=b;
}
}
看似两重循环, 实则复杂度为O(n).
int i,b;
for i =0;i<n; i++
{
b=a[i];
a[i]=a[a[i]-1];
a[a[i]-1]=b;
}
这种方法是不行的,不信看我的测试程序
#include <stdio.h>
#include <malloc.h>
void swap(int&,int&);
int main()
{
int *a;
int n;
int i,j,b;
scanf( "%d", &n );
a = ( int* ) malloc ( ( n ) * sizeof( int ) );
for( i = 0; i <n; i++ )
a[i] = i+1;
for( i = 0; i <n; i++ )
swap( a[i], a[rand()%n] );
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("n");
for(i=0;i<n;i++)
{
//swap(a[i],a[a[i]-1]);
swap(a[i],a[a[i]-1]);
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("n");
free(a);
getchar();
return 0;
}
void swap(int& a,int& b)
{
int temp;
temp=a;
a=b;
b=temp;
}
输入 10
输出:4 8 1 2 3 10 9 7 5 6
1 7 3 4 2 6 5 8 9 10
哪位老兄再对程序该进一下,怎样才能得到准确的结果。
1.代码如下:
class A
{
};
class B
{
A a;
};
A和B的关系是
A。继承(Inheritance)
B.聚合(Aggreation)/组合( Composition)
C.引用(Reference)
D.单件(Singleton)
2.有代码如下
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define NULL 0
void AppendNode(int **ppNode,int nCount,int nValue)
{
if( ppNode != NULL )
{
*ppNode = (int *) realloc(*ppNode,(nCount+1)*sizeof(int));
(*ppNode)[nCount] = nValue;
}
}
int main()
{
int NodeArray[5] = {1,2,3,4,5};
int **ppNode;
*ppNode = NodeArray;
AppendNode(ppNode,5,4);
return 0;
}
请问程序中是否有错误
A。有错误数组操作越界
B。有错误有内存泄露
C。有错误用堆内存分配函数操作栈上内存
D。没有错误
3。某模块提供了如下的接口
class CDataOperator
{
public:
virtual void function(int data) = 0;
};
class CData
{
private:
int m_data[100];
public:
...
void Apply(CDataOperator &opt);
};
void CData::Apply(CDataoperator &opt)
{
for( int k = 0; k < 100; k++)
{
opt.function(m_data[k]);
}
}
请编写一个函数DataSum,返回其参数data对象的成员变量m_data中所有元素的和。
int DataSum(CData &data);
class CDataSumOperator : public CDataOperator{
public :
int he;
CDataSumOperator(): he(0){}
void function(int data){
he += data;
}
};
int DataSum(CData &data)
{
CDataSumOperator temp;
data.Apply(temp);
return temp.he;
}
在数据库中有10000条记录,每次提取100条,应该怎么写?
不同数据库不同,
mysql ,postgres用的是limit,
oracle, db2用的是rownum函数,
sql server就惨了,只能 top ... not in top..
oracle:取100 - 200
slect * from
(
select * from table where rownum<=200
) where rownum>=100
select top 100 * from Users
一道华为公司的面试题目.怎么把字符串转化为字节数组?
比如 CString *str="ABCD";(长度不确定的字符串) (VC中)
或
char *str="ABCD";(长度不确定的字符串) (C语言中)
变为 byte DATA[4]; (要求字节数组长度应和字符串一致)
DATA[0]='A';
DATA[1]='B';
DATA[2]='C';
DATA[3]='D';
char *str='ABCD',*p=str;
byte *b = (byte *) malloc(strlen(str)),*c=b;
while (*p) *c++=*p++;
// ssh.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream.h>
#define N 6
int main(int argc, char* argv[])
{
char *p="abcde";
char array[N];
for(int i=0;i<N;i++)
{
array[i]=*p;
p++;
}
cout<<p-6<<endl;
cout<<array<<endl;
return 0;
}
#include <iostream>
using namespace std;
char OneChar(const char* pChar = 0)
{
static const char* psChar;
if(NULL != pChar)
{
psChar = pChar;
return *psChar;
}
if('' != *psChar)
{
return *psChar++;
}
else
{
return 0;
}
}
const char* pChar = "ABCD" ;
void main()
{
int i = 0;
char Data[4];
char c;
OneChar(pChar);
while((c = OneChar()) != 0)
{
Data[i++] = c;
}
}
//动态字符维数
#include <iostream>
using namespace std;
char OneChar(const char* pChar = 0)
{
static const char* psChar;
if(NULL != pChar)
{
psChar = pChar;
return *psChar;
}
if('' != *psChar)
{
return *psChar++;
}
else
{
return 0;
}
}
const char* pChar = "ABCDE" ;
void main()
{
int i = 0;
char *pData = new char[strlen(pChar)];
char c;
OneChar(pChar);
while((c = OneChar()) != 0)
{
pData[i++] = c;
}
for(i = 0; i < strlen(pChar); i++)
cout << pData[i] << endl;
}
#include <iostream>
using namespace std;
void main()
{
char* pChar = "ABCDE";
char* pData = new char[strlen(pChar) + 1];
int i = 0;
while(*pChar != '')
{
pData[i++] = *pChar;
cout << *pChar << endl;
pChar++;
}
}
class StringBuf
{
StringBuffer x,y;
public StringBuf()
{
x=new StringBuffer("A");
y=new StringBuffer("B");
append(x,y);
System.out.println("x>> "+x+" y>> "+y);
}
void append(StringBuffer x,StringBuffer y)
{
x=x.append(y);
y=x;
}
public static void main(String[] args)
{
StringBuf str=new StringBuf();
}
}
我对这个题目不是搞得很清楚.可以给我说说吗.
为什么会输出 x>>AB y>>B
谢谢了!
x=new StringBuffer("A");
y=new StringBuffer("B");
起初x=A,y=B
append(x,y);
执行append(x,y)后
y被加到x后面
x变成AB
因为函数是传值调用,append(StringBuffer x,StringBuffer y)里的y不是构造的y
所以构造函数里的y没变,还是B
改变参数引用值是没用的.只有改变参数引用所对应的对象才会起作用.
可以这么理解
张三和李四都是人名
a(张三,李四)
{
张三赚500块;
李四=张三;//在局部范围内,李四和张三都成了张三的名字
//想得到原李四,在这个局部范围再也找不着了.
}
调用完a后,回到大范围,李四还是原来的李四,张三还是原来的张三.
class A
{
StringBuffer x,y;
public A()
{
x=new StringBuffer("AA");
y=new StringBuffer("BB");
foo(x,y);
System.out.println("x>> "+x+" y>> "+y);
}
void foo(StringBuffer a,StringBuffer b)
{
/*a= */ a.append(b);
b=a;
}
public static void main(String[] args)
{
A str=new A();
}
}
这样就清楚了。
void append(StringBuffer x,StringBuffer y){//x,y局部变量
x=x.append(y);//x(成员)=x(局部变量).append(y(局部变量))
y=x;//y(局部变量)=x(局部变量)
}
明白了,那两个x,y参数真是糊弄人的!
改成a,b就清楚了
可以这么看
在foo中,定义了两个引用a和b,a和x同时指向一个StringBuffer,b和y同时指向一个StringBuffer,a.append(b)将a和x指向的对象修改了,所以显示出来x就也变化了,这里操纵的是指向的对象。
b指向了a所指向的对象,但y仍然指向原来的对象,这里改变的是应用本身。
在b=a;后面加上System.out.println(b.toString());就更明显了
void append(StringBuffer x,StringBuffer y){//x,y局部变量
x=x.append(y);//x(局部变量)=x(成员).append(y(局部变量))
y=x;//y(局部变量)=x(局部变量)
}
对于这个你只要把StringBuffer类型 理解为String 类型就可以了,其实两种类型是用在字符串变量中,只是StringBuffer用在多操作的字符串
StringBuffer在堆内存中只有1份
void append(StringBuffer x,StringBuffer c){//x,c栈变量(就是引用)
c.append(x);System.out.println(c);//append使栈变量c指向堆中的值发生改变
x.append(c);System.out.println(x);
System.out.println(x);
c=x;System.out.println(c);//引用指向改变
}
************ 下文(转载)能很好地解答这问题 ************
在不同的java新闻组中,参数是传值还是传址一直是一个经常被争辩的话题。误解的中心是以下两个事实:
对象是传引用的
参数是传值的
这两个能够同时成立吗?一个字:是!在java中,你从来没有传递对象,你传递的仅仅是对象的引用!一句话,java是传引用的。然而,当你传递一个参数,那么只有一种参数传递机制:传值!
通常,当程序员讨论传值和传引用时,他们是指语言的参数传递机制,c++同时支持这两种机制,因此,以前使用过c++的程序员开始好像不能确定的java是如何传参数的。java语言为了事情变得简单只支持参数传值的机制。
java中的变量有两种类型:引用类型和原始类型。当他们被作为参数传递给方法时,他们都是传值的。这是一个非常重要的差别,下面的代码范例将说明这一点。在继续前,我们有必要定义一下传值和传引用。
传值意味着当参数被传递给一个方法或者函数时,方法或者函数接收到的是原始值的副本。因此,如果方法或者函数修改了参数,受影响的只是副本,原始值保持不变。
关于java中的参数传递的混乱是因为很多java程序员是从c++转变过来的。c++有引用和非引用类型的变量,并且分别是通过传引用和传值得。java语言有原始类型和对象引用,那么,按照逻辑,java对于原始类型使用传值而对引用是传引用的,就像c++一样。毕竟,你会想到如果你正在传递一个引用,那么它一定是传引用的。这是一个很诱惑人的想法,但是是错误的!
在c++和java中,当函数的参数不是引用时,你传递的是值得副本(传值)。但是对于引用类型就不同了。在c++中,当参数是引用类型,你传递的是引用或者内存地址(传引用),而在java中,传递一个引用类型的参数的结果只是传递引用的副本(传值)而非引用自身。
这是一个非常重要的区别!java不考虑参数的类型,一律传递参数的副本。仍然不信?如果java中是传引用,那么下面的范例中的swap方法将交换他们的参数。因为是传值,因此这个方法不是像期望的那样正常工作。
class Swap{
public static void main(String args[]) {
Integer a, b;
int i,j;
a = new Integer(10);
b = new Integer(50);
i= 5;
j = 9;
System.out.println("Before Swap, a is " + a);
System.out.println("Before Swap, b is " + b);
swap(a, b);
System.out.println("After Swap a is " + a);
System.out.println("After Swap b is " + b);
System.out.println("Before Swap i is " + i);
System.out.println("Before Swap j is " + j);
swap(i,j);
System.out.println("After Swap i is " + i);
System.out.println("After Swap j is " + j);
}
public static void swap(Integer ia, Integer ib){
Integer temp = ia;
ia = ib;
ib = temp;
}
public static void swap(int li, int lj) {
int temp = li;
li = lj;
lj = temp;
}
}
上面程序的输出是:
Before Swap, a is 10
Before Swap, b is 50
After Swap a is 10
After Swap b is 50
Before Swap i is 5
Before Swap j is 9
After Swap i is 5
After Swap j is 9
因为swap方法接收到的是引用参数的副本(传值),对他们的修改不会反射到调用代码。
译者注:在传递引用和原始类型时还是有不同的,考虑以下的代码:
class Change{
public static void main(String args[]) {
StringBuffer a=new StringBuffer("ok");
int i;
i = 5;
System.out.println("Before change, a is " + a);
change(a);
System.out.println("After change a is " + a);
System.out.println("Before change i is " + i);
change(i);
System.out.println("After change i is " + i);
}
public static void change(StringBuffer ia){
ia.append(" ok?");
}
public static void change(int li) {
li = 10;
}
}
程序的输出为:
Before change, a is ok
After change a is ok ok?
Before change i is 5
After change i is 5
即如果传递的是引用,那么可以修改引用对象的内容,这个改变会影响到原来的对象,而传递的如果是原始类型则不会有影响。这个也是造成误解的原因之一吧。
在最上面的程序当中,
operate()中的操作x.append(y),实际上是改变了x引用的内容,由于a跟x引用同一个对象,所以a的引用也会随之改变
而y=x只是改变operate()中y的引用,这个是局部的,不会影响到main()中b的引用
所以结果是AB,B
java中基本类型是传值调用,即先把值copy一份,是把这个copy的值传给形参;所以改变的是copy的值;
对象是传址调用,就是把对象的地址再copy一份,传给形参,copy后的值和被copy的值指向同一个对象,这样通过引用修改对象影响到对象的变化,但是修改copy后的指向不影响原对象的引用
画个草图看看就很清晰了
#include "iostream.h"
void main()
{
char (*a)[5];
char (*b)[5];
a = new char[2][5];
b=a;
char c[5]="1234";
*b =c;printf("%sn",b);//不能编译通过?
b=&c;printf("%sn",b);//能编译通过 *b=c不就是*b=c吗?
delete []a;
}
c类型是char
&c类型是char[5]
原因是数组,*b是一个地址的值,而c是一个数组。应该用地址方式赋值也就是 b = &c 应该也可以这样 b = c!
*b 是一个char[5]类型的数组,但是数组是不能作为左值的
b是一个char[5]类型的指针,指针可以作为左值
*b 是一个char[5]类型的数组,但是数组是不能作为左值的
b是一个char[5]类型的指针,指针可以作为左值.
b 是一个指针,它指向的是一个char[5]类型的数组,是一个左值。
但*b就是一个右值了。
今天参加了慧通的面试,笔试过了
一面时问了很多,把不理解的贴出来,请大家讲讲
什么是预编译
char * const p;
char const * p
const char *p
上述三个有什么区别?
全局变量存放在什么地方?
两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串
void insert(char *s, char *t, int i);
预编译:前边都有#,是编译之前的处理
char * const p;
char const * p
const char *p
后两者相同,指针可以改变,p++合法,而第一中是内容可变,(*p)++合法
全局变量?不知道
void insert(char *s, char *t, int i)
{
int j;
int ns = 0;
int nt = 0;
while ( *s++ )
ns++;
s = s - ns -1;
while ( *t++ )
nt++;
t = t - nt -1;
for ( j=i;j<ns;j++)
s[j+nt]=s[j];
for ( j=i;j<nt+i;j++)
s[j] = t[j-i];
}
1.
c编译系统在对程序进行通常的编译之前,先进行预处理。c提供的预处理功能主要有以下三种:1)宏定义 2)文件包含 3)条件编译
1. 宏定义
不带参数的宏定义
用一个指定的标识符来代表一个字符串,形式:#define 标识符 字符串
几点说明:
1) 宏名一般用大写
2) 宏定义不作语法检查,只有在编译被宏展开后的源程序时才会报错
3) 宏定义不是c语句,不在行末加分号
4) 宏名有效范围为定义到本源文件结束
5) 可以用#undef命令终止宏定义的作用域
6) 在宏定义时,可以引用已定义的宏名
带参数的宏定义
定义形式:#define 宏名(参数表) 字符串
这和函数有些类似,但他们是不同的:
1) 函数调用时,先求实参表达式值,再代入形参,而宏只是简单替换,并不求值
2) 函数调用是在程序运行时分配内存的,而宏展开时并不分配内存,也没有返回值的概念
3) 对函数中的实参和形参都要定义类型,而且要求一致,宏名无类型,其参数也没有类型。
4) 函数只有一个返回值,而宏可以得到几个结果
5) 宏替换不占运行时间,只占编译时间,而函数调用占运行时间
2. 文件包含处理
#include "文件1" 就是将文件1的全部内容复制插入到#include位置,作为一个源文件进行编译。
在#include命令中,文件名可以用" "也可以用< >,假如现在file1.c中包含file2.h文件," "表示系统先在file1.c所在目录中找file2.h,如果找不到,再按系统指定的标准方式检索目录,< >表示系统直接按指定的标准方式检索目录。所以用" "保险一点。
3. 条件编译
条件编译指不对整个程序都编译,而是编译满足条件的那部分。条件编译有以下几种形式:
1)#ifdef 标识符
程序段1
#else
程序段2
#endif
它的作用:当标识符在前面已经被定义过(一般用#define),则对程序段1编译,否则对程序段2编译。
2)#ifndef 标识符
程序段1
#else
程序段2
#endif
它的作用和#ifdef相反,当标识符没被定义过,对程序段1编译,否则对程序段2编译。
3)#if 表达式
程序段1
#else
程序段2
#endif
它的作用:当表达式值为真(非0)时,对程序段1编译,否则对程序段2编译。
char * const p; 固定 指针的 指向
const char * p; 固定 指针指向的 数值!
“前固数,后固址”
char * const p; //常量指针,p的值不可以修改
char const * p;//指向常量的指针,指向的常量值不可以改
const char *p; //和char const *p
char * const p; //常指针,是指把指针本身而不是把它指向的对象声明为常量
char const * p //指向常量的指针
const char *p //同char const *p
char * const p; //指向字符常量的指针
char const * p //指向字符的常量指针
const char *p //同上
全局变量放在静态存储区
void insert(char *s, char *t, int i)
{
int j;
int ns = 0;
int nt = 0;
while ( *s++ )
ns++;
s = s - ns -1;
while ( *t++ )
nt++;
t = t - nt -1;
for ( j=i;j<ns;j++)
s[j+nt]=s[j];
for ( j=i;j<nt+i;j++)
s[j] = t[j-i];
}
这个程序实现好像有问题啊,谁能把这个程序给改进一下呢?
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void insert(char *s, char *t, int i)
{
int len = strlen(s)-i;
int tlen = strlen(t);
// memmove(s+i+tlen, s+i, len+1); // 加1的目的是将''也拷贝
// memmove(s+i, t, tlen);
// return;
int j;
char* psrc = s + i + len - 1;
char* pdes = psrc + tlen;
if (len < 0)
return;
*(pdes+1) = 0;
for (j = len; j > 0; j--, pdes--, psrc--) // 后移
*pdes = *psrc;
pdes = s + i;
for (j = 0; j < tlen; j++, pdes++, t++) // 插入
*pdes = *t;
}
void main(int argv, char* argc[])
{
char buffer[1000];
if (argv < 4)
{
printf("Usage f str str2 posn");
return;
}
strcpy(buffer, argc[1]);
insert(buffer, argc[2], atoi(argc[3]) );
printf("!%s!n", buffer);
}
1。请大概描述一下Vector和ArrayList的区别,Hashtable和HashMap的区别。(5)
2。请问你在什么情况下会在你的JAVA代码中使用可序列化?(5)
为什么放到HttpSession中的对象必须要是可序列化的?(5)
3。为什么在重写了equals()方法之后也必须重写hashCode()方法?(10)
4。sleep()和wait()有什么区别?(10)
5。编程题:用最有效率的方法算出2乘以17等于多少?(5)
6。JAVA是不是没有内存泄漏问题?看下面的代码片段,并指出这些代码隐藏的问题。(10)
...
Object[] elements = new Object[10];
int size;
...
public Object pop() {
if (size == 0)
return null;
Object o = elements[--size];
return o;
}
7。请阐述一下你对JAVA多线程中“锁”的概念的理解。(10)
8。所有的递归实现都可以用循环的方式实现,请描述一下这两种实现方式各自的优劣。
并举例说明在什么情况下可以使用递归,而在什么情况下只能使用循环而不能使用递归?(5)
9。请简要讲一下你对测试驱动开发(TDD)的认识。(10)
10。请阐述一下你对“面向接口编程”的理解。(10)
11。在J2EE中有一个“容器(Container)”的概念,不管是EJB、PICO还是Spring都有他们
各自实现的容器,受容器管理的组件会具有有生命周期的特性,请问,为什么需要容器?
它的好处在哪里?它会带来什么样的问题?(15)
12。请阐述一下你对IOC(Inversion of Control)的理解。(可以以PICO和Spring的IOC作为例子说明他们在实现上各自的特点)(10)
13。下面的代码在绝大部分时间内都运行得很正常,请问在什么情况下会出现问题?问题的根源在哪里?(10)
import java.util.LinkedList;
public class Stack {
LinkedList list = new LinkedList();
public synchronized void push(Object x) {
synchronized(list) {
list.addLast( x );
notify();
}
}
public synchronized Object pop()
throws Exception {
synchronized(list) {
if( list.size() <= 0 ) {
wait();
}
return list.removeLast();
}
}
}
你拿了多少分?
11。在J2EE中有一个“容器(Container)”的概念,不管是EJB、PICO还是Spring都有他们
各自实现的容器,受容器管理的组件会具有有生命周期的特性,请问,为什么需要容器?
它的好处在哪里?它会带来什么样的问题?(15)
-------------这个问题也觉得有点傻,比如web container,你说你为什么需要它呢?没有它,还做什么J2EE啊,有些容器对于J2EE是必需的吧?
1>这个讨论的很多了.主要是线程安全,性能上面
2>a 将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;
b 对象进行反序列化时,将创建出与原对象完全相同的副本。
c>httpSession是一个处于网络上的存储的一个映象的集合,存贮了用户会话的信息
3> java.lang.Object中定义!我自己的理解的是hashCode()是对象的内存地址派生而来的,在集合框家Map也是基于hashCode();
4> sleep(int i)是线程的方法,是让cpu交出的线程使用权限一定时间(i毫秒),采用"时间片乱转法".
wait 是OBJECT的方法,才用琐的机制,让正在使用它的线呈停住!等待别的对象调用notifyAll()的方法释放锁!
5>c语言的问提 无非是在完2进制的左翼还是右移的问题(高汇编的同志因该很厉害!)
6>int size;注意如果初试画为负数 该为public Object pop() {
if (size <= 0)
return null;
Object o = elements[--size];
return o;
}
7>才用同步标志位,解决锁的问题....(说起来的东西很多 ,主要了解 同步方法,同步快,wait...)
8>"所有的递归实现都可以用循环的方式实现"这话绝对有问题.
循环是才用的是内存块里,低归需要一定量寻址过程.效率是循环高!质量是低归高!
9>不是所云
10>1封装,2隐常实现3,重用.易于组建的扩展
11>容器即中间件! 容器实现的J2EE中的web,ejb的矿家,其主件在各自受管理的平台下基于多线呈的组件的重用实现~~!是开发者从大量的开发中解脱出来!
特点:安全,易于扩展,企业的负载平衡,提供了大量的组件(jndi,datasource,jms,servlet,ldap,jts...).
问题:
...不知道!
12>spring了解 PICO不懂为和物!?
13>问题是在当调用wait()以后,notify()不能换醒自己的线程@!!!!
13。下面的代码在绝大部分时间内都运行得很正常,请问在什么情况下会出现问题?问题的根源在哪里?(10)
答:
有一点需要注意的是,我们应该让需要Obj.wait的线程先启动。因为执行顺序是需要Obj.wait()的线程a先启动,然后它运行到Obj.wait()的时候,进入搁置状态,让其他线程先执行。于是带用Obj.notify()的线程b开始执行了,一直到b执行到了Obj.notify()以后(Obj.notify()实际上就是通知因为Obj.wait()被搁置的线程:"轮到你了"),b被搁置,然后继续做a的Obj.wait()以后的内容.
所以我们假如让带有Obj.notify()的线程b先运行的话,那么b执行完毕以后,b执行的Obj.notify()没有找到任何在因Obj.wait()而进入搁置状态的线程.然后开始做带有Obj.wait()的线程a的话.a运行到了Obj.wait()就进入搁置状态,等待另外一个线程中的Obj.notify()来唤醒它,不过可惜它永远也等不到了,因为带有Obj.notify()的线程已经到搁置的线程中来找过它一次,很可惜的是没找到.于是线程a就一直搁置
1,同步与不同步
2,会在保存状态信息的时候,比如图形界面中保存状态信息的时候用,
好象没有这样吧(可能是有的服务器要求这样吧),反正我用TOMCAT的时候没有这样.不一定非要把数据钝化到硬盘上.
3,这个好象没有什么规定吧,我觉得更应该是个编程习惯.如过我重载了equals,不重载hashCode程序也能运行,只不过不能用map了 .不过一般都会一起重载
4,sleep 程序暂停一段时间(不释放锁),如果CPU空闲将运行程序.wait()必须在对象的同步块中执行(释放同步锁),她必须由notify(),notifyAll()唤起,wait(long mill)就不说了
5,上面都说了其实我觉得考这个好象没什么必要
6,有程序有,public Object pop() {
if (size == 0)
return null;
--size;
Object o = element[size];//加上elements[size]==null;出了栈的对象设为null
return o;
}
7, 是多线程程序同步与互斥,同一时间只有一个线程可以访问锁资源
8,懒得打字了
9,不知道
10,面向接口(1,2 句话说不清楚,反正好处是太多了)
11,容器,(所谓的中间件)屏蔽了复杂的网络,多线程,对象的创建与销毁,事物,还有可以用到集群哦,好处太多了
12,IOC(所谓的依赖注射模式)SPING不了解,可以配制的程序吧,我觉得可以适当的用不能滥用
13,这个是JDK设计的问题,应该用组合来实现,不应该用继承,如果我调用它继承下来的add(),get()方法就会有问题
你们公司技术不错啊.
。为什么在重写了equals()方法之后也必须重写hashCode()方法?(10)
请解释!
在TIJ上也有这样的题目,不知道为社么?
4。sleep()和wait()有什么区别?(10)
sleep()好象是线程仍然持有对象的所有权。
wait()则是释放了锁定。
1。请大概描述一下Vector和ArrayList的区别,Hashtable和HashMap的区别。(5)
Vector有互斥,而ArrayList没有。?
8。所有的递归实现都可以用循环的方式实现,请描述一下这两种实现方式各自的优劣。
并举例说明在什么情况下可以使用递归,而在什么情况下只能使用循环而不能使用递归?(5)
递归在运行速度上不如循环。不知道?
第一,谈谈final, finally, finalize的区别。
final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。
finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。
第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统)。
Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: www.frontfree.netarticlesservicesview.asp?id=704&page=1
注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象
第四,&和&&的区别。
&是位运算符。&&是布尔逻辑运算符。
第五,HashMap和Hashtable的区别。
都属于Map接口的类,实现了将惟一键映射到特定的值上。
HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。
第六,Collection 和 Collections的区别。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。
第七,什么时候用assert。
断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为 true。如果表达式计算为 false,那么系统会报告一个 AssertionError。它用于调试目的:
assert(a 0); throws an AssertionError if a = 0
断言可以有两种形式:
assert Expression1 ;
assert Expression1 Expression2 ;
Expression1 应该总是产生一个布尔值。
Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。
断言在默认情况下是禁用的。要在编译时启用断言,需要使用 source 1.4 标记:
javac -source 1.4 Test.java
要在运行时启用断言,可使用 -enableassertions 或者 -ea 标记。
要在运行时选择禁用断言,可使用 -da 或者 -disableassertions 标记。
要系统类中启用断言,可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。
可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。
第八,GC是什么 为什么要有GC (基础)。
GC是垃圾收集器。Java 程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
第九,String s = new String(xyz);创建了几个String Object
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
第十,Math.round(11.5)等於多少 Math.round(-11.5)等於多少
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;
第十一,short s1 = 1; s1 = s1 + 1;有什么错 short s1 = 1; s1 += 1;有什么错
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。
第十二,sleep() 和 wait() 有什么区别 搞线程的最爱
sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级,(b)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
第十三,Java有没有goto
Gotojava中的保留字,现在没有在java中使用。
第十四,数组有没有length()这个方法 String有没有length()这个方法?
数组没有length()这个方法,有length的属性。
String有有length()这个方法。
第十五,Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
第十六,Set里的元素是不能重复的,那么用什么方法来区分重复与否呢 是用==还是equals() 它们有何区别
Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。
第十七,给我一个你最常见到的runtime exception。
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException,
ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
第十八,error和exception有什么区别
error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
第十九,List, Set, Map是否继承自Collection接口
List,Set是
Map不是
第二十,abstract class和interface有什么区别
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
第二十一,abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized
都不能
第二十二,接口是否可继承接口 抽象类是否可实现(implements)接口 抽象类是否可继承实体类(concrete class)
接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
第二十三,启动一个线程是用run()还是start()
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
第二十四,构造器Constructor是否可被override
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
第二十五,是否可以继承String类
String类是final类故不可以继承。
第二十六,当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
不能,一个对象的一个synchronized方法只能由一个线程访问。
第二十七,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后
会执行,在return前执行。
第二十八,编程题 用最有效率的方法算出2乘以8等於几
有C背景的程序员特别喜欢问这种问题。
2 3
第二十九,两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对
不对,有相同的hash code。
第三十,当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递
是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
switch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。
第三十二,编程题 写一个Singleton出来。
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
一般Singleton模式通常有几种种形式
第一种形式 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。
public class Singleton {
private Singleton(){}
在自己内部定义自己一个实例,是不是很奇怪?
注意这是private 只供内部调用
private static Singleton instance = new Singleton();
这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
使用时生成实例,提高了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其他形式
定义一个类,它的构造函数为private的,所有方法为static的。
一般认为第一种形式要更加安全些
第三十三 Hashtable和HashMap
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许
还有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。
Hashtable和HashMap采用的hashrehash算法都大概一样,所以性能不会有很大的差异。
定义两个指针,一前一后,同时移动,前面的移动比后面的慢,如果是循环的则后面的肯定会追上前面的
bool CircleInList(Link* pHead)
{
if(pHead == NULL || pHead->next == NULL)//无节点或只有一个节点并且无自环
{
return (false);
}
if(pHead->next == pHead)//自环
{
return (true);
}
Link *pTemp1 = pHead;//step 1
Link *pTemp = pHead->next;//step 2
while(pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL)
{
pTemp1 = pTemp1->next;
pTemp = pTemp->next->next;
}
if(pTemp == pTemp1)
{
return (true);
}
return (false);
}
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
int *ptr=(int *)(&a+1); //指向整个数组末尾
int *ptr=(int *)(a+1); //指向a的下一个元素
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
cout<<*(a+1)<<endl; output:2 没有什么费话~
cout<<*(ptr-1)<<endl; output :5
因为 int *ptr=(int *)(&a+1);
这里是(&a +1) 而非 a+1
&a的类型是数组,所以加1的话,系统会认为加一个a数组的偏移,即5个int
&a+1就是首地址+1
主要是(int*)做了操作,具体什么操作也不是很了解。等高手回答。
如果
&a0x0012ff6c ""
则
&a+10x0012ff6d ""
这里
int *ptr=(int *)(&a+1);
ptr的地址和(&a +1)的地址并不相同
等待高手回答(int *)做了什么操作
&a[0] 才是首地址。
&a是指向首地址的指针。
事实证明:
*(a+1)就是a[1],*(ptr-1)就是a[4]
执行结果是2,5
&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)
,&a可以认为是整个数组的地址,因此不能单纯的用首地址+1。
1.int * 是强制转换为int型指针。
2.对于int a[5]={1,2,3,4,5};a就是数组首地址。a+1是首地址+1. a 等价于&a[0].
3. &a不是首地址,可以看作是整个数组的指针。&a+1是 a[5]后面的地址.
&a+1≠a+1
废话少说;接:2,5
int a[5]={1,2,3,4,5};
//
// &a 指向是 a[5]的类型, &a + 1指向下一个a[5]类型,等同于指向第6(索引为5)个int
// int *ptr = (int*)(&a + 1) 强制转换指针为int*
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1)); //ptr - 1 指向上一个int,即索引号为4的整数
int *ptr=(int *)(&a+1);
则ptr实际是&(a[5]),也就是a+5
原因如下:
&a是数组指针,其类型为 int (*)[5];
而指针加1要根据指针类型加上一定的值,
不同类型的指针+1之后增加的大小不同
a是长度为5的int数组指针,所以要加 5*sizeof(int)
所以ptr实际是a[5]
但是prt与(&a+1)类型是不一样的(这点很重要)
所以prt-1只会减去sizeof(int*)
int *ptr=(int *)(&a);
0040105B lea eax,[ebp-14h] ;a[0]的地址
0040105E mov dword ptr [ebp-18h],eax
int *ptr=(int *)(&a+1);
0040105B lea eax,[ebp] ;这里比上边增加了14h,即20个字节
0040105E mov dword ptr [ebp-18h],eax
&a是数组指针,其类型为 int (*)[5];
同意,谭浩强的c语言编程里讲的很清楚!
1.全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?
2.请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?
3.请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用? TCP与UDP呢?
4.以下代码有什么问题?
struct Test
{
Test( int ) {}
Test() {}
void fun() {}
};
void main( void )
{
Test a(1);
a.fun();
Test b();
b.fun();
}
5.写一个函数,将其中的t都转换成4个空格。
都是华为的老题
1、全局变量是整个程序都可访问的变量,谁都可以访问,生存期在整个程序从运行到结束(在程序结束时所占内存释放),而局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束(函数调用完毕),局部变量消失,所占据的内存释放。
全局变量分配在全局数据段并且在程序开始运行的时候被加载. 局部变量则分配在堆栈里面。
2、交换机用在局域网中,交换机通过纪录局域网内各节点机器的MAC地质(物理地址)就可以实现传递报文,无需看报文中的IP地质。路由器识别不同网络的方法是通过识别不同网络的网络ID号(IP地址的高端部分)进行的,所以为了保证路由成功,每个网络都必须有一个唯一的网络编号。路由器通过察看报文中IP地址,来决定路径,向那个子网(下一跳)路由,也就是说交换机工作在数据链路层看MAC地址,路由器工作在网际层看IP地质
但是由于现在网络设备的发展,很多设备既有交换机的功能有由路由器的功能(交换试路由器)使得两者界限越来越模糊。
3、IP协议是网络层的协议,它实现了Internet中自动路由的功能,即寻径的功能,TCP协议是一个传输性的协议它向下屏蔽了IP协议不可靠传输的特性,向上提供一个可靠的点到点的传输,UDP提供的是一种无连接的服务,主要考虑到很多应用不需要可靠的连接,但需要快速的传输
4、
Test b();//定义了一个函数
Given the following,
1.class X2{
2. public X2 x;
3. public static void main(String[] args){
4. X2 x2=new X2();
5. X2 x3=new X2();
6. x2.x=x3;
7. x3.x=x2;
8. x2=new X2();
9. x3=x2;
10. doComplexStuff();
11.}
12.}
after line 9 runs,how many objects are eligible for garbage collection?
A.0 B.1 C.2 D.3 E.4
8. x2=new X2();
9. x3=x2;
这时只有第8行的这个new X2对象被引用,所以不被回收,其余的第4,5 行的对象new X2()没有被引用所以被垃圾回收,所以我认为是2个。
我觉得是2。
到第9行时,
4. X2 x2=new X2();
5. X2 x3=new X2();
可以回收,而9. x3=x2;则是
x3、x2共同指向8.x2=new X2();创建的对象。
所以是2。
应该是2.
为什么楼上的感觉是 3 个呢?我感觉不出来3 个。
创建了3个对象,2个成为了垃圾。8、9行的代码说明有两个引用指向对象3#。
public class GcTest {
public GcTest g;
public static void main(String[] args) {
GcTest x2 = new GcTest();
GcTest x3 = new GcTest();
x2.g = x3;
x3.g = x2;
x2 = new GcTest();
x3=x2;
System.gc();
}
@Override
protected void finalize() throws Throwable {
System.out.println("clear");
}
}
测试了一下,输出2次clear
To gemouzhi:没感觉、感觉不出来?不要这样说。
既然有2个人说3,就想听听为什么。
测试的代码,上面 simbas00给了。
To sussman:我的详细的解释。
这个题糊弄人的地方,在
2. public X2 x;
因此,要清楚引用变量(或者叫句柄)和对象是不同的两个东西。句柄将持有对象的ref,它不是对象。有几个句柄?4个,x2、x3、x2.x和x3.x,程序中有几个对象?数new出现的次数(Class的那个方法这里不考虑)。3个。
垃圾对象是引用全部失效的对象,
6. x2.x=x3;
7. x3.x=x2;
说明,对象1#和2#的引用曾经被x3.x和x2.x持有,当
8. x2=new X2();
9. x3=x2;
8后,x2.x为null,9之后,x3.x为null。因此
对象1#和2#成为垃圾。
而对象3#有句柄x2和x3持有。
x2其成员变量x的内存分配,一定在heap中。
恩,我到希望是这样,因为这样更好叫我理解,但对象的成员变量分配在heap上,你有根据吗?
有的话,给你加100分。
x2指向的对象是新对象,但是这个时候并没有进行gc,所以x2原来指向的堆上的对象还是存活的
而且我按simbas00给的代码打出x2.x都是@9664a1。这些都是小问题。
对象的成员变量分配在heap上,我还真没弄明白,你先找些根据。
这个GcTest 也是对象吧GcTest x2是她的成员吧,你的意思是x2也分配在heap上?
public class GcTest {
public GcTest g;
public static void main(String[] args) {
GcTest x2 = new GcTest();
GcTest x3 = new GcTest();
x2.g = x3;
x3.g = x2;
的代码可能有问题。
public class A {
public A g;
public static void main(String[] args) {
A x2 = new A();
System.out.println(x2.g);
A x3 = new A();
x2.g = x3;System.out.println(x2.g);
x3.g = x2;
x2 = new A();System.out.println(x2.g);
x3=x2;
System.gc();
}
@Override
protected void finalize() throws Throwable {
System.out.println("clear");
}
}
null
A@11b86e7
null
clear
clear
1.class X2{
2. public X2 x;//这个是X2的成员变量,内存组织描述在field_info里,
3. public static void main(String[] args){//主方法
4. X2 x2=new X2();//x2是X2的局部变量,分配在栈上,只是一个ref,他指向一个在heap上分配的内存new X2();,这个好象是16K,这个new X2();中的x的成员变量是和这个对象的生命周期是一样的.因为我还再查关于成员变量堆内存的组织形式.
5. X2 x3=new X2();//x3同x2
6. x2.x=x3;//这里用x2的x成员变量指向了x3也同时指向的 在heap上分配的new X2();
7. x3.x=x2;//这里用x3的x成员变量指向了x2也同时指向的 在heap上分配的new X2();
8. x2=new X2();//这里x2在栈中新指向了另一个new X2();而原来的她所指向的那个对象只有x3的x作为她的ref,到这里我认为还没有任何的垃圾.
9. x3=x2;//这步才是产生垃圾最重要的那部分,因为x3指向了新的对象,也就是说没有任何栈上的指针指向最初分配的那两个对象了.就相当于两个内存的heap上的内存块互相指着.
而这种没有栈指针依赖的对象是无法存活的.
例如你直接写这样的代码:new X2();就会利马变成垃圾.
所以在这一步同时出现了两个垃圾对象,也就是最初的两个new X2();
10.
11.}
12.}
结论: 答案是两个
我希望你能楼主和大家,当然还有yqj2065(严千钧)看一下,第8行,因为我认为这里并不产生垃圾
这是我对这个帖子的半完整解释.
遗留的问题:成员变量在heap上的组织形式.
谢谢各位观看.
这道题似乎没有那么复杂,支持选 C 回收了 2 个,试解释如下:
Given the following,
1.class X2{
2. public X2 x;
3. public static void main(String[] args){
4. X2 x2=new X2();
5. X2 x3=new X2();
6. x2.x=x3;
7. x3.x=x2;
8. x2=new X2();
9. x3=x2;
10. doComplexStuff();
11.}
12.}
after line 9 runs,how many objects are eligible for garbage collection?
A.0 B.1 C.2 D.3 E.4
--
运行到line 5时,共创建了 2 个实例,并且交叉赋值给 x2, x2.x, x3, x3.x
这没有什么特别的,概括地讲也就是说:
x2,x3分别持有一个实例,同时根据成员变量x可以访问另外一个。
--
运行到line 8时,情况发生了变化,x2指向一个新的实例(x2.x自然而然也就null了)
此时
x2持有第 3 个实例,但 x2.x = null (并不指向任何实例)
由于 x3 及 x3.x 仍然持有前面创建的 2 个实例,所以目前还没有对象被释放。
--
运行到line 9时,x3也指向新的实例(和x2引用同一个实例)
此时
x3原来持有的实例被释放
能够通过 x3.x 访问的实例也被释放
--
用符号ABC表示实例就是从
x2 -> A
x2.x -> B
x3 -> B
x3.x -> A
最终演变为
x2 -> C
x2.x is null
x3 -> C
x3.x is null
至此 A 和 B 将被 gc
答案是2个,没问题。但是使用finalize的测试是不对的。
上面大家分析的已经很不错了,我只是想说说上面的finalize的测试方法为什么是错误的?!
我们知道gc是个不确定的行为,我们无法控制,JVM回收垃圾一直都是不可控的。
我认为这个题目出的比较好,如果这个代码
public class GcTest {
public GcTest g;
public static void main(String[] args) {
GcTest x2 = new GcTest();
GcTest x3 = new GcTest();
x2.g = x3;
x3.g = x2;
x2 = new GcTest();
x3=x2;
System.gc();
}
@Override
protected void finalize() throws Throwable {
System.out.println("clear");
}
}
输出多少次clear我觉得都是没有问题的,(当然不会超过3次,因为一共就创建了3个对象)。这个代码和题目是不一样的。
题目中line9之后还有line10,这个是非常重要的,也就是说line9之后这个方法的作用域还没有结束,这时候符合垃圾回收的对象应该是
1。null
2。没有被引用的对象
而line10之后,就会有“结束作用域的局部对象”也符合垃圾回收的条件。
上面的finalize的测试就是犯了这个错误,实际上你这里按照题目的问题应该是3个对象,因为按照上面3条原则,创建的3个对象都是局部的,所以结束了函数作用域一定都符合垃圾回收的条件。之所有只输出了2次clear是因为gc是不确定的,这里gc了2个对象而已,但是符合垃圾回收的对象是3个!
1 比较下面三种软件出错方式处理的优缺点!
1)发现错误时,抛出异常。
2)用函数的返回值判断程序是否正常。
3)在函数的参数中设置一个引用类型的参数(指针),用这个参数的返回值判断程序是正确还是错误。
2 说说你对OOA(面向对象分析),OOD(面向对象设计),OOP(面向对象编程)的理解。
3 你认为掌握哪些知识或能力,可认为精通或熟悉J2EE下的应用开发!
小弟是第一次应聘,遇到这样的题,乱写一气!呵呵!!
请大家谈谈自己的想法,谢谢了!!
查看全文
对于初学JSP又没学过Java,之后又觉得不学Java,Jsp实在做不好,遂又开始学Java,Java学了不多久忽然又觉得JavaBean对Jsp比较重要,开始试着编写JavaBean的我来说。如果不把Java与JavaBean分清楚的话还不如去当老干妈或者阿香婆,反正是做酱的。 我是什么时候开始意识到Java与JavaBean有区别的呢?当然看书是看不来的,本人对书都是一目十行的。在这就不具体写我所遇到的混乱了,那只会让已经混乱的人更混乱,不混乱的人笑疯掉。不过还是要感谢QQJava牛棚群的饼干,真是一句话点醒梦中人那,他说:“那是JSP的语法”(原话忘记了见谅),但是之后他又说了一句名言,他说:“他们本来就不是一个东西”。导致我开始想他们之间的区别。 进入正题: 1.明确JavaBean是Java的一个类。既然是类那么我们就直接去用它的接口就行了,其他的对于初学者无需考虑(其实是本人水平有限)。 2.三个规则。 |——无参构建子,本人认为就是初始化Bean要得到的参数即类的变量。 |——Sreializable Interface,基本上不用管了。 |——拥有Property Interface,这才是以下要着重说的。 JavaBean中有了两类著名的方法: Set方法——方法名以set开头,用于接收从页面传到Bean的值。 public String setName(String name) { this.name=name } Get方法——方法名以get开头,用于从Bean传值到页面。 public String getName() { return (name); } 如果我们要在页面调用JavaBean有两种形式 1. 用JSP的动作