Помогите решить такую задачку на Си: Написать подпрограмму сортировки 2-мерного массива целых по столбцам (использовать сумму значений столбца), сохранив эти значения во вспомогательной диагонали массива. Пробовал сначало сделать подсчёт суммы элементов каждой строки, потом сделать сортировку строк на основании их сумм, но выходила какая-то чушь. Ещё пробовал задать строки в одномерный массив, тоже не смог сделать. Вообщем вот что у меня вышло, буду рад помощи =) Code: #include <stdio.h> #define M 3 #define N 3 #define MAX 100 // наше ограничение void main(void) { int array[M][N]; // Объявление двумерного массива int i, j; int a; int mas1[M], mas2[M], mas3[M]; // Ввод массива for(i=0;i<M;i++) // цикл по строкам { for(j=0;j<N;j++) // цикл по элементам строки { // Ввод значения элемента массива printf(" A[%d][%d]=", i, j); scanf("%d",&array[i][j]); } } printf("\n"); getch(); //---------------------------------Вывод массива for(i=0;i<M;i++) // цикл по строкам { for(j=0;j<N;j++) // цикл по элементам строки { printf("%4d", array[i][j]); } printf("\n"); } printf("\n"); // ---------- Обработка и вывод for(i=0;i<M;i++) // цикл по строкам { for(j=0;j<N;j++) // цикл по элементам строки { //----- Присваивание элементов строки в одномерный массив mas1[i]=array[0][i]; mas2[i]=array[1][i]; mas3[i]=array[2][i]; printf("%4d", mas1[i]); } printf("\n"); } // ------- Вывод суммы элементов каждой строки массива printf("Summa elemenov strok massiva:\n"); for(i=0;i<M;i++) printf("%4d", array[i][0]); getch(); }
Mosvit дай пример входной матрицы и результата. ибо описание задачи ппц у тебя хромает. Mozy try/catch ps: поцивильнее отформаченый код, ибо с твоим делать что либо банально бесперспективно Code: #include "StdAfx.h" #include <stdio.h> #include <conio.h> #define M 3 #define N 3 #define MAX 100 // наше ограничение void enter_matrix( int array[M][N] ); void print_matrix( int array[M][N] ); void process_matrix( int array[M][N] ); void main(void) { int array[M][N] = {{1,2,3},{4,5,6},{7,8,9}}; // Объявление двумерного массива enter_matrix(array); print_matrix(array); process_matrix(array); printf("Summa elemenov strok massiva:\n"); for(int i=0;i<M;i++) printf("%4d", array[i][0]); _getch(); } void enter_matrix( int array[M][N] ) { for(int i=0;i<M;i++){ for(int j=0;j<N;j++){ printf(" A[%d][%d]=", i, j); scanf("%d",&array[i][j]); } } printf("\n"); _getch(); } void print_matrix( int array[M][N] ) { for(int i=0;i<M;i++){ for(int j=0;j<N;j++){ printf("%4d", array[i][j]); } printf("\n"); } printf("\n"); } void process_matrix( int array[M][N] ) { int mas1[M], mas2[M], mas3[M]; for(int i=0;i<M;i++){ for(int j=0;j<N;j++){ mas1[i]=array[0][i]; mas2[i]=array[1][i]; mas3[i]=array[2][i]; printf("%4d", mas1[i]); } printf("\n"); } }
Code: #include <iostream> using namespace std; int main() { float n; // Enable exceptions in cin. cin.exceptions(ios::badbit | ios::failbit); try { cin >> n; cout << "The value is: " << n << endl; } catch(const ios::failure& ex) { cout << "WTF?! Exception caught! " << ex.what() << endl; // Clear the fail state cin.clear(); } }
Ну например Входная матрица: 4 5 6 1 2 3 7 8 9 Результат: Сортировка по сумме строк: 7 8 9 4 5 6 1 2 3 Запись значений суммы каждой строки в главную диагональ: 15 5 6 1 6 3 7 8 24 P.S за код спасибо
терь понятно. ща чай допью и сделаю, если никто не потревожит зы: требование четкое не юзать c++ или это просто так сложилось что лаба на си написана? лень писать самому сортировку, хотел из <algorithm> заюзать, в связке с std::vector. или не канает? короч если алго думаю понятный. если нада на чистом си - переделаешь. чтобы вводить матрицу с клавы снимешь коммент с //enter_matrix(array); Code: #include "StdAfx.h" #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <algorithm> #include <vector> #include <iostream> #define M 3 #define N 3 #define MAX 100 // наше ограничение struct row_info{ row_info(int _index, int _summ){ index = _index; summ = _summ; }; int index; int summ; }; typedef std::vector<row_info*> ROW_INFO_VECTOR; bool greater ( row_info* elem1, row_info* elem2 ) { return elem1->summ > elem2->summ; } void enter_matrix( int array[M][N] ); void print_matrix( const int array[M][N] ); void process_matrix( int array[M][N] ); void analyze_matrix(const int array[M][N], ROW_INFO_VECTOR& row_infos); void print_vector (const ROW_INFO_VECTOR& row_infos); void sort_matrix (const int src_matrix[M][N], int dst_matrix[M][N], const ROW_INFO_VECTOR& row_infos); void fix_diagonal (int array[M][N], const ROW_INFO_VECTOR& row_infos); void clear_row_infos (ROW_INFO_VECTOR& row_infos); void main(void) { int array[M][N] = {{4,5,6},{1,2,3},{7,8,9}}; // Объявление двумерного массива //enter_matrix(array); print_matrix(array); process_matrix(array); _getch(); } void enter_matrix( int array[M][N] ) { for(int i=0;i<M;i++){ for(int j=0;j<N;j++){ printf(" A[%d][%d]=", i, j); scanf("%d",&array[i][j]); } } printf("\n"); _getch(); } void print_matrix( const int array[M][N] ) { for(int i=0;i<M;i++){ for(int j=0;j<N;j++){ printf("%4d", array[i][j]); } printf("\n"); } printf("\n"); } void process_matrix( int array[M][N] ) { ROW_INFO_VECTOR row_infos; analyze_matrix(array, row_infos); print_vector(row_infos); std::sort(row_infos.begin(), row_infos.end(), greater); print_vector(row_infos); int sorted_array[M][N]; sort_matrix(array, sorted_array, row_infos); print_matrix(sorted_array); fix_diagonal(array, row_infos); print_matrix(array); clear_row_infos(row_infos); } void analyze_matrix( const int array[M][N], ROW_INFO_VECTOR& row_infos ) { for(int i=0;i<M;i++){ row_infos.push_back(new row_info(i, 0)); for(int j=0;j<N;j++){ row_infos[i]->summ += array[i][j]; } } } void sort_matrix (const int src_matrix[M][N], int dst_matrix[M][N], const ROW_INFO_VECTOR& row_infos) { for(unsigned int row_index = 0; row_index < row_infos.size(); row_index++){ int cur_row = row_infos[row_index]->index; for(int column = 0; column < N; column++){ dst_matrix[row_index][column] = src_matrix[cur_row][column]; } } } void fix_diagonal (int array[M][N], const ROW_INFO_VECTOR& row_infos) { for(unsigned int row_index = 0; row_index < row_infos.size(); row_index++){ int index = row_infos[row_index]->index; int summ = row_infos[row_index]->summ; array[index][index] = summ; } } void print_vector (const ROW_INFO_VECTOR& row_infos) { for(unsigned int i = 0; i < row_infos.size(); i++){ std::cout << "index - " << row_infos[i]->index << " summ - " << row_infos[i]->summ << std::endl; } std::cout << std::endl; } void clear_row_infos (ROW_INFO_VECTOR& row_infos) { for(unsigned int i = 0; i < row_infos.size(); i++){ row_info* cur = row_infos[i]; delete cur; } row_infos.clear(); }
Спасибо конечно, но вообще да, использовать только язык Си. Поэтому не знаю, смогу ли я это всё перевести с языка С++ на C , т.к. очень поверхносто знаю эти языки... Может если будет время, то попробуешь перевести? Да и большинство слов в этом коде для меня как китайская граммота, что-то не припомню чтобы мы в универе что-то подобное делали...
ну вся суть алгоритма - структура, которая содержит индекс строки и сумму его элементов. сортируешь массив структур. потом проходишь по массиву и строишь новую матрицу по одной строке, беря ее из исходной.
В общем у меня новая проблема) Вроде все математически правильно, только вот компилятор неправильно считает. Я уже незнаю в чем может ошибка заключаться. Если я беру числа 16ные до FF то все нормально работает и преобразуется, но если попадается FF то я получаю странный результат, может кто нить помочь разобраться? #include <stdio.h> unsigned int i,k,r,p,t; unsigned char ch1,ch2; char array[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 int main (void) { ch1='6'; // starshii ch2='A'; // mladshii i=k=0; while(k<17) { if(ch1==array[k]) { r=k; printf("k %d ",k); } k++; } while(i<17) { if(ch2==array) { t=(r*16^1+i)-1; printf("i %d ",i); printf("Hex %X Decimal %d",t,t); } i++; } return 1; }
покритикуйте вот этот кусок, пожалуйста: PHP: char *qs = new char; // выделили место под новую строку (4 байта? надо ли указывать размер?) strcpy(qs, "string1"); // внесли туда строку char *m = new char; // строка 2 strcpy(m, "string2"); // строка 2 char *mp[10]; // создали массив указателей на строки (хотелось бы неограниченный) int n = 0, i = 0; mp[n++] = qs2; // внесли указатель на первую строку mp[n++] = m; // внесли указатель на вторую строку while(n--) cout << mp[i++] << endl; // вывели строки (немного извращённо) Основные вопросы: 0 правильно ли я вношу строку в память? 1 как определить массив указателей на строки без указания размера? 2 правильно ли я добавляю элемент в массив? (вроде нет) 3 как получить кол-во элементов образовавшегося массива? (перебрать его весь, инкрементируя на попадающихся концах строк?)
0) нет ты выделяешь память только под один char, правильно надо указывать размеры массива char[quantity]; 1) char** pList; а дальше выделяешь память для массива указателей где то записывать. З.Ы. код вроде корректен, но не дай боже в нем кому то разбиратся)) все можно было написать гораздо проще)
char** strings; но вообще лучше не использовать char* по возможности. благо есть std::string или CString в atl, который аналогичен mfc'шному CString, но работает в проектах без мфц. массивы же менять на вектора. а указатели, как я уже упоминал, заменять на boost::shared_ptr. хорошо помогает от утечек памяти.
Вообщем сделал я свою программу , только осталась одна загвостка, она правильно сортирует строки только тогда когда строго сумма первой строки массива<2-ой строки<суммы 3-ей строки А если наприер сумма второй строки самая большая, то уже считает с ошибкой. Сделал по-принципу: присвоил temp1,temp2,temp3 сумму каждой строки, потом сделал проврку с циклом, типа если temp1<temp2, то поменять строки местами. Вот код: Сортировать должен сверху самая большая сумма, ниже меньше Code: #include <stdio.h> #define M 3 #define N 3 #define MAX 100 // наше ограничение void main(void) { int mas[M][N]; // Объявление двумерного массива int temp[M]; int i,j,temp1,temp2,temp3; // Ввод массива for(i=0;i<M;i++) // цикл по строкам { for(j=0;j<N;j++) // цикл по элементам строки { // Ввод значения элемента массива printf(" A[%d][%d]=", i, j); scanf("%d",&mas[i][j]); } } printf("\n"); getch(); //---------------------------------Вывод массива printf("Ishodniy massiv:"); printf("\n"); for(i=0;i<M;i++) // цикл по строкам { for(j=0;j<N;j++) // цикл по элементам строки { printf("%4d", mas[i][j]); } printf("\n"); } printf("\n"); // ---------- Обработка и вывод printf("Otsortirovaniy massiv:\n"); for(i=0; i<=M-2; i++) { temp1=0; temp2=0; for(j=0; j<=N; j++) { temp1=temp1+mas[i][j]; temp2=temp2+mas[i+1][j]; temp3=temp3+mas[i+2][j]; if (temp2<temp3) { for(j=0; j<=N-1; j++) { temp[i]=mas[i+1][j]; mas[i+1][j]=mas[i+2][j]; mas[i+2][j]=temp[i]; } } if (temp2<temp1) { for(j=0; j<=N-1; j++) { temp[i]=mas[i+1][j]; mas[i+1][j]=mas[i][j]; mas[i][j]=temp[i]; } } if (temp1<temp2) { for(j=0; j<=N-1; j++) { temp[i]=mas[i][j]; mas[i][j]=mas[i+1][j]; mas[i+1][j]=temp[i]; } } if (temp2<temp3) { for(j=0; j<=N-1; j++) { temp[i]=mas[i+1][j]; mas[i+1][j]=mas[i+2][j]; mas[i+2][j]=temp[i]; } } for (i=0;i<M;i++) { for (j=0;j<N;j++) { printf("%4d",mas[i][j]); } printf("\n"); getch(); } } } /*for (i=0;i<M;i++) { for (j=0;j<N;j++) { printf("%4d",mas[i][j]); } printf("\n"); getch(); }*/ /*// ------- Вывод суммы элементов каждой строки массива printf("Summa elemenov strok massiva:\n"); for(i=0;i<M;i++) printf("%4d", mas[i][0]); getch();*/ }
Помогите пожалуйста сделать лабу на Turbo pascal Условие: "В заданном пользователем масиве целых чисел найти среднее арифметическое максимального и минимального элементов. Отсортировать полученый масив по условию возростания модуля отклонения его элементов от найденого среднего арифметического. Вывести входящий, конечный масивы и найденое среднее арифметическое." Заранее спасибо!
Mosvit - эпично накалякал =))))))) попробуй погуглить на тему сортировка пузырьком. зы: и учись разделять блоки кода на функции. именно для этого они и придуманы. а комменты вида //---------------------------------Вывод массива очень хорошо говорят нам о том, что этот блок кода должен быть функцией.
PHP: typedef char * pChar; int main() { // 1 enter string pChar buffer = new char(50); strcpy(buffer, "123456"); // 2 set end pointer pChar endPointer = buffer; while(*endPointer++); *endPointer--; *endPointer--; // 3 get length unsigned int len = strlen(buffer); // 4 cout string while(len--) cout << *endPointer--; return 1; } вкратце. программа выделяет память под строку, вносит туда строку, создаёт ещё один указатель, перематывает его в конец строки, определяет длину строки и в цикле выводит строку в обратном порядке. но если убрать эти два декремента: PHP: *endPointer--; *endPointer--; программа выводит два квадратика, а потом 6543.. что тут не так? функции реверса строк не предлагать, я хочу научиться писать их сам
А так нельзя разве? Code: char *buffer = new char(50); strcpy(buffer, "123456"); int len = strlen(buffer); while(len--)cout<<buffer[len];
потому что даже после сравнения с нулем будет инкремент указателя. точнее в момент сравнения с нулем. как бы это объяснить по человечески... минусы использования декрементов и инкрементов в местах не очень для них подходящих... не юзай кароч таких конструкций, и будет все нормально. Code: #include <iostream> using namespace std; typedef char * pChar; int main() { // 1 enter string pChar buffer = new char(50); strcpy(buffer, "123456"); // 2 set end pointer pChar endPointer = buffer + strlen(buffer) - 1; // 4 cout string while(endPointer >= buffer) cout << *endPointer--; return 1; }
дайте лит-ру по ГУИ интерфейсу. или подскажите как реализовать: 1)считывание цифр из тексбокса 2) выполнение операций над ними (нарпимер сложение) 3)вывод результата P.S. Нужно реализовать вот это Code: #include <stdio.h> #include <stdlib.h> int main(void) { int i; char buffer[500]; printf("Enter a number: "); scanf("%o", &i); itoa(i,buffer,10); printf("decimal: %s\n", buffer); itoa(i,buffer,16); printf("hexadecimal: %s\n", buffer); itoa(i, buffer, 2); printf("binary: %s\n", buffer); return 0; } на гуи