Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2012, 20:58   #1
Hall
 
Регистрация: 24.01.2012
Сообщений: 3
По умолчанию Справочник..Ошибки, советы

Из текстового файла формата
Имя
Адрес
Телефон
набираем абонентов, сортируем телефоны и по желанию выдаем номера и записи в определенном диапазоне. Если есть какие то замечания буду рад выслушать. Потому что он не вполне работает )))))
Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int increment(long inc[], int size) { // функция сортировки

 int p1, p2, p3, s;

  p1 = p2 = p3 = 1;
  s = -1;
  do {
    if (++s % 2) {
      inc[s] = 8*p1 - 6*p2 + 1;
    } else {
      inc[s] = 9*p1 - 9*p3 + 1;
      p2 *= 2;
      p3 *= 2;
    }
        p1 *= 2;

  } while(3*inc[s] < size);

  return s > 0 ? --s : 0;
}


void shellSort(long a[], int b[], int size) { // сортировка методом шелла

  long inc, i, j, seq[40];
  int s, l, tp;



  s = increment( seq, size);
  printf("s %d", s);
  while (s >= 0) {


  inc = seq[s--];

    for (i = b[inc]; i < size; i++) {
        tp=b[i];

    for (j=i-inc; (j>= 0) && (a[tp] <a[b[j]]); j -= inc ){


        b[j+inc] = b[j];
        }
        b[j+inc]=tp;


       }
  }
 
}

int SortFrom(long x,  int n, long A[], int b[]){  //двоичный поиск  первого элемента в заданном диапазоне

int first = 0;
   int  last = n;

    int mid;

    if ( x < A[b[0]])
    {
    x=0;
   return x;


    }
    else if (A[b[n]] < x)
    {
       printf("Does't have any strings ");     }
    else if (A[b[0]]==x)
    {
     x=0;
    return  x;

    }

    while (first < last  )
    {

        mid = first + (last - first) / 2;
         if ( (A[b[mid-1]] < x)  &&  (A[b[mid+1]]>x) ) {
           x= mid;
           return x;
           break;

             }
        if (x <= A[b[mid]]  )
        {

            last = mid;

        }
        else
        {
            first = mid + 1;
        }
    }
    x=mid;
    return x;
    }

 void main()
{
clrscr();
  long  A[21], x, y;
  int i=0;
  
  int a,  m, n  ;
  struct Spic {
  char name[20];
  char adress[20];
  char phone[20];
  } ;
   int b[]={0, 1, 2, 3, 4 , 5 , 6 , 7 ,8, 9, 10, 11, 12 , 13, 14, 15 , 16 , 17, 18, 19, 20} ;
  Spic *c[10];
  FILE *Ptr;

  Ptr=fopen("mass.txt","r");
   while  (!feof(Ptr)) {


    fgets(c[i]->name, 19, Ptr);
    fgets(c[i]->adress, 19, Ptr);
    fgets(c[i]->phone, 20, Ptr);
    i++;

 n=i;
}

  fclose(Ptr);
for (int j=0; j<n-1; j++){
   A[j]=atol(c[j]->phone);
printf("--A long- %ld \n", A[j]);
                     }
getch();
shellSort( A, b, n-1);
for (int p=0; p<n-1; p++){
printf("Sort - %ld \n", A[b[p]]);
printf("B mass- %d \n", b[p]);
}
getch();
 printf("Enter x: \n");
 scanf("%d", &x );
 printf("Enter y: \n");
 scanf("%d", &y);
a=SortFrom(x, n, A, b);
  getch();

 while(A[b[a]]<=y ){
     
     printf("name - %s \n adress- %s \n phone - %s \n", c[b[a]]->name, c[b[a]]->adress, c[b[a]]->phone);
     a++;
     getch();
     }
     }

Последний раз редактировалось Hall; 28.02.2012 в 21:12.
Hall вне форума Ответить с цитированием
Старый 02.03.2012, 14:45   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

1) программе нужно придумать хорошее имя. Что бы набирать в консоле было проще, назовём программу wp (white pages - телефонный справочник).

2) на первом этапе разработки, программа будет вызываться без аргументов командной строки.

3) в исходном тексте программы нужно ровно расставлять отступы.

4) необходимо писать комментарии (но без фанатизма)

На будущее, вот так делать:
Код:
int b[]={0, 1, 2, 3, 4 , 5 , 6 , 7 ,8, 9, 10, 11, 12 , 13, 14, 15 , 16 , 17, 18, 19, 20};
не стоит.

Массив нужно инициализировать в цикле:

