четверг, 15 ноября 2012 г.

Objective-C. Проект - 1 ДНК: Разработка для OSX.

Задача. Создать проект ДНК для OSX.

1. Создайте новое консольное приложение в XCode.
2. Создайте класс Cell, который наследуется от NSObject.
3. В классе создайте переменную DNA типа NSMutableArray – массив из 100 символов. Этот массив будет представлять ДНК. Вам нужно самостоятельно разобраться с созданием массива и выбрать класс или тип для использования для символов.
4. Создайте собственный метод init. Не забудьте в нем вызвать super init. В этом методе задайте значение каждого из 100 символов в случайном порядке из множества A, T, G и С. Иными словами, каждая ячейка вашего массива должна быть одним из этих четырех символов.
5. Создайте метод hammingDistance, который возвращает int и принимает объект класса Cell. Этот метод должен сравнивать свой ДНК и ДНК переданного в качестве аргумента объекта и возвращать количество позиций где символы ДНК не совпадают. Например: ATGGCATTTAGC и ATAGCTTTTCGC. На трех позициях ДНК не совпадают, значит hamming distance = 3.
6. Создайте категорию mutator класса Cell. В ней опишите метод mutate, который возвращает void и принимает int.
7. Создайте имплементацию (реализацию) метода mutate. Метод должен заменить X процентов символов в массиве DNA в случайном порядке; Х – значение переданной переменной типа int. Нужно заменить строго Х процентов, то есть заменять одну ячейку можно максимум один раз.
8. В main-функции создайте два объекта класса Cell, выведите на экран hamming distance между их ДНК, потом мутируйте каждый из объектов и выведите на экран новый hamming distance.


В задаче необходимо:
1. Создать класс Cell (клетка с ДНК), являющийся потомком класса NSObject.
2. Внутри класса Cell создать массив типа NSMutableArray с имемнем DNA.
3. Внутри класса Cell создать метод init, в котором вызывается init родительского класса NSObject и массив DNA заполняется 100 случайными символами из набора A, T, G или С.
4. Внутри класса Cell создать метод hammingDistance, принимающий объект класса Cell. Метод hammingDistance должен возвращать значение типа int, в котором содержится число случаев несовпадений элементов в массивах DNA двух разных объектов (клеток) класса Cell.
Например:
ATCCGGACTG
CTGGTTACTG
hammingDistance = 5 (5 случаев несовпадений в двух массивах).
5. Создать отдельную категорию mutator, в которой создать метод mutate, принимающий значение x типа int. X представляет из себя количество символов, выбранных в случайной последовательности в массиве DNA каждой из клеток Cell, которые должны мутировать. Причем уже измененный символ не должен подвергнуться повторной мутации. Символы для мутаций берутся из набора A, T, G или С.   
6. На экран с помощью метода NSLog должны быть выведены результаты сравнения hammingDistance двух разных клеток до мутации и после мутации обеих из них.

Решение задачи.

Код файла cell.h

#import <Foundation/Foundation.h>

@interface Cell : NSObject {
    NSMutableArray *DNA;
}
-(int)  intInRangeMinimum: (int) min andMaximum: (int) max;
-(void) DNA;
-(id)   init;
-(int)  hammingDistance: (Cell *) c;
@end


Код файла cell.m

#import "cell.h"

@implimentation Fraction

-(int) intInRangeMinimum: (int) min andMaximum: (int) max {
    if (min > max) { return -1; }
    int adjustedMax = (max + 1) - min; // arc4random returns within the set {min, (max - 1)}
    int random = arc4random() % adjustedMax;
    int result = random + min;
    return result;
}

-(void) DNA {
    return DNA;
}

-(id) init {
    self = [super init];
    if (self) {
        NSArray *dna_letters = [[NSArray alloc] initWithObjects:@"A", @"T", @"G", @"C", nil];
        for (int i = 0; i < 100; i++) {
           [[self DNA] addObject: [dna_letters objectAtIndex: [self intInRangeMinimum: 0 andMaximum: 3]]];
        }
        [dna_letters release];
    }
    return self;
}

-(int) hammingDistance: (Cell *) c {
    int distance = 0;
    for (int i = 0; i < 100; i++) {
        if ([[self DNA] objectAtIndex: i] != [[c DNA] objectAtIndex: i]) {
           distance++;
        }
    }
    NSLog(@"hammingDistance = %i", % distance);
}

@end


Код файла main.m

#import <Fonundation/Foundation.h>
#import "cell.h"

@interface Cell (mutator)
-(void) mutate: (int) x;
@end

@implimentaion Cell (mutator)
-(void) mutate: (int) x {
    NSMutableArray *mutated_cells = [[NSMutableArray alloc] init];
    int dna_position;
    int number_of_mutations = x;
    NSArray *dna_letters = [[NSArray alloc] initWithObjects:@"A", @"T", @"G", @"C", nil];
    while (number_of_mutations > 0) {
        dna_position = [self intInRangeMinimum: 0 andMaximum: 99];
        if ([mutated_cells containsObject: dna_position]) {
            continue;
        } else {
            [[self DNA] objectAtIndex: dna_position] = [dna_letters objectAtIndex: [self intInRangeMinimum: 0 andMaximum: 3]];
            [mutated_cells addObject: dna_position];
            number_of_mutations--;
        }
    }
    [mutated_cells release];
    [dna_letters release];
}
@end

int main (int argc, const char *argv[])
{
    @autoreleasepool {
         Cell *firstCell;
         Cell *secondCell;
         firstCell = [[Cell alloc] init];
         secondCell = [[Cell alloc] init];
        
         [firstCell hammingDistance: secondCell];
        
         [firstCell mutate: 10];
         [secondCell mutate: 20];
        
         [firstCell hammingDistance: secondCell];

         [firstCell release];
         [secondCell release];
    }
    return 0;
}

1 комментарий:

  1. Best eCOGRA Sportsbook Review & Welcome Bonus 2021 - CA
    Looking casino-roll.com for an eCOGRA Sportsbook Bonus? https://septcasino.com/review/merit-casino/ At 1xbet login this https://deccasino.com/review/merit-casino/ eCOGRA Sportsbook review, we're talking about a goyangfc.com variety of ECCOGRA sportsbook promotions.

    ОтветитьУдалить