Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> приведение типов 
V
    Опции темы
qw1mb0
Дата 14.2.2012, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Вообщем есть такая программа, спасибо форумчанам которые помогли ее осилить:
Но есть непонятки с сотировкой методом вставок:
Код

#include <stdio.h>
#include <string.h>
#define MAXLINE 100
struct filel{
    char name[10];
    char type[4];
    char date[10];
    unsigned int treatment;
    unsigned int syze;
    char modify[5];
    }filel_list[100];
void main(void)
{
struct filel filel_list[100];
char s[100];
int i=0,p=0;
FILE *file, *out;
//out = fopen("lab3out.txt","w");
file = fopen("lab3.txt","rt");
while(fgets(s, MAXLINE, file)){
printf("%s",s);
sscanf(s,"%s %s %s %u %u %s",filel_list[i].name, filel_list[i].type, filel_list[i].date,&filel_list[i].treatment, &filel_list[i].syze, filel_list[i].modify);
i++;
}
}
int x,y;
char *temp;

for (x=1;x<i;x++){
    temp = filel_list[x].name;
    for(y=x-1;y>=0;y--){
        if(strcmp(filel_list[y].name,temp)<0 || strcmp(filel_list[y].name,temp)==0){
            break;
        }
        filel_list[y+1].name = filel_list[y].name;
    }
filel_list[y+1].name = temp;
}
for(p=0;p<i;p++){
printf("%s\n",&filel_list[p].name);
}    
fclose(file);
}

Выдает ошибки компиляции в строках: 
Код
    filel_list[y+1].name = filel_list[y].name;
 и 
Код
filel_list[y+1].name = temp;

error: incompatible types when assigning to type 'char[10]' from type  'char *' 
Понимаю что проблема из-за объявления в структуре ссылочного массива char name[10].
Но если заменяю ее на char *name.
Происходит аварийное завершение работы в цикле чтения из файла входных данных.
Посоветуйте пожалуйста, куда копать
PM MAIL ICQ Skype   Вверх
borisbn
Дата 14.2.2012, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



qw1mb0, в Си, который ты используешь, в отличие от Си++ нет строк как таковых. Есть только указатель на char, который указывает на первый символ строки. Концом же строки является байт, в котором записан 0.
Цитата

H e l l o 0
^
|
-------- указатель на начало

для того, чтобы сравнивать или копировать такие "строки" существуют специальные функции - strcmp и strcpy соответственно.
Таким образом, для копировния "строки" filel_list[y].name в "строку" filel_list[y+1].name нужно
Код
strcpy( filel_list[y+1].name, filel_list[y].name );

а ещё лучше (хотя бы для начала) пользоваться не Си, а Си++, т.е. "настоящими" строками


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
qw1mb0
Дата 14.2.2012, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Нужно именно Си. Без Си ++

Добавлено через 6 минут и 4 секунды
Подправил.
при входных данных:

Filename exe 12.12.12 32 1282 82.32
filename exe 12.13.14 23 12452 21.12
lab4 exe 12.43.12 42 12423 12.43
lab3 dir 12.24.21 12 1252 12.65
lab1 exe 12.24.12 12 1242 12.35

Выводом является:
Filename
filename
lab4
lab4
lab4
lab4

В коде заменил Две строки которые я выделля в 1 посте, к такому виду как вы предлагаете. 
strcpy
PM MAIL ICQ Skype   Вверх
bsa
Дата 14.2.2012, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



qw1mb0, почитай это.
И имей в виду, что функция main должна возвращать int. В противном случае, твоя программа не соберется современным компилятором.
PM   Вверх
borisbn
Дата 14.2.2012, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(qw1mb0 @  14.2.2012,  21:18 Найти цитируемый пост)
Подправил.

Цитата(qw1mb0 @  14.2.2012,  21:18 Найти цитируемый пост)
В коде заменил Две строки

и чо ?
честно признаюсь - нет желания разбираться в программе. Скажешь что не так... где ошибка - вил си, а так...

Это сообщение отредактировал(а) borisbn - 14.2.2012, 22:09


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
feodorv
Дата 14.2.2012, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(qw1mb0 @  14.2.2012,  20:26 Найти цитируемый пост)
char s[100];

Цитата(qw1mb0 @  14.2.2012,  20:26 Найти цитируемый пост)
fgets(s, MAXLINE, file)

Тут что-нибудь одно:
Код

