30 / 21 / 11
Регистрация: 09.11.2010
Сообщений: 240
1

Прочитать из файла символьный двумерный массив, и отсортировать те строки, в которых имеется символ "/"

02.05.2011, 02:43. Показов 834. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Снова вопрос по сортировке (просто сейчас их разбираю). Задание такое, прочитать из файла символьный двумерный массив, и отсортировать те строки, в которых имеется символ "/" по возрастанию. Всё сделал, код написал, компилируется, считывается массив из файла, но вместо отсортированного массива выводятся иероглифы какие-то, где я мог напортачить?

Вот код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
 
#define n 6
#define m 6
 
int main()
{
    FILE *fp;
    char mas[n][m], i, j, k, fl, temp;
 
    if((fp = fopen ("array.txt", "r+"))== NULL){
        printf("Error for open file!\n");
        exit(1);
    }
 
    printf("Array before sorting\n\n");
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        {
            while(!feof(fp)) {
            fscanf(fp,"%c",&mas[i][j]);
            printf("%2c", mas[i][j]);
            }
        }
 
        for(k=0; k<n; k++) {
            fl=1;
            for(i=0; i<m && fl; i++)
                if(mas[k][i]== '/')
                    fl=0;
 
            if(!fl){
                for(i=0; i<n; i++){
                    temp = mas[k][j];
                    for(j=k-1; j>=0 && mas[k][j]>temp; j--)
                        mas[k][j+1] = mas[k][j];
                    mas[k][j+1] = temp;
                }
            }
        }
        printf("Array after sorting:\n\n");
        for(i=0; i<n; i++)
        {
            for(j=0; j<m; j++)
            {
                printf("%2c", mas[i][j]);
            }
            putchar('\n');
        }
 
        fclose(fp);
        getch();
}
Добавлено через 1 час 6 минут
Есть ещё кто-нибудь, кто знает, или уже спят все? )
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2011, 02:43
Ответы с готовыми решениями:

Прочитать строки из файла в двумерный массив
Доброго времени суток! Вопрос такой. Допустим, есть файл *.txt, в котором такие данные: ...

Символьный массив: найти количество слов, в которых первый и последний символ совпадают
Необходимо найти количество слов, в которых первый и последний символ совпадают. Помогите,а)

Чем отличаются двумерный символьный массив и массив указателей на строки
Двумерный символьный массив и массив указателей на строки. Собственно чем они отличаются? Заранее...

Как запихать строки в двумерный символьный массив?
Есть одна задача: даны N строк вида: Иванов И.И. 30 30 30 0 где первые три числа это количество...

Считать из файла текст и вписать его в двумерный символьный массив
в тексте дан файлик, вида 11111111111 11111110101 1000000s011 10101101011 10101101011...

4
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
02.05.2011, 07:33 2
Цитата Сообщение от Spotter Посмотреть сообщение
выводятся иероглифы какие-то
Еще раз пересмотрите вот эту часть кода:

Цитата Сообщение от Spotter Посмотреть сообщение
C
1
2
3
4
5
6
7
8
for(i=0;i<n;i++)
 for(j=0;j<m;j++)
 {
 while(!feof(fp)) {
 fscanf(fp,"%c",&mas[i][j]);
 printf("%2c", mas[i][j]);
 }
 }
и подумайте почему в mas[0][0] считываются последовательно все символы из файла, а в остальные элементы масссива mas[][] ничего не считывается.

И еще видно, что у Вас неправильная сортировка самих строк, в которых встречается символ "/"
см. комментарии:
C
1
2
3
4
5
6
7
8
                      if(!fl){
                                for(i=0; i<n; i++){// зачем перебирать все строки?
                                        temp = mas[k][j];// а чему равно j ? 
                                        for(j=k-1; j>=0 && mas[k][j]>temp; j--) // этот цикл когда-нибудь будет выполняться с учетом предыдущей строки?
                                                mas[k][j+1] = mas[k][j];
                                        mas[k][j+1] = temp; 
                                }
                        }
