Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2014, 17:27   #1
mital25
Пользователь
 
Регистрация: 06.03.2014
Сообщений: 28
По умолчанию Прошу помощи с лабораторной на си

вот мой код в нем не правильно работает задание 2 в 5 кейсе и не могу понять как надо написать задание 1 в 4 кейсе
вот задания
Характеристикой столбца целочисленной матрицы назовем сумму модулей его
отрицательных нечетных элементов.
1) Переставляя столбцы заданной матрицы, расположить их в соответствии с ростом
характеристик.
2) Найти сумму элементов в тех столбцах, которые содержат хотя бы один
отрицательный элемент.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
#include <windows.h>
#include <malloc.h>

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    int **a;
    int *b;
    int *c;
    int n;
    int i;
    int m;
    int j;
    int k;
    int tmp;
    int item;


    bool f = true;

    printf("....:Вас приветствует 4 лабораторная 8 вариант:....\n");
    printf("Введите число элементов массива\n");
    scanf("%d%d", &n,&m);
    a = (int**)calloc(n, sizeof(int*));   // 1
    a[0] = (int*)calloc(n*m, sizeof(int));  // 2

    b = (int*)calloc(m, sizeof(int)); // характеристики

    c = (int*)calloc(m, sizeof(int)); // суммы
    while(f){
        printf("\nВыберите режим работы\n");
        printf("0 - Выход из программы\n");
        printf("1 - Ввод элементов массива с клавиатуры\n");
        printf("2 - Вывести матрицу на экран\n");
        printf("3 - Вывести характеристику столбцов\n");
        printf("4 - Задание 1\n");
        printf("5 - Задание 2\n");


        scanf("%d", &item);

        switch(item){
//      Выход из программы
        case 0:
            f = false;
        break;

//      Считывание элементов массива с клавиатуры
        case 1:


    for ( i = 1; i < n; ++i)        // 3
        a[i] = a[0] + i*m;

            if(!a){
                printf("Недостаточно памяти!\n");
                getchar();
                return 1;
            }
            for(i=0; i < n; i++)
                for(j=0; j < m; j++)
                {
                    printf("a[%d][%d] = ", i, j);
                    scanf("%d", &a[i][j]);
                }

                for(i=0; i < m; i++)
                  for(j=0; j < n; j++)
                  {
                    if(a[j][i] < 0)
                    {
                        tmp = abs(a[j][i]);
                        if(tmp % 2 != 0)
                            b[i] += tmp;
                    }
                  }

                break;

        case 2:
            for(i=0; i < n; i++)
            {

                for(j=0; j < m; j++)
                    printf( "%-7d ", a[i][j]);
                printf("\n");
            }
           break;
        case 3:
            printf("характеристика столбцов");
            printf("\n");
            for(i=0; i < m; i++)
                printf("%-7d \n", b[i]);
            break;
        case 4:
             printf("Задание 1\n");


                break;
                 
                 case 5:
             printf("Задание 2\n");

                  for(i=0; i < m; i++)
                  {
                    if(b[i] != 0)
                    {
                        for(j = 0; j < m; ++j)
                            for(k = 0; k < n; ++k)
                            c[i] += a[k][j]; // суммируем столбец

                    }
                  }
                  printf("%d\n",c[i]);

                break;


                default:
            printf("Неверный пункт меню!!!\n");
        }
    }

    printf("Работа программы завершена\n");
    free(a);
    getchar();
    return 0;
}
прошу помогите кто чем может) завтра сдавать а я уже всю голову сломал
mital25 вне форума Ответить с цитированием
Старый 23.12.2014, 17:56   #2
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

я тебя еще раз спрашиваю, что это значит:
Код:
 a = (int**)calloc(n, sizeof(int*));   // 1
    a[0] = (int*)calloc(n*m, sizeof(int));  // 2
Напиши развернутое словесное описание данных строчек.
Smogg вне форума Ответить с цитированием
Старый 23.12.2014, 18:01   #3
mital25
Пользователь
 
Регистрация: 06.03.2014
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
я тебя еще раз спрашиваю, что это значит:
Код:
 a = (int**)calloc(n, sizeof(int*));   // 1
    a[0] = (int*)calloc(n*m, sizeof(int));  // 2