char s[100];
fgets(s, 100, file);
или
Код

char s[MAXLINE];
fgets(s, MAXLINE, file);

Почему? Потому что RTFM)))


А это вообще комлится ли?
Цитата(qw1mb0 @  14.2.2012,  20:26 Найти цитируемый пост)
}
}

Последняя } закрывает main()...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
qw1mb0
Дата 14.2.2012, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Цитата

А это вообще комлится ли?
Цитата(qw1mb0 @  14.2.2012,  20:26 )
}
}

Последняя } закрывает main()... 


Забыл убрать скобочку из вывода всех элементов smile Да все компилится:

Код

#include <stdio.h>
#include <string.h>
#define MAXLINE 100
struct filel{
    char name[10];
    char type[4];
    char date[10];
    unsigned int treatment;
    unsigned int syze;
    char modify[5];
    }filel_list[100],temp;
int main(void)
{
struct filel filel_list[100];
char s[100];
int i=0,p=0;
FILE *file, *out;
//out = fopen("lab3out.txt","w");
file = fopen("lab3.txt","rt");
while(fgets(s, MAXLINE, file)){
printf("%s",s);
sscanf(s,"%s %s %s %u %u %s",filel_list[i].name, filel_list[i].type, filel_list[i].date,
&filel_list[i].treatment, &filel_list[i].syze, filel_list[i].modify);

i++;
}
printf("\n");
printf("Filename:\tType:\tDate:\t\tTreatment:\tSize:\tModify:\n");
for(p=0;p<3;p++){
printf("%s\t%s\t%s\t%u\t\t%u\t%s\n", filel_list[p].name, filel_list[p].type, filel_list[p].date, filel_list[p].treatment, filel_list[p].syze, filel_list[p].modify);

}
printf("\n");
int x,y;
char *temp;
for (x=1;x<i;x++){
    temp = filel_list[x].name;
    for(y=x-1;y>=0;y--){
        if(strcmp(filel_list[y].name,temp)<0 || strcmp(filel_list[y].name,temp)==0){
            break;
        }else{
        strcpy(filel_list[y+1].name,filel_list[y].name);
    }
    }
strcpy(filel_list[y+1].name,temp);
}
for(p=0;p<i;p++){
printf("%s\n",&filel_list[p].name);
}    
fclose(file);
}

PM MAIL ICQ Skype   Вверх
feodorv
Дата 14.2.2012, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(qw1mb0 @  14.2.2012,  23:46 Найти цитируемый пост)
printf("\n");
int x,y;
char *temp;

Тогда какой же это Си? smile

Добавлено через 2 минуты и 12 секунд
Цитата(qw1mb0 @  14.2.2012,  23:46 Найти цитируемый пост)
if(strcmp(filel_list[y].name,temp)<0 || strcmp(filel_list[y].name,temp)==0)

Ха. Почему так странно?
Код

if(strcmp(filel_list[y].name,temp)<=0)


Добавлено через 4 минуты и 25 секунд
Цитата(qw1mb0 @  14.2.2012,  23:46 Найти цитируемый пост)
strcpy(filel_list[y+1].name,filel_list[y].name);

Наверное, всё же нужно менять всё содержимое структуры, а не только name smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
qw1mb0
Дата 15.2.2012, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Непутевый студент
*


Профиль
Группа: Участник
Сообщений: 79
Регистрация: 24.4.2010
Где: Севастополь

Репутация: нет
Всего: нет



Тоже думал об этом, дошел до:
Код

int x,y;
char *temp;
for (x=1;x<i;x++){
    temp = filel_list[x].name;
    for(y=x-1;y>=0;y--){
        if(strcmp(filel_list[y].name,temp)<=0){
            break;
        }else{
        filel_list[y+1]=filel_list[y];
    }
    }
filel_list[y+1]=filel_list[x];
}

Вывод тот же

Это сообщение отредактировал(а) qw1mb0 - 15.2.2012, 00:23
PM MAIL ICQ Skype   Вверх
feodorv
Дата 15.2.2012, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(qw1mb0 @  15.2.2012,  00:22 Найти цитируемый пост)
Вывод тот же

Цитата(qw1mb0 @  15.2.2012,  00:22 Найти цитируемый пост)
filel_list[y+1]=filel_list[y];

Ну так содержимое filel_list[y+1] пропадает и целиком заменяется содержимым filel_list[y]...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1291 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.