请问下面这个实例用C语言程序怎样编程

请问下面这个实例用C语言程序怎样编程,第1张

#include <stdio.h>

int main() {

int score

char grade

printf("请输入成绩:")

scanf("%d", &score)

switch (score / 10) {

case 10:

case 9:

grade = 'A'

break

case 8:

grade = 'B'

break

case 7:

grade = 'C'

break

case 6:

grade = 'D'

break

default:

grade = 'E'

break

}

printf("成绩等级为:%c\n", grade)

return 0

}

在程序中,先定义了一个整型变量 score 和一个字符型变量 grade,用来分别存储输入的成绩和计算出的等级。然后,使用 scanf 函数从键盘上读入成绩,使用除法运算将成绩转化为 1~10 的整数,并将其作为 switch 语句的选择器。根据成绩范围,使用不同的 case 标号计算出等级,并将其赋值给 grade 变量。最后,使用 printf 函数输出等级。

注意,在 switch 语句中,可以使用多个 case 标号来表示同一种情况,这样可以简化代码。例如,case 10 和 case 9 都表示成绩在 90 分以上的情况,因此可以将它们写在一起。另外,在 switch 语句中,必须使用 break 语句来结束每个 case 分支,否则程序将继续执行后面的 case 分支。

电脑可以编程C语言和JAVA等。

1.C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。

2.Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等

首先需要先加载JVM,然后根据jar中的函数签名寻找到相应的函数,然后运行相应的函数

一段样例代码如下

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

32

33

34

35

36

37

38

39

40

41

42

43

44

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

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

#include <iostream>

#include <jni.h>

#include <windows.h>

#include <cstring>

#include <direct.h>

using namespace std

#define DIRLEN 10000

char* GetJrepath(int BIT)

int CallJAR(int BIT,char*buf,char*classPath,char*functionName)

int main(int argc, char *argv[])

{

char * buff = new char[DIRLEN]

getcwd(buff,DIRLEN)

strcat(buff,"\\lib\\support.jar")

if (argc<3)

{

cout<<"输入参数错误"

return 0

}

int BIT = 32

if(!strcmp(argv[2],"64"))

BIT = 64

//-30 没有安装jre环境 -31 创建jvm失败 -32 缺少相关的库

if (!strcmp(argv[1],"0"))

{

//-20 配置文件错误 -21 JSON异常

return CallJAR(BIT,buff,"com/run/Author","StartAuthor")

}

else if(!strcmp(argv[1],"1"))

{

return CallJAR(BIT,buff,"com/run/UpdateStatus","UpdateStatus1")

}

else if(!strcmp(argv[1],"2"))

{

return CallJAR(BIT,buff,"com/run/SendMsg_webchinese","SendSMS")

}

else

{

return CallJAR(BIT,buff,"com/run/UpdateStatus","UpdateANDSMS")

}

}

char* GetJrepath(int BIT)

{

#define MYBUFF 123

HKEY hKey

long lRet

char* dir = new char[MYBUFF]

DWORD dwBufLen = MYBUFF

char* s = new char[MYBUFF]

if(BIT == 64)

strcpy(s,"SOFTWARE\\Wow6432Node\\JavaSoft\\Java Runtime Environment\\")

else

strcpy(s,"SOFTWARE\\JavaSoft\\Java Runtime Environment\\")

lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,

TEXT((TCHAR*)s),

0,

KEY_QUERY_VALUE,

&hKey)

if(lRet!=ERROR_SUCCESS)

return NULL

lRet = RegQueryValueEx(hKey,

TEXT((TCHAR*)"CurrentVersion"),

NULL,

NULL,

(LPBYTE)dir,

&dwBufLen)

RegCloseKey(hKey)

if(lRet!=ERROR_SUCCESS)

return NULL

strcat(s,dir)

lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,

TEXT((TCHAR*)s),

0,

KEY_QUERY_VALUE,

&hKey)

if(lRet!=ERROR_SUCCESS)

return NULL

dwBufLen = MYBUFF

lRet = RegQueryValueEx(hKey,

TEXT((TCHAR*)"RuntimeLib"),

NULL,

NULL,

(LPBYTE)dir,

&dwBufLen)

RegCloseKey(hKey)

if(lRet!=ERROR_SUCCESS)

return NULL

return dir

}

int CallJAR(int BIT,char*buf,char*classPath,char*functionName)

{

typedef jint (WINAPI *PFunCreateJavaVM)(JavaVM **, void **, void *)

int res

JavaVMInitArgs vm_args

JavaVMOption options[3]

JavaVM *jvm

JNIEnv *env

int len =strlen("-Djava.class.path=.")+strlen(buf)+20

char* temp = new char[len]

strcpy(temp,"-Djava.class.path=.")

strcat(temp,buf)

/*设置初始化参数*/

//disable JIT,这是JNI文档中的解释,具体意义不是很清楚 ,能取哪些值也不清楚。

//从JNI文档里给的示例代码中搬过来的

options[0].optionString = "-Djava.compiler=NONE"

//设置classpath,如果程序用到了第三方的JAR包,也可以在这里面包含进来

options[1].optionString = temp

//设置显示消息的类型,取值有gc、class和jni,如果一次取多个的话值之间用逗号格开,如-verbose:gc,class

//该参数可以用来观察C++调用JAVA的过程,设置该参数后,程序会在标准输出设备上打印调用的相关信息

options[2].optionString = "-verbose:NONE"

//设置版本号,版本号有JNI_VERSION_1_1,JNI_VERSION_1_2和JNI_VERSION_1_4

//选择一个根你安装的JRE版本最近的版本号即可,不过你的JRE版本一定要等于或者高于指定的版本号

vm_args.version = JNI_VERSION_1_4

vm_args.nOptions = 3

vm_args.options = options

//该参数指定是否忽略非标准的参数,如果填JNI_FLASE,当遇到非标准参数时,JNI_CreateJavaVM会返回JNI_ERR

vm_args.ignoreUnrecognized = JNI_TRUE

//加载JVM.DLL动态库

HINSTANCE hInstance = ::LoadLibrary(GetJrepath(BIT))

if (hInstance == NULL)

{

return -30

}

//取得里面的JNI_CreateJavaVM函数指针

PFunCreateJavaVM funCreateJavaVM = (PFunCreateJavaVM)::GetProcAddress(hInstance, "JNI_CreateJavaVM")

//调用JNI_CreateJavaVM创建虚拟机

res = (*funCreateJavaVM)(&jvm, (void**)&env, &vm_args)

if (res <0)

{

return -31

}

//查找test.Demo类,返回JAVA类的CLASS对象

jclass cls = env->FindClass(classPath)

//根据类的CLASS对象获取该类的实例

if (cls==0)

{

printf("FindClass failed\n")

(jvm)->DestroyJavaVM()

return -32

}

jobject obj = env->AllocObject(cls)

//获取类中的方法,最后一个参数是方法的签名,通过javap -s -p -classpath 路径 文件名

jmethodID mid = env->GetMethodID(cls, functionName,"()I")

if (mid==0)

{

printf("getMethodID failed\n")

(jvm)->DestroyJavaVM()

return -32

}

//构造参数并调用对象的方法

jstring msg = (jstring) env->CallObjectMethod(obj, mid)

//销毁虚拟机并释放动态库

jvm->DestroyJavaVM()

::FreeLibrary(hInstance)

return (int)msg

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11021706.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存