[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. Mosvit

    Mosvit Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    86
    Likes Received:
    16
    Reputations:
    1
    Помогите решить такую задачку на Си:
    Написать подпрограмму сортировки 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();
    }
     
  2. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    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");
    	}
    }
     
    1 person likes this.
  3. pento

    pento Elder - Старейшина

    Joined:
    3 Jul 2006
    Messages:
    126
    Likes Received:
    24
    Reputations:
    -1
    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. Mosvit

    Mosvit Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    86
    Likes Received:
    16
    Reputations:
    1
    Ну например
    Входная матрица:
    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 за код спасибо :)
     
  5. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    терь понятно. ща чай допью и сделаю, если никто не потревожит

    зы: требование четкое не юзать 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();
    }
     
    #2945 Ra$cal, 13 May 2009
    Last edited: 13 May 2009
  6. Mosvit

    Mosvit Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    86
    Likes Received:
    16
    Reputations:
    1
    Спасибо конечно, но вообще да, использовать только язык Си. Поэтому не знаю, смогу ли я это всё перевести с языка С++ на C , т.к. очень поверхносто знаю эти языки... Может если будет время, то попробуешь перевести? Да и большинство слов в этом коде для меня как китайская граммота, что-то не припомню чтобы мы в универе что-то подобное делали...
     
    #2946 Mosvit, 13 May 2009
    Last edited: 13 May 2009
  7. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    ну вся суть алгоритма - структура, которая содержит индекс строки и сумму его элементов. сортируешь массив структур. потом проходишь по массиву и строишь новую матрицу по одной строке, беря ее из исходной.
     
    #2947 Ra$cal, 13 May 2009
    Last edited: 13 May 2009
  8. CHIP:))

    CHIP:)) Elder - Старейшина

    Joined:
    17 Jan 2007
    Messages:
    81
    Likes Received:
    18
    Reputations:
    -3
    В общем у меня новая проблема) Вроде все математически правильно, только вот компилятор неправильно считает. Я уже незнаю в чем может ошибка заключаться. Если я беру числа 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;
    }
     
  9. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    CHIP:))
    дебаг в руки
     
  10. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    покритикуйте вот этот кусок, пожалуйста:

    PHP:
        char *qs = new char// выделили место под новую строку (4 байта? надо ли указывать размер?)
        
    strcpy(qs"string1"); // внесли туда строку

        
    char *= new char// строка 2
        
    strcpy(m"string2"); // строка 2

        
    char *mp[10]; // создали массив указателей на строки (хотелось бы неограниченный)

        
    int n 00;

        
    mp[n++] = qs2// внесли указатель на первую строку
        
    mp[n++] = m// внесли указатель на вторую строку

        
    while(n--)
            
    cout << mp[i++] << endl// вывели строки (немного извращённо)

    Основные вопросы:

    0 правильно ли я вношу строку в память?
    1 как определить массив указателей на строки без указания размера?
    2 правильно ли я добавляю элемент в массив? (вроде нет)
    3 как получить кол-во элементов образовавшегося массива? (перебрать его весь, инкрементируя на попадающихся концах строк?)
     
  11. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    0) нет
    ты выделяешь память только под один char, правильно надо указывать размеры массива char[quantity];
    1) char** pList; а дальше выделяешь память для массива указателей
    где то записывать.
    З.Ы. код вроде корректен, но не дай боже в нем кому то разбиратся)) все можно было написать гораздо проще)
     
  12. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    C или C++?
    Если C+, то юзать вектор.

    some_vector.push_bask(element)
     
  13. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    char** strings;
    но вообще лучше не использовать char* по возможности. благо есть std::string или CString в atl, который аналогичен mfc'шному CString, но работает в проектах без мфц. массивы же менять на вектора. а указатели, как я уже упоминал, заменять на boost::shared_ptr. хорошо помогает от утечек памяти.
     
  14. Mosvit

    Mosvit Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    86
    Likes Received:
    16
    Reputations:
    1
    Вообщем сделал я свою программу , только осталась одна загвостка,
    она правильно сортирует строки только тогда когда строго сумма первой строки массива<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();*/
    }
    
    
     
  15. Etesian

    Etesian New Member

    Joined:
    13 May 2009
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Помогите пожалуйста сделать лабу на Turbo pascal
    Условие:
    "В заданном пользователем масиве целых чисел найти среднее арифметическое максимального и минимального элементов. Отсортировать полученый масив по условию возростания модуля отклонения его элементов от найденого среднего арифметического. Вывести входящий, конечный масивы и найденое среднее арифметическое."
    Заранее спасибо!
     
  16. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    Mosvit - эпично накалякал =))))))) попробуй погуглить на тему сортировка пузырьком.
    зы: и учись разделять блоки кода на функции. именно для этого они и придуманы. а комменты вида
    //---------------------------------Вывод массива
    очень хорошо говорят нам о том, что этот блок кода должен быть функцией.
     
  17. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    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..

    что тут не так?
    функции реверса строк не предлагать, я хочу научиться писать их сам
     
  18. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    А так нельзя разве?
    Code:
        char *buffer = new char(50);
        strcpy(buffer, "123456");
        int len = strlen(buffer);
        while(len--)cout<<buffer[len];
    
     
    _________________________
  19. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    потому что даже после сравнения с нулем будет инкремент указателя. точнее в момент сравнения с нулем. как бы это объяснить по человечески... минусы использования декрементов и инкрементов в местах не очень для них подходящих... не юзай кароч таких конструкций, и будет все нормально.

    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;
    }  
     
  20. s_p_a_m

    s_p_a_m Elder - Старейшина

    Joined:
    8 Feb 2008
    Messages:
    100
    Likes Received:
    58
    Reputations:
    4
    дайте лит-ру по ГУИ интерфейсу. или подскажите как реализовать:

    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;                            
    }
    на гуи :(
     
    #2960 s_p_a_m, 17 May 2009
    Last edited: 17 May 2009
Thread Status:
Not open for further replies.