и вообще сортировка строки сама по сути неправильная. Я бы на Вашем месте ее убрал бы совсем и написал бы новую.
0
30 / 21 / 11
Регистрация: 09.11.2010
Сообщений: 240
02.05.2011, 19:44  [ТС] 3
valeriikozlov, Извиняюсь, что-то я не совсем всё понял, просто только взялся разбирать сортировки, можно немного подробнее, в чём именно ошибки?

Добавлено через 27 минут
UP///

Добавлено через 40 минут
UP///

Добавлено через 1 час 12 минут
UP\\\

Добавлено через 1 час 14 минут
Неужели никто не может помочь?

Добавлено через 1 час 42 минуты
С выводом проблема устранена, но массив сортируется не так как нужно, что в сортировке не так делаю?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
 
#define n 6
#define m 6
 
int main()
{
        FILE *fp;
        char mas[n][m], i, j, k, fl, temp;
 
        if((fp = fopen ("array.txt", "r+"))== NULL){
                printf("Error for open file!\n");
                exit(1);
        }
 
        printf("Array before sorting\n\n");
        for (i = 0; i < n; i++) {
            for (j = 0; j < m; j++) {
                fscanf(fp, "%c", &mas[i][j]);
                printf("%2c", mas[i][j]);                        
            }
            putchar('\n');
            fgetc(fp);
        }
 
                for(k=0; k<n; k++) {
                        fl=1;
                        for(i=0; i<m && fl; i++)
                                if(mas[k][i]== '/')
                                        fl=0;
 
                        if(!fl){
                                for(i=0; i<m; i++){
                                        temp = mas[k][j];
                                        for(j=k-1; j>=0 && mas[k][j]>temp; j--)
                                                mas[k][j+1] = mas[k][j];
                                        mas[k][j+1] = temp;
                                }
                        }
                }
                   
                printf("Array after sorting:\n\n");
                for(i=0; i<n; i++)
                {
                        for(j=0; j<m; j++)
                        {
                                printf("%2c", mas[i][j]);
                        }
                        putchar('\n');
                }
 
                fclose(fp);
                getch();
}
0
Эксперт С++
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
02.05.2011, 20:56 4
Spotter, Попробуйте сортировку вставкой :
C
1
2
3
4
5
6
7
8
9
                  if(!fl){
                                for(i=0; i<m-1; i++){
                                        int tmp = i;
                                        for(j=i+1; j<m; j++)
                                            if(mas[k][j]<mas[k][tmp])
                                                tmp=j;
                                        temp=mas[k][i]; mas[k][i]=mas[k][tmp]; mas[k][tmp]=temp;
                                }
                        }
1
30 / 21 / 11
Регистрация: 09.11.2010
Сообщений: 240
02.05.2011, 20:58  [ТС] 5
valeriikozlov, Спасибо, уже тот код отладил, там было пару ошибок с индексами )
0
02.05.2011, 20:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.05.2011, 20:58
Помогаю со студенческими работами здесь

Имеется двумерный массив 4х4 заполнить его с клавиатуры отсортировать глав диагональ по возрастанию побочную по убыванию
Как можно сделать это задание векторами через функцию sort, я сижу над этим зданием уже 2 день.

Двумерный массив. Подсчитать количество строк, в которых имеется хотя бы 1 нулевой элемент
СП подсчета строк двумерного массива A(N,M), в которых имеется хотя бы 1 нулевой элемент. Сделал...

как заполнить двумерный символьный массив словами через аргументы командной строки
заполнить двумерный символьный массив словами через аргументы командной строки. Помогите...

Отсортировать символы самого длинного слова из файла в алфавитном порядке, используя символьный массив
Файл:

прочитать массив из файла и отсортировать его по возрастанию
Доброго времени суток! у меня такая задача... прочитать массив из файла и отсортировать его по...

Считать двумерный символьный массив из файла input и просто распечатать его в файл output
Нужно считать двумерный символьный массив из файла input и просто распечатать его в файл output. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru