1418       Конференция C SoobCha           письмо # 1419 1420  


Тема: Re: pomogite s programmoy
Дата: Fri, 19 Oct 2007 03:08:17 +0400
Кому: "C" <C@soobcha.org>
X-Mailer: The Bat! (v3.98.4) Professional
Content-Type: text/plain; charset=koi8-r
От Кого: Valentin Klyuchanov <klvalent@gmail.com>

     Hello mlx,

Thursday, October 18, 2007, 6:34:36 PM, you wrote:

> #include <stdio.h>
> #include <string.h>
> #include <stdlib.h>
> #include <math.h>
> double extractor (char* u_name)
> {
> FILE *fp;
> char fullstr[108];
> char data_ch[256];
> char value[15];
> int i,k,j,t,p=0;
> int tmp=strlen(u_name);
> fullstr[0]='C';
> fullstr[1]='h';
> fullstr[2]='a';
> fullstr[3]='i';
> fullstr[4]='n';
> fullstr[5]=' ';
> for (i=6;i<tmp+6;i++) {
> fullstr[i]=u_name[i-6];
> k=i;
> }

// Тут лучше использовать
    strcpy(&fullstr[6],u_name);
    k=6+tmp;

> fullstr[k+1]=' ';
> fullstr[k+2]='(';
// Обязательно добавить в конец строки '\0'
    fullstr[k+3] = '\0';

> fp=fopen ("/tmp/chains","r");
> // printf ("\nstr:'%s'",fullstr);
> while (feof(fp)==0)
> {
> fgets (data_ch, 256, fp);
> for (j=0;j<k+2;j++)
// k+2 или k+3 ? Если k+2, то скобка не участвует.
> {
> if (data_ch[j]==fullstr[j])
> p++;
> }
> // printf ("p=%d,tmp=%d",p,tmp);
> if (p==tmp+7) {
> fgets (data_ch, 256, fp);
> fgets (data_ch, 256, fp);
// Дальше полная чушь. Откуда ты взял, что в строке обязательно будет
// 17 символов и среди них будет хоть один пробелл или не пробелл?
// Найди конец строки, отсей '\n', а потом отсекай хвостовые пробелы.
// Или, наоборот, сканируй от начала строки, пропускай лишнее,
// остальное хватай. Строки копируй с помощью strcpy или strncpy. На
// худой конец memcpy. И чем вызван пропуск строки? Это специально?
// Попробуй почитать про функцию sscanf -- не будет ли удобнее
// воспользоваться ею.
> i=16; t=0;
> while (data_ch[i]!=' ') {
> t++;
> i--;
> }
> k=0;
> for (j=16-t+1;j<=16;j++) {
> value[k]=data_ch[j];
> k++;
> }
> break;
> }
// Счетчики, временные переменные и временные указатели лучше
// инициализировать непосредственно перед использованием, а не после,
// тем более, что он не всегда будет очищаться.
> p=0;
> }
// Опять забыл ограничить строку, а еще удивляешся ошибке.
> return atol(value);
> }
> main ()
> {
> FILE *fp, *fp_sql, *ftmp;
> char data[256];
> char data_ch[256];
> char u_name[100];
> char t_price[8];
> char t_admin[2];
> char str_tmp[256];
> char chain_name[108];
> char value[15];
> long bytes=0;
> double price, tmp_money, b2;
> int admin;
> int i=0, j=0, k=0, f=0, count_1=0, p=0, d=0, t=0, count_2=0, z=0, counter=0;
> int DAT=system("date +%d > /tmp/date.time");
> int DAT2=system("date +%m > /tmp/month.time");
> int DAT3=system("date +%H > /tmp/hour.time");
> int DAT4=system("date +%M > /tmp/minute.time");
> ftmp=fopen ("/tmp/date.time","r");
// Опять-таки не лучше ли sscanf? Или системмные функции работы со
// временем?
> fgets (str_tmp,256,ftmp);
> DAT=atoi(str_tmp);
> fclose(ftmp);
> ftmp=fopen ("/tmp/month.time","r");
> fgets (str_tmp,256,ftmp);
> DAT2=atoi(str_tmp);
> fclose(ftmp);
> ftmp=fopen ("/tmp/hour.time","r");
> fgets (str_tmp,256,ftmp);
> DAT3=atoi(str_tmp);
> fclose(ftmp);
> ftmp=fopen ("/tmp/minute.time","r");
> fgets (str_tmp,256,ftmp);
> DAT4=atoi(str_tmp);
> fclose(ftmp);
> // printf ("\nDAT=%d, DAT2=%d, DAT3=%d, DAT4=%d\n",DAT,DAT2,DAT3,DAT4);
> fp=fopen ("/tmp/collect_users","r");
> fp_sql=fopen ("/tmp/collector_step","w");
> fgets (data, 256, fp);
> fgets (data, 256, fp);
> while (feof(fp)==0)
> {
> j=0; counter++;
> printf ("\n counter=%d",counter);
> while (data[j]!='\t') {
> u_name[j]=data[j]; j++;
> }
// Опять не закрыл строку, к тому же забыл ее длину.
> j++; k=j;
> while (data[j]!='\t') {
> t_price[j-k]=data[j]; j++;
> }
// Лучше бы использовать для позиционирования в строках-получателях char*
// или второй счетчик гонять от нуля до как получится. Не жалей
// операций. Твоя прога и так не очень оптимальна, но самый главный
// тормоз здесь -- операции с файлами. По сравнением с ними все
// остальное работает мгновенно. А с двумя счетчиками или счетчиком и
// указателем будет читаться легче. Я, собсвенно, даже не уверен, что
// правильно уловил, что ты делаешь.
> j++; k=j;
> while (data[j]!='\n') {
> t_admin[j-k]=data[j]; j++;
> }
> k=0; j=0; i=0;
> price=atof(t_price);
> admin=atoi(t_admin);
> printf ("\nu_name=%s, price=%f, admin=%d",u_name,price,admin);
> bytes=extractor(u_name);
// Сперва в функции переводишь строку в long, потом в double, а теперь
// опять в long? Не хорошо! К тому же не используешь функцию
// округления. Впрочем, подозреваю, что и переменную bytes ты хотел
// сделать типа double.
> //printf ("\nu_name=%s, price=%f, admin=%d,
> bytes=%ld",u_name,price,admin,bytes);
> if (bytes>3) {
> // printf ("\nu_name=%s, price=%f, admin=%d,
> bytes=%ld",u_name,price,admin,bytes);
> if (admin<10) {
> // b2=bytes/1048576;
> b2=bytes*0.00000095367432;
> // printf (" b2=%f",b2);
> tmp_money=b2*price;
> // printf ("money=%f",tmp_money);
> fprintf (fp_sql,"INSERT INTO Bill_day_m VALUES
> (%d,%d,%d,%d,'%s',%ld,%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes,bytes);
> fprintf (fp_sql,"INSERT INTO Bill_day VALUES
> (%d,%d,%d,%d,'%s',%ld,%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes,bytes);
> fprintf (fp_sql,"UPDATE Balance SET
> money_rest=money_rest-%f WHERE login='%s';\n",tmp_money,u_name);
> }
> if (admin==12) {
> b2=bytes*0.00000095367432;
> // printf (" b2=%f",b2);
> tmp_money=b2*price;
> // printf ("money=%f",tmp_money);
> fprintf (fp_sql,"INSERT INTO Bill_day_m VALUES
> (%d,%d,%d,%d,'%s',%ld,%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes,bytes);
> fprintf (fp_sql,"INSERT INTO Bill_day VALUES
> (%d,%d,%d,%d,'%s',%ld,%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes,bytes);
> fprintf (fp_sql,"UPDATE Balance SET
> money_rest=money_rest-%f WHERE login='%s';\n",tmp_money,u_name);
> }
> if (admin==10) {
> fprintf (fp_sql,"INSERT INTO Bill_day_m VALUES
> (%d,%d,%d,%d,'%s',%ld,%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes,bytes);
> fprintf (fp_sql,"INSERT INTO packet_Bill_day VALUES
> (%d,%d,%d,%d,'%s',%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes);
> fprintf (fp_sql,"UPDATE active_packets set
> bytes_left=bytes_left-%ld where login='%s' and active=1;\n",bytes,u_name);
> }
> if (admin==11) {
> fprintf (fp_sql,"INSERT INTO Bill_day_m VALUES
> (%d,%d,%d,%d,'%s',%ld,%ld);\n",DAT,DAT2,DAT3,DAT4,u_name,bytes,bytes);
> }
> }
// Эти операторы печати я не проверял, но печать незакрытых строк
// может привести (и приводит) к ошибке.
> for (i=0;i<100;i++) u_name[i]=0;
> for (i=0;i<108;i++) chain_name[i]=0;
> for (i=0;i<8;i++) t_price[i]=0;
> for (i=0;i<2;i++) t_admin[i]=0;
// Обнулять в конце -- это хорошо :-( Только не забывай, что
// перед первым использованием ты их не обнулял! И если бы ты закрывал
// строки символом '\0' в конце наполнения, то это очень долгое обнуление
// не понадобилось бы вообще.
// Помни! Та переменная, значение которой ты не задал, может иметь
// любое значение! Лучше всего обнулять непосредственно перед циклом,
// где ее используешь, иначе можешь забыть о том, что переменная не
// проинициализирована. Строки без особой надобности не
// инициализируют, но внимательно за ними следят.
> fgets (data, 256, fp);
> }
> fclose(fp);
> fclose(fp_sql);
> // fclose(fp1);
> }

Прошу прощения, я не проверял эту программу тщательно, но я не знаю,
что от нее требуется.

--
Best regards,
 Valentin mailto:klvalent@gmail.com


  1418 1420  
 
???Mail.ru ??? ?????
╘ 2000-2006 Сообщество Чайников