Напиши развернутое словесное описание данных строчек.
1 строчка это я выделяю динамическую память для массива а
На втором шаге по адресу первого элемента массива указателя размещается
массив чисел размера n*m.
mital25 вне форума Ответить с цитированием
Старый 23.12.2014, 18:20   #4
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от mital25 Посмотреть сообщение
1 строчка это я выделяю динамическую память для массива а
На втором шаге по адресу первого элемента массива указателя размещается
массив чисел размера n*m.
чудесно, и на фига тебе тогда все остальные элементы массива а, в количестве n-1 штук, ежели матрица вся засунута в 0-й элемент?

Я, конечно, допускаю, что твой подход работает, ибо не компилял, но тогда прошу, из любопытства и в целях самообразования, объяснить, как происходит обращение к элементу a[i][j];

UPD а слона то я и не заметил...

Цитата:
На втором шаге по адресу первого элемента массива указателя размещается
массив чисел размера n*m.
На самом деле, на втором шаге в первый элемент массива помещается указатель на выделенную память, а не размещается массив чисел размера n*m.

Последний раз редактировалось Smogg; 23.12.2014 в 18:41.
Smogg вне форума Ответить с цитированием
Старый 23.12.2014, 18:41   #5
mital25
Пользователь
 
Регистрация: 06.03.2014
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
чудесно, и на фига тебе тогда все остальные элементы массива а, в количестве n-1 штук, ежели матрица вся засунута в 0-й элемент?

Я, конечно, допускаю, что твой подход работает, ибо не компилял, но тогда прошу, из любопытства и в целях самообразования, объяснить, как происходит обращение к элементу a[i][j];
способ самовыражения за счет новичков?

Последний раз редактировалось mital25; 23.12.2014 в 18:51.
mital25 вне форума Ответить с цитированием
Старый 23.12.2014, 18:52   #6
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от mital25 Посмотреть сообщение
это допрос?или способ самовыражения за счет новичков?
это про то, что С достаточно хитрая штука и я вполне допускаю, что даже в самых начальных понятиях скрыты странные и удивительные не известные мне происшествия:
Код:
#include <cstdio>

int main(int argc, char* argv[])
{
	int i=0, gw[1] = {234};
	printf("%d\n", gw[i]);
	printf("%d\n", i[gw]);

	return 0;
}
кароч, надо выделить память под массив указателей на указатели а, размерoм n. Затем надо n раз выделить память размером m * sizeof(int) и присвоить указатель на выделенную память соответствующему элементу массива а. Лишь так можно затем обращаться по способу a[i][j]. А если выделять память под матрицу единым блоком, то обращение к элементу должно быть вида a[i*m + j];

Последний раз редактировалось Smogg; 23.12.2014 в 19:02.
Smogg вне форума Ответить с цитированием
Старый 23.12.2014, 18:57   #7
mital25
Пользователь
 
Регистрация: 06.03.2014
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Smogg Посмотреть сообщение
это про то, что С достаточно хитрая штука и я вполне допускаю, что даже в самых начальных понятиях скрыты странные и удивительные не известные мне происшествия:
Код:
#include <cstdio>

int main(int argc, char* argv[])
{
	int i=0, gw[1] = {234};
	printf("%d\n", gw[i]);
	printf("%d\n", i[gw]);

	return 0;
}
я вас понял подскажите могу ли я в 1 ом задании использовать сортировку подсчетом или нет?
mital25 вне форума Ответить с цитированием
Старый 23.12.2014, 18:58   #8
mital25
Пользователь
 
Регистрация: 06.03.2014
Сообщений: 28
По умолчанию

походу нет так как диапазон от 0 до maxv-1
mital25 вне форума Ответить с цитированием
Старый 23.12.2014, 19:15   #9
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от mital25 Посмотреть сообщение
походу нет так как диапазон от 0 до maxv-1
Ага. Для сортировки подсчетом нужен миллион элементов не больших тысячи, а не 1000 элементов, не больших миллиона.
Smogg вне форума Ответить с цитированием
Старый 23.12.2014, 19:27   #10
mital25
Пользователь
 
Регистрация: 06.03.2014
Сообщений: 28
По умолчанию

тогда стоит использовать метод пузырька.да я что то ни хрена не могу понять что делать с этим гребаным вариантом не хочет ни считать не переставляться
mital25 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прошу помощи(( Fransuz_F Общие вопросы Delphi 3 25.02.2014 10:24
Прошу помощи Пупсончик PHP 11 12.01.2014 10:42
прошу помощи ex-hack Помощь студентам 2 05.06.2009 15:54