C语言/C++常见习题问答集锦(三十四)之双剑合璧
程序之美
1、定义包含学号、姓名和成绩信息的学生类Student。在测试类中定义存放n个学生对象数组,使用匿名类来实现接口Comparator对学生的成绩进行降序排列,输出排序结果。
java版本:
import java.util.Scanner;
public class Main
{
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
/*System.out.print("Enter the mark of Student1: ");
String mark1=sc.next();
System.out.print("Enter the name of Student1: ");
String name1=sc.next();*/
System.out.print("Enter the grade of Student1: ");
double grade1=sc.nextDouble();
/*System.out.print("Enter the mark of Student2: ");
String mark2=sc.next();
System.out.print("Enter the name of Student2: ");
String name2=sc.next();*/
System.out.print("Enter the grade of Student2: ");
double grade2=sc.nextDouble();
/*System.out.print("Enter the mark of Student3: ");
String mark3=sc.next();
System.out.print("Enter the name of Student3: ");
String name3=sc.next();*/
System.out.print("Enter the grade of Student3: ");
double grade3=sc.nextDouble();
/*System.out.print("Enter the mark of Student4: ");
String mark4=sc.next();
System.out.print("Enter the name of Student4: ");
String name4=sc.next();*/
System.out.print("Enter the grade of Student4: ");
double grade4=sc.nextDouble();
/*System.out.print("Enter the mark of Student5: ");
String mark5=sc.next();
System.out.print("Enter the name of Student5: ");
String name5=sc.next();*/
System.out.print("Enter the grade of Student5: ");
double grade5=sc.nextDouble();
System.out.println();
ComparableStudent student1=new ComparableStudent(null, null, grade1);
ComparableStudent student2=new ComparableStudent(null, null, grade2);
ComparableStudent student3=new ComparableStudent(null, null, grade3);
ComparableStudent student4=new ComparableStudent(null, null, grade4);
ComparableStudent student5=new ComparableStudent(null, null, grade5);
ComparableStudent student6 = (ComparableStudent)Max.max(student1, student2);
ComparableStudent student7 = (ComparableStudent)Max.max(student3, student4);
ComparableStudent student8 = (ComparableStudent)Max.max(student6, student7);
ComparableStudent student9 = (ComparableStudent)Max.max(student5, student8);
System.out.println("The Student1's Grade is " + student1.getGrade());
System.out.println("The Student2's Grade is " + student2.getGrade());
System.out.println("The Student3's Grade is " + student3.getGrade());
System.out.println("The Student4's Grade is " + student4.getGrade());
System.out.println("The Student5's Grade is " + student5.getGrade());
System.out.println();
ComparableStudent[] students= {
new ComparableStudent(null, null, grade1),
new ComparableStudent(null, null, grade2),
new ComparableStudent(null, null, grade3),
new ComparableStudent(null,null, grade4),
new ComparableStudent(null, null, grade5),
};
java.util.Arrays.sort( students);
for(Student student:students)
{
System.out.println(student.getGrade());
}
}
}
class Student
{
String mark;
String name;
double grade;
Student()
{
}
Student(String mark,String name,double grade)
{
this.mark=mark;
this.name=name;
this.grade=grade;
}
void setMark(){
this.mark=mark;
}
public String getMark(String mark){
return mark;
}
void setNamek(){
this.name=name;
}
public String getName(String name){
return name;
}
void setGrade(){
this.grade=grade;
}
public double getGrade(){
return grade;
}
}
class ComparableStudent extends Student implements Comparable
{
public ComparableStudent(String mark,String name,double grade)
{
super(mark, name, grade);
}
public int compareTo(Object o)
{
if(getGrade()>((Student) o).getGrade())
{
return 1;
}
else if(getGrade()<((Student) o).getGrade())
{
return -1;
}
else
{
return 0;
}
}
//@Override
public String toString()
{
return super.toString()+"mark: "+getMark(mark)+" name"+getName(name)+"grade:" +getGrade();
/输出只有成绩,没有学号和姓名
}
}
class Max
{
public static ComparableStudent max(ComparableStudent o1, ComparableStudent o2)
{
if (o1.compareTo(o2) > 0)
return o1;
else
return o2;
}
}
C语言版本:
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#define MAX 50
typedef struct {
char stuId[10];
char name[20];
int score;
}Student;
void input(Student students[MAX], int n)
{
int i;
for (i = 0; i < n; i++) {
scanf("%s", students[i].stuId);
scanf("%s", students[i].name);
scanf("%d", &students[i].score);
}
}
void Comparator(Student students[MAX], int n)
{
int i, j;
Student temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (students[j].score < students[j + 1].score) {
memcpy(&temp, &students[j], sizeof(Student));
memcpy(&students[j], &students[j + 1], sizeof(Student));
memcpy(&students[j + 1], &temp, sizeof(Student));
}
}
}
}
void print(Student students[MAX], int n)
{
int i;
for (i = 0; i < n; i++) {
printf("%s %s %d\n", students[i].stuId, students[i].name, students[i].score);
}
}
int main()
{
Student students[MAX];
int n;
scanf("%d", &n);
input(students, n);
Comparator(students, n);
printf("输出:\n");
print(students, n);
system("pause");
return 0;
}
**写一函数,实现两个字符串的比较,即自己写一个strcmp函数,函数原型为
int strcmp(char p1,char p2);
设p1指向字符串s1,p2指向字符串s2。要求当s1=s2时,返回值为0,若s1!=s2返回 他们二者第一个不同字符的ASCII码差值(如“BOY”与“BAD”,第二个字母不同,“O”与“A”之差为79-65=14)。如果s1>s2,则输出正值,如果s1<s2,则输出负值。
C++版本:
#include <iostream>
using namespace std;
int main()
{int strcmp(char *p1,char *p2);
int m;
char str1[20],str2[20],*p1,*p2;
cout<<"input two strings:"<<endl;
cin>>str1;
cin>>str2;
p1=&str1[0];
p2=&str2[0];
m=strcmp(p1,p2);
cout<<"result:"<<m<<endl;
return 0;
}
int strcmp(char *p1,char *p2) //自已定义字符串比较函数
{int i;
i=0;
while(*(p1+i)==*(p2+i))
if (*(p1+i++)=='\0') return(0); //全部字符相同时返回结果0
return(*(p1+i)-*(p2+i)); //不相同时返回结果为第一对不相同字符的ASCII码的差值
}
C语言版本:
#include<stdio.h>
#include<string.h>
int strcmp(char *s1,char *s2)
{
int a,i,j;
for(i=0;s1[i]!='\0'&&s2[i]!='\0';i++)
{
if(s1[i]!=s2[i])
{
return s1[i]-s2[i];
}
}
return 0; //当真点睛之笔
}
int main()
{
char s1[20],s2[20];
int x;
gets(s1);
gets(s2);
x=strcmp(s1,s2);
printf("%d\n",x);
return 0;
}