Код:
for (i = 0; i < 21; i++) {
    b[i] = i;
}
Иначе, при чтении программы другим программистом, тот может подумать, что здесь неупорядоченные числа. И потратит время, перепроверяя несколько раз, действительно ли они упорядоченны. Это может раздражать.

В этой строке:
Код:
Spic *c[10];
Нужно написать (при условии, что у вас сишный компилятор):
Код:
struct Spic *c[10];
Не нужно писать загадочных чисел вроде 21, а нужно использовать директиву #define (если ваш сишный компилятор поддерживает константы, то: contst int MAX = 21; )

Код:
#define MAX 21

int main ()
{
    int i;
    int b[MAX];

    for (i = 0; i < MAX; i++) {
        b[i] = i;
    }

    return 0;
}
Если требуется открывать файл (особенно на чтение), необходимо проверить - открылся ли он (существует ли). Если файл не открылся (не существует), нужно сообщить об этом. И лучше в стандартный поток ошибок.

Я переработал примерчик --> http://www.cplusplus.com/reference/c.../cstdio/fopen/

Код:
/* fopen example */
#include <stdio.h>
int main ()
{
    FILE *pFile;
    char* filename = "myfile.txt";
    pFile = fopen (filename,"r");

    if (pFile == NULL) {
        fprintf(stderr, "error: can't open file \"%s\"\n", filename);
        return 1;
    }

    fclose (pFile);
    return 0;
}
Заметьте, что если нам не предоставили файл, то мы "рвём контракт с пользователем", сообщаем в чём причина и выходим.

У вас получалось заполнить структуры? Я думаю, что вряд ли, так как память не выделена. Вот так я заполнил массив структур из файла mass.txt:

Цитата:
Иван Петров
г. Москва, ул. Ленина, д.20. кв.3
89275553422

Данила Иванов
г. Москва, ул. Маркса, д.13. кв.6
89084552999

Петр Данилов
г. Москва, ул. Энгельса, д.10. кв.5
89180935511
Код:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define BUFSIZE 50
#define MAX_RECORDS 1000 // максимальное число записей

 int main()
{
    int i, c;

    // число записей
    int nrecords;

    // запись
    struct Spic {
        char name[BUFSIZE];
        char adress[BUFSIZE];
        char phone[BUFSIZE];
    };

    // массив записей
    struct Spic *s[MAX_RECORDS];

    // файл с исходными данными
    FILE *Ptr;
    char* filename = "mass.txt";
    Ptr = fopen(filename,"r");

    // проверяем, удачно ли открытие файла
    if (Ptr == NULL) {
        fprintf(stderr, "error: can't open %s\n", filename);
        return 1;
    }
    
    i = 0;
    nrecords = 0;
    while  (!feof(Ptr)) {
        // проверяем не исчерпан ли лимит записей
        if (i >= MAX_RECORDS) {
            fprintf(stderr, "error: number of records for more than %d\n", MAX_RECORDS);
            return 1;
        }

        // выделяем память для очередной структуры структуры
        s[i] = (struct Spic*) malloc(sizeof (struct Spic));

        // проверяем успешно ли выделение памяти
        if (s[i] == NULL) {
            fprintf(stderr, "error: allocate is impossible\n");
            return 1;
        }

        // пропускаем символы пустого пространства перед каждой строкой (пробелы,
        // табуляции, символы конца строки)
        while ((c = getc(Ptr)) != EOF) {
            if (!isspace(c)) {
                // возвращаем непустой символ обратно в поток ввода
                ungetc(c, Ptr);
                break;
            }
        }

        // инициализируем запись
        fgets(s[i]->name, BUFSIZE, Ptr);
        fgets(s[i]->adress, BUFSIZE, Ptr);
        fgets(s[i]->phone, BUFSIZE, Ptr);
        i++;
        nrecords=i;
    }

    fclose(Ptr);
    return 0;
 }
P.S. Для функции fgets() --> http://www.cplusplus.com/reference/c.../cstdio/fgets/
лучше взять заведомо большой буфер для хранения строк.
P.S.S. Всегда нужно помнить, что нужна защита от некорректный данных.

Последний раз редактировалось 8Observer8; 02.03.2012 в 14:49.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужны советы... Makc19977 JavaScript, Ajax 18 25.02.2012 18:57
Советы начинающему программисту РусланРоккер Помощь студентам 5 01.12.2011 10:11
Советы по обучению Antonio1 Свободное общение 2 22.11.2009 16:45
Дайте советы начинающему! RomT24 Общие вопросы C/C++ 7 24.05.2009 13:43