Guard Опубликовано 1 октября, 2006 Жалоба Поделиться Опубликовано 1 октября, 2006 Функция sp в приведенном коде не пашет. Почему - непонятно. #include <stdio.h> #include <conio.h> #include <string.h> #define N 20 struct car{ char reg_number[20]; char *car_model; int probeg; }; car *D; // Указатель на ДМ строк таблицы int n=0,sz=10; // кол-во строк и размерность ДМ (глобальные) void extend(){ // проверка на переполнение ДМ и расширение if (n!=sz) return; sz=sz*2; car *q=new car[sz]; for (int i=0;i<sz/2;i++) q=D; delete D; D=q; } void add(){ extend(); // не переполнен ли ДМ printf("\nRegistration number:"); scanf("%s",D[n].reg_number); char c[80]; gets©; // читать оставшийся \n из входного потока printf("\nModel of car:"); gets©; D[n].car_model=strdup©; // копия строки в ДМ printf("\nWay:"); scanf("%d", &D[n].probeg); n++; } int get_num(){ int m; do { printf("\nn="); scanf("%d",&m); } while (m<1 || m>n); return m-1; } void show(){ printf("\n\nN Registration number\t\tWay\tModel\n"); printf("--------------------------------------------------\n"); for (int i=0;i<n;i++){ printf("%-3d %-20s",i+1,D.reg_number); printf("\t%d\t", D.probeg); printf("%s\n",D.car_model); if((i+1)%20==0) getch(); } } void save(char f[]){ FILE *fd=fopen(f,"w"); fprintf(fd,"%d\n",n); for (int i=0;i<n;i++){ fprintf(fd,"%s\n",D.reg_number); fprintf(fd,"%s",D.car_model); fprintf(fd,"%d\n\n",D.probeg); } fclose(fd); } void load(char f[]){ FILE *fd=fopen(f,"r"); if (fd==NULL) return; int m; fscanf(fd,"%d",&m); for (;m!=0;m--,n++){ extend(); fscanf(fd,"%s",D[n].reg_number); char c[80]; fgets(c,80,fd); // читать "хвост" предыд. строки fgets(c,80,fd); D[n].car_model=strdup©; fscanf(fd,"%d",&D[n].probeg); } fclose(fd); } void edit(int k){ printf("\nEnter new values:\n"); printf("\nRegistration number:"); scanf("%s",D[k].reg_number); char c[80]; gets©; // читать оставшийся \n из входного потока printf("\nModel of car:"); gets©; D[k].car_model=strdup©; // копия строки в ДМ printf("\nWay:"); scanf("%d", &D[k].probeg); } void sp(){ char *s; int t=0,p=0; printf("\nEnter model of car: "); gets(s); for(int i=0; i<n; i++){ if (strcmp(s, D.car_model)==0) t=t+D.probeg; p=p+1; } t=t/p; printf("\nSrednii probeg = %d", t); getch(); } void main(){ int k,i,t; D = new car[sz]; while(1){ printf("\n1 - add\n2 - show\n3 - delete\n4 - save\n5 - load\n6 - edit\n7 - Srednii probeg\nwhat to do? "); switch(getch()){ case '1': add(); break; case '2': show(); break; case '3': if (n==0) break; k=get_num(); for (i=k;i<n-1;i++) D=D[i+1]; n--; break; case '4': save("a.txt"); break; case '5': load("a.txt"); break; case '6': if (n==0) break; t=get_num(); edit(t); break; case '7': sp(); break; case 27: return; } } } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
AccessD Опубликовано 1 октября, 2006 Жалоба Поделиться Опубликовано 1 октября, 2006 не совсем в тему: А почему gets(), а не fgets()? gets() - опасная функция Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Guard Опубликовано 1 октября, 2006 Автор Жалоба Поделиться Опубликовано 1 октября, 2006 Чем? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Ineu Опубликовано 1 октября, 2006 Жалоба Поделиться Опубликовано 1 октября, 2006 Guard писал(а) Sun, 01 October 2006 10:53 Чем? Переполнением. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
AccessD Опубликовано 1 октября, 2006 Жалоба Поделиться Опубликовано 1 октября, 2006 почитайте ссылки здесь: http://www.linux.ru/forum/index.php?t=msg&th=86281&s tart=0&rid=1763&S=91211c9c7684cfc22a2fc7c15b114acc Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Guard Опубликовано 1 октября, 2006 Автор Жалоба Поделиться Опубликовано 1 октября, 2006 Хм. Слышал, но на практике не сталкивался. Будем знать. Однако основную проблему это не снимает. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
AccessD Опубликовано 1 октября, 2006 Жалоба Поделиться Опубликовано 1 октября, 2006 я так понял, что это вроде базы данных? если так, почему не воспользоваться средствами mysql? для C есть библиотека для работы с ней Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Guard Опубликовано 2 октября, 2006 Автор Жалоба Поделиться Опубликовано 2 октября, 2006 Хех. Ну прежде всего это лаба. На работу структур. Поэтому здесь лучшее - враг зачета. Если проблему описывать конкретнее, то функция strcmp должна возвращать 0, если строки переданные ей одинаковы. Путем отладки выяснено, что проблема в том, что она не корректно сравнивает элемент структуры(формата char *s) с введенной строкой(аналогичного формата). В чем загвозтка понять не могу. P/S/ Собственноручно написанная функция для сравнения строк эту проблему тоже не решила. Что окончательно поставило в тупик. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Ineu Опубликовано 2 октября, 2006 Жалоба Поделиться Опубликовано 2 октября, 2006 Guard писал(а) Mon, 02 October 2006 03:32 Собственноручно написанная функция для сравнения строк эту проблему тоже не решила. Что окончательно поставило в тупик. Дайте и эту функцию, может что и прояснится Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Guard Опубликовано 3 октября, 2006 Автор Жалоба Поделиться Опубликовано 3 октября, 2006 Кажется нашел причину. При загрузке из файла в переменную типа char *s подгружается символ '\n'. Соответственно, а как от этого избавиться? P/S/ for (int i=0; s==t; i++); if (s[i-1]=='\0') printf("Равно!"); Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Ineu Опубликовано 3 октября, 2006 Жалоба Поделиться Опубликовано 3 октября, 2006 Guard писал(а) Tue, 03 October 2006 07:53 Кажется нашел причину. При загрузке из файла в переменную типа char *s подгружается символ '\n'. Соответственно, а как от этого избавиться? for (i = 0; s != '\0'; i++) if (s == '\n') { s = '\0'; break; } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Guard Опубликовано 3 октября, 2006 Автор Жалоба Поделиться Опубликовано 3 октября, 2006 Спасибо. Только я хотел узнать возможно ли от этого избавиться еще при объявлении функции scanf. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Ineu Опубликовано 3 октября, 2006 Жалоба Поделиться Опубликовано 3 октября, 2006 Guard писал(а) Tue, 03 October 2006 13:23 Спасибо. Только я хотел узнать возможно ли от этого избавиться еще при объявлении функции scanf. Хм... man scanf? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Guard Опубликовано 4 октября, 2006 Автор Жалоба Поделиться Опубликовано 4 октября, 2006 Ладно пока исчу - последний вопрос. Как можно отсортировать массив с русскими символами по алфавиту? Или вернее как сравнить русские символы? Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Ineu Опубликовано 4 октября, 2006 Жалоба Поделиться Опубликовано 4 октября, 2006 Guard писал(а) Wed, 04 October 2006 03:12 Ладно пока исчу - последний вопрос. Как можно отсортировать массив с русскими символами по алфавиту? Или вернее как сравнить русские символы? Самый простой вариант - перевести строку при помощи iconv в cp1251 и отсортировать по возрастанию кодов. В 1251, в отличии от кои8, символы расположены по алфавиту. man 3 iconv Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Guard Опубликовано 4 октября, 2006 Автор Жалоба Поделиться Опубликовано 4 октября, 2006 Премного благодарен. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.