您现在的位置是:首页 >技术杂谈 >Linux下C、C++、和Java程序设计网站首页技术杂谈

Linux下C、C++、和Java程序设计

封奚泽优 2024-06-20 06:01:02
简介Linux下C、C++、和Java程序设计

1.创建用户和之前一样。

RHEL7.2用户名和密码的创建以及DHCP服务的安装_封奚泽优的博客-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/130763469?spm=1001.2014.3001.55012.用yum安装(分别是c,c++,java,javac)(之前我以为是分开安装的,后面老师说只是版本不一样,安装之后java和javac都安装好了

[root@localhost 桌面]# yum install gcc -y
[root@localhost 桌面]# yum install gcc-c++ -y
[root@localhost 桌面]# yum install java-1.8.0-openjdk-devel.x86_64 -y
[root@localhost 桌面]# java
[root@localhost 桌面]# javac

 参考链接:linux:centos7 yum命令安装java环境并配置JAVA_HOME环境变量_as57147的博客-CSDN博客https://blog.csdn.net/as57147/article/details/109295471

编写一个Java程序看看(不知道是不是我之前配置过环境变量的原因,这个可以直接编译运行

这个可能不是,用yum安装环境变量好像是自动配置好了。

public class hello {
	public static void main(String[] args) {
		System.out.println("hello world");
	}
}
[root@localhost java]# javac hello.java
[root@localhost java]# java hello
hello world
[root@localhost java]# echo $JAVA_HOME
usr/java/jdk1.8.0_361

3.编写C或C++和Java的语言程序,我这里是用c++和java写的。

 参考链接:

(3条消息) 求范围内的质数的个数_封奚泽优的博客-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/130451290?spm=1001.2014.3001.5502

代码分析:通过用户输入可以得到各自的学号,首先判断他本身是否是质数,如果不是质数就可以将他拆分,那么如何拆分,我们判断质数的时候如果他有因子就不是质数,在将他除以这个因子重复这个过程,整个翻译成程序就是如果他是质数就直接跳出循环,如果他不是质数就将他拆成质数乘以质数的形式,自己本身越来越靠近质数,最后跳出循环把自己也输出就得到了最终的表达式,整个程序不是很难想到,主要就是要注意int类型数据越界的情况

#include<iostream>
using namespace std;
//202140200126

bool isPrime(long long sno);
 
int main(){
	//用int类型数据越界 
	long long sno=0;
	cout<<"请输入您的学号:"; 
	cin>>sno;
	cout<<sno<<"=";
	while(!isPrime(sno)){
		for(long long i=2;i<sno;i++){
			//直接输出因子 
			if(sno%i==0){
				cout<<i<<"*";
				sno/=i;
				//直接进入下一次的循环 
				break;
			}
		}
	}
	cout<<sno<<endl;
	return 0;
}

//判断sno是否是质数 
bool isPrime(long long sno){
	for(long long i=2;i<sno;i++){
		if(sno%i==0){
			return false;
		}
	}
	return true;
}

 思路知道了用什么语言写就是转换一下就可以了。

import java.util.Scanner;
//202140200126
public class Test {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.print("请输入您的学号:");
        long sno=sc.nextLong();
        System.out.print(sno+"=");
        while(!isPrime(sno)){
            for(long i=2;i<sno;i++){
                if(sno%i==0){
                    System.out.print(i+"*");
                    sno/=i;
                    break;
                }
            }
        }
        System.out.println(sno);
    }
    //判断sno是否是质数
    public static boolean isPrime(long sno){
        for(long i=2;i<sno;i++){
            if(sno%i==0){
                return false;
            }
        }
        return true;
    }
}

[root@localhost java]# gedit Test.java
[root@localhost java]# javac Test.java
[root@localhost java]# java Test
请输入您的学号:202140200126
202140200126=2*25339*3988717

 出现这个说明之前没有那个文件,现在是创建一个新的文件。

** (gedit:5177): WARNING **: 获取文件“/root/桌面/he”的信息出错:没有那个文件或目录

** (gedit:5177): WARNING **: Set document metadata failed: 设置文件元数据出错:没有那个文件或目录

说明:这个寻找质因子是采取一种比较笨的方法,所以整个的效率比较低,对于一些的学号会很久才出来结果,可以通过修改来优化整个程序,如:寻找不用判断每一种可能,主要判断质数就行,因为合数可以拆分成质数和质数相乘的形式,有因为需要时最小的因子,所以总会有一个质数比这个合数大。详细的思路还是看之前的参考链接。 

c++编写的程序用gcc编译就会发生报,所以应该要用g++来编译。

[root@localhost c]# gedit sno.c
[root@localhost c]# gcc sno.c -o sno.o
sno.c:1:19: 致命错误:iostream:没有那个文件或目录
 #include<iostream>
                   ^
编译中断。
[root@localhost c]# g++ sno.c -o sno.o
[root@localhost c]# ./sno.o
请输入您的学号:202140200126
202140200126=2*25339*3988717

4.这个题目还不确定是什么意思,我是先把.c的文件准备好,如何编写makefile文件。

[root@localhost c]# gedit Makefile

写下面这几行代码 

sno.o:sno.c
	g++ sno.c -o sno.o

如果出现这个,说明之前已经编译过了,可以删除之后重新执行

[root@localhost c]# make -f Makefile
make: “sno.o”是最新的。
[root@localhost c]# rm -f sno.o
[root@localhost c]# make -f Makefile
g++ sno.c -o sno.o

也可以增加一个clean,修改之前的文件就是成这样了。

sno:sno.c
	g++ sno.c -o sno
clean:
	rm -f *.o
	rm -f sno

之前有一直以为的是,下面是执行sno和clean一起执行,这就导致我的理解是他生成了sno的目标文件然后又删除了。其实不是,他的意思是只执行Makefile里面的clean。也就是我们要删除的时候可以执行这条语句。

[root@localhost c]# make -f Makefile clean
[root@localhost c]# ls
a.out  cdx  cdx.c  Makefile  sno.c

[root@localhost c]# make -f Makefile
g++ sno.c -o sno
[root@localhost c]# ls
a.out  cdx  cdx.c  Makefile  sno  sno.c

[root@localhost c]# ./sno
请输入您的学号:202140200126
202140200126=2*25339*3988717

[root@localhost c]# make -f Makefile clean
rm -f *.o
rm -f sno

[root@localhost c]# ls
a.out  cdx  cdx.c  Makefile  sno.c

 当然这个老师上课是讲过的,也确实书上还有笔记,以为要在多个文件,为此还特地把文件拆开来用。直接看文件内容吧。(这里我是提前创建了文件,而且把内容写到里面的,所以用cat查看,如果有感兴趣的可以直接创建文件,把内容写进去,我这没有写填写过程,因为我感觉写在一个文件夹里面貌似也是可以的

[root@localhost make]# ls
bar.c  bar.h  foo.c  foo.h  Makefile

[root@localhost make]# cat foo.h
#include<iostream>
using namespace std;

[root@localhost make]# cat foo.c
#include "foo.h"
#include "bar.h"

bool isPrime(long long sno);

int main(){
	//用int类型数据越界 
	long long sno=0;
	cout<<"请输入您的学号:"; 
	cin>>sno;
	cout<<sno<<"=";
	while(!isPrime(sno)){
		for(int i=2;i<sno;i++){
			//直接输出因子 
			if(sno%i==0){
				cout<<i<<"*";
				sno/=i;
				//直接进入下一次的循环 
				break;
			}
		}
	}
	cout<<sno<<endl;
	return 0;
}

[root@localhost make]# cat bar.h
#include<iostream>
using namespace std;

[root@localhost make]# cat bar.c
#include "foo.h"
#include "bar.h"

//判断sno是否是质数 
bool isPrime(long long sno){
	for(long long i=2;i<sno;i++){
		if(sno%i==0){
			return false;
		}
	}
	return true;
}

[root@localhost make]# cat Makefile
sno:foo.o bar.o
	g++ foo.o bar.o -o sno
foo.o:foo.c foo.h
	g++ -c foo.c -o foo.o
bar.o:bar.c foo.h bar.h
	g++ -c bar.c -o bar.o
clean:
	rm -f *.o
	rm -f sno
[root@localhost make]# 

然后就是编译运行,和之前就是一样的了。

[root@localhost make]# ls
bar.c  bar.h  foo.c  foo.h  Makefile
[root@localhost make]# make -f Makefile
g++ -c foo.c -o foo.o
g++ -c bar.c -o bar.o
g++ foo.o bar.o -o sno

[root@localhost make]# ls
bar.c  bar.h  bar.o  foo.c  foo.h  foo.o  Makefile  sno
[root@localhost make]# ./sno
请输入您的学号:202140200126
202140200126=2*25339*3988717

[root@localhost make]# make -f Makefile clean
rm -f *.o
rm -f sno

[root@localhost make]# ls
bar.c  bar.h  foo.c  foo.h  Makefile
[root@localhost make]# 

5.我刚开始还以为是环境变量的问题,现在感觉应该是权限的问题。(文件夹位置没有发生改变

先切换到普通用户,执行上面的语句。发现权限不够,这个时候就想到了sudo。

[root@localhost make]# su lj200126
[lj200126@localhost make]$ ls
bar.c  bar.h  foo.c  foo.h  Makefile
[lj200126@localhost make]$ make -f Makefile
g++ -c foo.c -o foo.o
Assembler messages:
Fatal error: can't create foo.o: 权限不够
make: *** [foo.o] 错误 1

 结果还是不行。被报告是什么意思,让我们重新回到root用户。(这里是要输入普通用户的密码,不是root用户的密码)

[lj200126@localhost make]$ sudo make -f Makefile
[sudo] password for lj200126: 
lj200126 不在 sudoers 文件中。此事将被报告。
[lj200126@localhost make]$ 

 切回到root用户。(也可以用su root

[lj200126@localhost make]$ exit
exit
您在 /var/spool/mail/root 中有新邮件
[root@localhost make]# 

 咋还有邮件来了,我到要看看是什么。(末尾显示这个,原来他在打"小报告",会记录这违规的事情)

[root@localhost make]# cat /var/spool/mail/root

localhost.localdomain : May 23 20:51:56 : lj200126 : 用户不在 sudoers 中 ; TTY=pts/0 ; PWD=/root/make ; USER=root ; COMMAND=/bin/make -f Makefile

 那现在的思路就是提升他的权限了。

把只读权限修改为可写权限。

[root@localhost make]# ls -l /etc/sudoers
-r--r-----. 1 root root 4188 7月   7 2015 /etc/sudoers
[root@localhost make]# chmod u+w /etc/sudoers
[root@localhost make]# ls -l /etc/sudoers
-rw-r-----. 1 root root 4188 7月   7 2015 /etc/sudoers
[root@localhost make]# 

 编辑配置文件(增加下面一行,详细思路看参考链接)

[root@localhost make]# gedit /etc/sudoers

恢复权限(440就是9位权限码,里面的每一位就是rwx读,写,可执行,三位对应的是user,group,other。440就是自己是可读的不可写不可执行,组里面也是可读的不可写不可执行,对于其他用户是不可读不可写不可执行的

[root@localhost make]# ls -l /etc/sudoers
-rw-r----- 1 root root 4209 5月  23 21:05 /etc/sudoers
[root@localhost make]# chmod 440 /etc/sudoers
[root@localhost make]# ls -l /etc/sudoers
-r--r----- 1 root root 4209 5月  23 21:05 /etc/sudoers
[root@localhost make]#

 重新编译

[lj200126@localhost make]$ make -f Makefile
g++ -c foo.c -o foo.o
Assembler messages:
Fatal error: can't create foo.o: 权限不够
make: *** [foo.o] 错误 1

[lj200126@localhost make]$ sudo make -f Makefile
[sudo] password for lj200126: 
g++ -c foo.c -o foo.o
g++ -c bar.c -o bar.o
g++ foo.o bar.o -o sno

[lj200126@localhost make]$ ls
bar.c  bar.h  bar.o  foo.c  foo.h  foo.o  Makefile  sno

[lj200126@localhost make]$ ./sno
请输入您的学号:202140200126
202140200126=2*25339*3988717
[lj200126@localhost make]$ 

参考链接:

 (1条消息) 解决Linux系统下,出现“不在sudoers文件中,此事将被报告”的问题_不在 sudoers 文件中。此事将被报告。_正积分的博客-CSDN博客https://blog.csdn.net/weixin_46984358/article/details/121497015

6.官网下载,可以不用捐助。我是在windows下面下载在移动到虚拟机里面的。.tar.gz后缀的压缩包Thank You for Downloading Eclipse | The Eclipse Foundationhttps://www.eclipse.org/downloads/download.php?file=/oomph/epp/2023-03/R/eclipse-inst-jre-linux64.tar.gz&mirror_id=1142

[root@localhost 下载]# ls
eclipse-inst-linux64.tar.gz
[root@localhost 下载]# tar -zxvf eclipse-inst-linux64.tar.gz

 理论上是解压之后进入解压后的文件夹,如何打开eclipse-inst就可以了,但是我这里报错了,不知道是不是文件不对。

[root@localhost eclipse]# cd eclipse-installer
[root@localhost eclipse-installer]# ls
artifacts.xml  eclipse-inst      features  p2       readme
configuration  eclipse-inst.ini  icon.xpm  plugins
[root@localhost eclipse-installer]# ./eclipse-inst

 坐等老师发文件。

 我的启动没成功。

7.保存命令也和之前是一样的了。

(1条消息) RHEL7.2用户名和密码的创建以及DHCP服务的安装_封奚泽优的博客-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/130763469?spm=1001.2014.3001.5501

 整个的这篇写下来的不只是怎么操作,仅仅是敲代码,敲指令的话没有什么效果,更加重要的是应该去试错,命令报错可以直接把错误的内容复制粘贴到浏览器上面,基本上互联网上面都会有人同样也出现这种错误,并且有类似的解决方案,我听到一种说法就是如果你的错误在网上没有,那么你就是这个领域的佼佼者了。这就是我把错误的部分也写里面,把解决写在错误后面原因,也不能说这些错误没有意义,至少当有人来问我的时候我可以自信地说这个我之前也错过,但是我现在知道了。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。