【OC复合题】之定义一个学生类,需要有姓名,年龄,考试成绩三个成员属性,创建5个对象,属性可以任意值。(Objective-C)

题目:

定义一个学生类,需要有姓名,年龄,考试成绩三个成员属性,创建5个对象,属性可以任意值。(Objective-C)

1)    不使用@property,手动编写他们的访问器方法(getter和setter),注意内存管理(手动管理内存)

2)    增加一个便利构造器(快速构造器)

3)    使用NSLog输出学生对象时,输出信息格式为:My Name Is XXX  Age Is XXX Score Is XXX

4)    对5个学生对象按照成绩—》年龄—》姓名优先级排序(成绩相同按照年龄排序,成绩年龄相同按照姓名排序(5个学生的属性值自己随便设定,姓名不考虑中文,按26个大小字母排序))

这是一道黑马入学考试题,我做了3个小时,终于做好了这道题,涉及到了很多OC语言基础的知识点,由于使用的是xocde6.3.2,没有办法进行手动内存管理,所以省略了这一部分,供大家参考

代码:

#import <Foundation/Foundation.h>

@interface Student : NSObject
{
    //姓名
    NSString* _name;
    //年龄
    int _age;
    //成绩
    int _score;
}

-(void)setName:(NSString*)name;
-(void)setAge:(int)age;
-(void)setScore:(int)score;

-(NSString*)getName;
-(int)getAge;
-(int)getScore;

+(BOOL)isNameHigher:(NSString *)n1 and:(NSString *)n2;

//比较两个学生的排名,是否第一个学生比第二个学生排名靠前
+(BOOL)isHigher:(Student*) student1 and:(Student*)student2;

-(id)initWithName:(NSString*)name andAge:(int)age andScore:(int)score;
@end
#import "Student.h"

@implementation Student

-(void)setName:(NSString *)name{
    _name = name;
}

-(void)setAge:(int)age{
    _age = age;
}

-(void)setScore:(int)score{
    _score = score;
}

-(NSString *)getName{
    return _name;
}

-(int)getAge{
    return _age;
}

-(int)getScore{
    return _score;
}

-(id)initWithName:(NSString *)name andAge:(int)age andScore:(int)score{
    if (self = [super init]) {
        _name = name;
        _age = age;
        _score = score;
    }
    return self;
}

-(NSString *)description{
//    return [NSString stringWithFormat:@"%@ %d %d",_name,_age,_score];
    return [NSString stringWithFormat:@"My name is %@ age is %d score is %d",_name,_age,_score];
}

+(BOOL)isNameHigher:(NSString *)n1 and:(NSString *)n2{
    unsigned long time;
    if ([n1 length]>[n2 length]) {
        time = [n2 length];
    }else{
        time = [n1 length];
    }
    for (int i = 0; i<time; i++) {
        if ([n1 characterAtIndex:i]<[n2 characterAtIndex:i]) {
            return YES;
        }else if ([n1 characterAtIndex:i]>[n2 characterAtIndex:i]){
            return NO;
        }
    }
    NSLog(@"所有条件都相同,根据姓名长度比较");
    return [n1 length]<[n2 length];
}

+(BOOL)isHigher:(Student*) student1 and:(Student*)student2{
    //比较两个学生的分数,分数高的返回
    if ([student1 getScore] > [student2 getScore]) {
        return YES;
    }else if ([student1 getScore] < [student2 getScore]){
        return NO;
    }else {//如果两个学生的分数相同,比较两个学生的年龄,年龄低的返回
        if ([student1 getAge] < [student2 getAge]) {
            return YES;
        }else if ([student1 getAge] > [student2 getAge]){
            return NO;
        }else{
            //如果两个学生的分数和年龄都相同,根据姓名(限制为英文)前端字母排序
            NSString* n1 = [[student1 getName] lowercaseString];
            NSString* n2 = [[student2 getName] lowercaseString];
            if ([self isNameHigher:n1 and:n2]){
                return YES;
            }else{
                return NO;
            }
        }
    }
}
@end
#import <Foundation/Foundation.h>
#import "Student.h"

