ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.

12.05.2009, 19:19
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
ну как вариант отправлять данные блоками например по 10 кб. лучше вообще многопоточность припахать, юзая параметр OVELAPPED. И работать сразу с несколькими блоками за раз. Это спасет от потери скорости в момент конца пересылки одного блока и отправки второго.
|
|
|

12.05.2009, 21:45
|
|
Познающий
Регистрация: 05.03.2007
Сообщений: 99
Провел на форуме: 744734
Репутация:
44
|
|
Помогите решить такую задачку на Си:
Написать подпрограмму сортировки 2-мерного массива целых по столбцам (использовать сумму значений столбца), сохранив эти значения во вспомогательной диагонали массива.
Пробовал сначало сделать подсчёт суммы элементов каждой строки, потом сделать сортировку строк на основании их сумм, но выходила какая-то чушь.
Ещё пробовал задать строки в одномерный массив, тоже не смог сделать.
Вообщем вот что у меня вышло, буду рад помощи =)
Код:
#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();
}
|
|
|

12.05.2009, 23:04
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
Mosvit
дай пример входной матрицы и результата. ибо описание задачи ппц у тебя хромает.
Mozy
try/catch
ps: поцивильнее отформаченый код, ибо с твоим делать что либо банально бесперспективно
Код:
#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");
}
}
|
|
|

13.05.2009, 09:32
|
|
Познающий
Регистрация: 05.03.2007
Сообщений: 99
Провел на форуме: 744734
Репутация:
44
|
|
Сообщение от Ra$cal
Mosvit
дай пример входной матрицы и результата. ибо описание задачи ппц у тебя хромает.
Ну например
Входная матрица:
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 за код спасибо 
|
|
|

13.05.2009, 09:59
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
терь понятно. ща чай допью и сделаю, если никто не потревожит
зы: требование четкое не юзать c++ или это просто так сложилось что лаба на си написана? лень писать самому сортировку, хотел из <algorithm> заюзать, в связке с std::vector. или не канает?
короч если алго думаю понятный. если нада на чистом си - переделаешь. чтобы вводить матрицу с клавы снимешь коммент с //enter_matrix(array);
Код:
#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();
}
Последний раз редактировалось Ra$cal; 13.05.2009 в 11:00..
|
|
|

13.05.2009, 17:50
|
|
Познающий
Регистрация: 05.03.2007
Сообщений: 99
Провел на форуме: 744734
Репутация:
44
|
|
Сообщение от Ra$cal
терь понятно. ща чай допью и сделаю, если никто не потревожит
зы: требование четкое не юзать c++ или это просто так сложилось что лаба на си написана? лень писать самому сортировку, хотел из <algorithm> заюзать, в связке с std::vector. или не канает?
Спасибо конечно, но вообще да, использовать только язык Си. Поэтому не знаю, смогу ли я это всё перевести с языка С++ на C , т.к. очень поверхносто знаю эти языки... Может если будет время, то попробуешь перевести? Да и большинство слов в этом коде для меня как китайская граммота, что-то не припомню чтобы мы в универе что-то подобное делали...
Последний раз редактировалось Mosvit; 13.05.2009 в 17:52..
|
|
|

13.05.2009, 18:40
|
|
Постоянный
Регистрация: 16.08.2006
Сообщений: 640
Провел на форуме: 1354067
Репутация:
599
|
|
ну вся суть алгоритма - структура, которая содержит индекс строки и сумму его элементов. сортируешь массив структур. потом проходишь по массиву и строишь новую матрицу по одной строке, беря ее из исходной.
Последний раз редактировалось Ra$cal; 13.05.2009 в 20:02..
|
|
|

13.05.2009, 20:06
|
|
Познающий
Регистрация: 17.01.2007
Сообщений: 94
Провел на форуме: 528220
Репутация:
65
|
|
В общем у меня новая проблема) Вроде все математически правильно, только вот компилятор неправильно считает. Я уже незнаю в чем может ошибка заключаться. Если я беру числа 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[i])
{
t=(r*16^1+i)-1;
printf("i %d ",i);
printf("Hex %X Decimal %d",t,t);
}
i++;
}
return 1;
}
|
|
|

13.05.2009, 20:21
|
|
Постоянный
Регистрация: 12.04.2007
Сообщений: 413
Провел на форуме: 3578578
Репутация:
275
|
|
CHIP )
дебаг в руки
|
|
|

13.05.2009, 20:28
|
|
Познавший АНТИЧАТ
Регистрация: 16.04.2006
Сообщений: 1,488
Провел на форуме: 2209675
Репутация:
537
|
|
покритикуйте вот этот кусок, пожалуйста:
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 как получить кол-во элементов образовавшегося массива? (перебрать его весь, инкрементируя на попадающихся концах строк?)
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|