Помогите с массивами!!

  1. Вот задача:
    Дана матрица A(n,m), которая вводится из файла, и число к, вводимое с клавиатуры. В к-ком столбце найти минимальный элемент. В той строке, где этот элемент находится, найти сумму отрицательных элементов. Каждый этап решать при помощи подрограммы, работаютщей с вектором. Вектор вырезать из матрицы.

    Вот код программы которую написал я:
    Код:
    #include <alloc.h>
    #include <stdio.h>
    #include <conio.h>
    int n;
    int xsum(int i_min,int **a)
    {
      int j,s;
            for(s=0,j=0;j<n;j++)
                if(a[i_min][j]<0){
                s+=a[i_min][j];
                }
            return s;
    }
    main()
    {
     
        int i,j,**a,sum,m,k,*x,min,i_min=0,p=0;
        FILE *in;
        if((in=fopen("file.dat","r"))==NULL)
        {
            printf("\nfile.dat not found.");
            getch();exit(1);
        }
        printf("~n & m:");
        scanf("%d%d",&n,&m);
        printf("~K:");
        scanf("%d",&k);
        k-=1;
        a=(int**)malloc(n*sizeof(int*));
        x=(int*)malloc(n*sizeof(int*));
        for(i=0;i<n;i++)
            a[i]=(int*)malloc(m*sizeof(int));
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
                    fscanf(in,"%d", &a[i][j]);
     
        for(i=0;i<n;i++)
            {for(j=0;j<m;j++)
                printf("%5d",a[i][j]);
            printf("\n");}
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            if (a[i][k] < a[i_min][k])
                i_min=i;
    //где то сдесь я должен скопировать все значение из этой строки в новый массив
               
        printf("min:%d\n",a[i_min][k]);
        
        int summa=xsum(i_min,a);
        printf("%d",summa);
        getch();
    }
     
    Препод не доволен, что я работаю с двумерным массивом, и просит что-бы я вырезал все значения из этой строки в новый массив (смотрите код). У меня не получает, вернее получается, но цифры от балды. Помогите пожалуйтся.
     
  2. Никто не поможет? :(
     


  3. Добавлено через 2 минуты
    Пояснения:
    Для отправки указателя на одномерный массив в функцию тебе просто надо присвоить ему значение адреса первого элемента искомой строки
    x = &a[i_min][0];

    Плюс ко всему в глобальные переменные занес размер строки, а в локальные количество столбцов. Это чтоб в функцию не передавать размер массива. В остальном все тоже самое.

    Добавлено через 3 минуты
    П.С. Не знаю как оформить тег Кода, поэтому выложил так.
    П.П.С. Я не знаю в какой среде ты программируешь, но у тебя не объявлен тип функции main() и у меня в MSV2010 не было функции конкретно <alloc.h>, поэтому <iostream>там. В остальном соответствие полное. И я б тебе посоветовал вывод на экран организовать в той же функции считывания массива - в разы меньше кода и лучшая читабельность.

    Всего хорошего.
     
    1 человеку нравится это.
  4. Ой, спасибо!!! Я работаю в Code::Blocks, хотя там в классе у нас (ide?) Norton Commander (в тч. Turbo C). В более новых версиях malloc.h, а не alloc.h. Мне еще бы копировать элементы меньшие нуля... ну подумаю.
    еще раз спасибо)
     
  5. Если честно, не знаком с вашей средой разработки, но это не важно. По поводу этого

    Вам не стоит искать элементы меньше нуля в функции main(). В этом смысла просто нет. Рассмотрим случай если вы все таки решили искать отрицательные элементы в функции main(). Рассмотрим пока самый рациональный вариант с поиском:
    Вам придется организовать цикл для поиска отрицательных элементов в найденной строке, и если такой элемент меньше нуля - переместить его на позицию [последний отрицательный элемент+1]. Далее передать указатель на массив в функцию и обязательно его длину (уже новый параметр, раньше нам хватало одной глобальной переменной для этого - сейчас надо или +1 переменную вводить или передавать в массив новый параметр) или создавать массив длиной (длина строки+1) и на последнее место помещать неотрицательный элемент (это называется поиск с барьером - на последней позиции всегда стоит искомый элемент и можно выполнять цикл до выполнения условия a<=0. Теперь нам не надо передавать дополнительный параметр в функцию).
    В любом случае что мы имеем: нам надо выполнить один цикл в основной функции для сортировки отрицательных элементов сложность О(n) + операции по сортировки, затем передать указатель на этот массив в функции где еще раз выполнить цикл сложения отрицательных элементов сложность O(n).

    Соответственно можно уверенно сделать вывод о том, что текущая реализация более оптимальна, чем гипотетически предложенная.
     
  6. ну это не я виноват - это препод придумывает. в задании написано одно, а он задает еще 30000 вещей прикручивать.

    я в принципе так сделал. не знаю ему прокатит или нет.
    Код:
    x = &a[i_min][0];
    
    for(i=0;i<m;i++)
        if(x[i]<0)
            x[i];
    
     
  7. PHP:
    = &a[i_min][0];

    for(
    i=0;i<m;i++)
        if(
    x[i]<0)
            
    x[i];
    Цикл не несет полезной нагрузки.
    Еще раз перечитав задание следует сделать следующие - надо вывести цикл поиска минимального элемента в столбце в отдельную функцию, которая возвращает значения столбца с минимальным элементом, затем предать его в функцию нахождения суммы отрицательных элементов строки. И 100% не стоит выделять отрицательные элементы в отдельный массив.
    Вот по моему мнению неплохой вариант решения вашей задачи
    PHP:
    #include <iostream>
    #include <stdio.h>
    #include <conio.h>

    int n,m,k;

    int xmin(int **a)
    {
        
    int _min=0;
        for (
    int i=0i<ni++)
            if (
    _min a[i][k])
                
    _min i;
        return 
    _min;
    }

    int xsum(int *a)
    {
        
    int s=0;
        for(
    int i=0;i<m;i++)
            if(
    a[i]<0)
                
    s+=a[i];
        return 
    s;
    }

    int main()
    {
        
    int i,j,**a,*x,sum,i_min=0;
        
    FILE *in;
        if((
    in=fopen("file.dat","r"))==NULL)
        {
            
    printf("\nfile.dat not found.");
            
    getch();
            exit(
    1);
        }
        
    printf("~n & m:");
        
    scanf("%d%d",&n,&m);
        
    printf("~K:");
        
    scanf("%d",&k);
        
    k--;
        
    a=(int**)malloc(n*sizeof(int*));
        
    x=(int*)malloc(m*sizeof(int));
        for(
    i=0;i<n;i++)
        {
            
    a[i]=(int*)malloc(m*sizeof(int));
            for(
    j=0;j<m;j++)
            {
                
    fscanf(in,"%d", &a[i][j]);
                
    printf("%5d",a[i][j]);
            }
            
    printf("\n");
        }
        
    printf("min:%d\n",a[i_min=xmin(a)][k]);
        
    int summa=xsum(&a[i_min][0]);
        
    printf("summa = %d",summa);
        
    getch();
     
  8. спасибо xD хоть бы плюсик вам поставить, а не могу!
     
  9. Подумал я тут и снова решил что это не оптимально - можно проверять наличие минимального элемента сразу в цикле инициализации массива. Это конечно теперь не как функция, но значительно экономит код и процессорное время
    PHP:
    #include <iostream>
    #include <stdio.h>
    #include <conio.h>

    int n,m,k;

    int xsum(int *a)
    {
        
    int s=0;
        for(
    int i=0;i<m;i++)
            if(
    a[i]<0)
                
    s+=a[i];
        return 
    s;
    }

    int main()
    {
        
    int i,j,**a,*x,sum,i_min=0;
        
    FILE *in;
        if((
    in=fopen("file.dat","r"))==NULL)
        {
            
    printf("\nfile.dat not found.");
            
    getch();
            exit(
    1);
        }
        
    printf("~n & m:");
        
    scanf("%d%d",&n,&m);
        
    printf("~K:");
        
    scanf("%d",&k);
        
    k--;
        
    a=(int**)malloc(n*sizeof(int*));
        
    x=(int*)malloc(m*sizeof(int));
        for(
    i=0;i<n;i++)
        {
            
    a[i]=(int*)malloc(m*sizeof(int));
            for(
    j=0;j<m;j++)
            {
                
    fscanf(in,"%d", &a[i][j]);
                
    printf("%5d",a[i][j]);
            }
            if (
    _min a[i][k])
                
    _min i;
            
    printf("\n");
        }
        
    printf("min:%d\n",a[i_min][k]);
        
    int summa=xsum(&a[i_min][0]);
        
    printf("summa = %d",summa);
        
    getch();
    }