int main(){

    Student* s1 = [[Student alloc]initWithName:@"Tim" andAge:11 andScore:79];
    Student* s2 = [[Student alloc]initWithName:@"Calo" andAge:12 andScore:86];
    Student* s3 = [[Student alloc]initWithName:@"QaJin" andAge:14 andScore:95];
    Student* s4 = [[Student alloc]initWithName:@"Jaren" andAge:11 andScore:95];
    Student* s5 = [[Student alloc]initWithName:@"Jare" andAge:11 andScore:95];

    NSMutableArray* students = [NSMutableArray arrayWithObjects:s1,s2,s3,s4,s5, nil];

    NSUInteger count = [students count];

    //使用冒泡排序对可变集合(学生集合)进行排序
    for (int i = 0; i<count; i++) {
        for (int j = 0; j<count; j++) {
            if (j<count-1 && ![Student isHigher:students[j] and:students[j+1]]) {
                Student* s =students[j];
                [students setObject:students[j+1] atIndexedSubscript:j];
                [students setObject:s atIndexedSubscript:j+1];
            }
        }
    }

    NSLog(@"%@",students);
    return 0;
}
时间: 2024-10-17 13:52:16

【OC复合题】之定义一个学生类,需要有姓名,年龄,考试成绩三个成员属性,创建5个对象,属性可以任意值。(Objective-C)的相关文章

设计一个学生类&amp;班级类

第一题 设计一个学生类 属性:姓名.学号.年龄.成绩 设计一个班级类要求:实现向班级中添加学生.删除学生.查看学生.按照指定条件排序 属性:班级代号,所有学生 需要使用 calss, __int__, __str__, sort, append, dict, list, remove, for in class Stu: # 设置学生基础属性 def __init__(self, name, num, age, cj): self.name = name self.num = num self.

java定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积

需求如下:(1)定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积. (2)定义一个类PassObject,在类中定义一个方法printAreas(),该方法的定义如下: public void printAreas(Cirlce c, int times) 在printAreas方法中打印输出1到time之间的每个整数半径值,以及对应的面积.例如,times为5,则输出半径1,2,3,4,5,以及对应的圆面积. 在main方法

定义一个长方形类,定义 求周长和面积的方法实例

/* 定义一个长方形类,定义 求周长和面积的方法, 然后定义一个测试了Test2,进行测试. 长方形的类: 成员变量: 长,宽 成员方法: 求周长:(长+宽)*2; 求面积:长*宽 注意: import必须出现在所有的class前面.*/ import java.util.Scanner; class ChangFangXing { //长方形的长 private int length; //长方形的宽 private int width; public ChangFangXing(){} //

定义一个Rectangle类,该类提供getLength和getWidth方法。

import java.util.Comparator; /** * 定义一个Rectangle类,该类提供getLength和getWidth方法.利用图1-18中的findMax例程编写 * 一种main方法,该方法创建一个Rectangle数组并首先找出依面积最大的Rectangle对象,然后 * 找出依周长最大的Rectangle对象. * @author wulei */public class RectangleTest { /** * 构造一个矩形 */ private int w

20150920学习内容:结构体及题目:定义一个学生的结构体,学号,姓名,身高,输入学生信息,按身高排序输出

结构体:用户自定义数据类型,实际就是变量组,可以一次存多个不同变量 结构体定义在main函数的外面 Struck 结构体名 { // 元素一 // 元素二 } 题目:定义一个学生的结构体,学号,姓名,身高,输入学生信息,按身高排序输出

定义一个学生的结构体,学号,姓名,身高,输入学生信息。按身高排序输出

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections; namespace ConsoleApplication1 { class Program { struct student { public int code;//pu修饰符blic public string name;//结构体成员 public int shengao

python全栈系列之---定义一个session类

首先:注意cookie中的get_cookie是返回字符串,而get_secure_cookie返回的是字节类型 #self.get_secure_cookie() #The decoded cookie value is returned as a byte string (unlike #`get_cookie`). md5加密获取的十六进制也是返回的字符串类型 import hashlib import time obj = hashlib.md5() obj.update(bytes(s

类的继承定义一个computer类在此基础上派生出两个子类(继承与多态绑定)

题目如下 定义一个计算机类(Computer),并在它的基础上派生出两个子类:台上机(Desktop)和便携机类(Notebook),在Computer中定义几个方法,并在子类Desktop和Notebook中覆盖这些方法.在main方法中利用对象类型转换将类Desktop和Notebook的对象分别赋值给Computer对象,并应用多态调用这些方法. 实验目的 (1)       理解继承的概念,掌握继承的语法. (2)       学习定义和使用子类. (3)       掌握继承过程中的方

实验四 (1):定义一个形状类(Shape)方法:计算周长,计算面积

(1)定义一个形状类(Shape)方法:计算周长,计算面积子类:矩形类(Rectangle) :额外的方法:differ() 计算长宽差圆形类(Circle)三角形类(Triangle)正方形类(Square) 矩形的子类生成几个不同的形状对象,放在一个Shape类型的数组里,分别求每个形状的周长和面积.如果形状对象是一个矩形,且不是正方形,则计算长宽差. 1 package com.tiger.practice; 2 3 class Shape { 4 5 public double leng