RE: Вопросы по C/C++ (Для новичков)
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-25 19:07:04.913333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
quote:
ORIGINAL: iidsp quote:
Я ничего не знаю, про тип переменной contents. Если это не хитрый класс с перегруженным оператором [] - то это всего-лишь обращение (читай: чтение) элемента массива и возврат копии значения этого элемента. std::string contents; значит - это всего лишь работа с копией!? С чего ты взял, что с копией? Ты обращаешься к символу в строке, с номером row + c. Получаешь его из строки. И копия символа - результат возвращаемые твоим методом.
int val = 10;
int Get10( void )
{
return val; // тут возвращается не сама переменная val, а её копия.
}
void test( void )
{
int c;
( c = Get10() ) = 20; // В переменную c заносится копия значения val, а потом заносится 20.
printf( "%d", val ); // выведет 10
}
Теперь такой пример:
int val = 10;
int& Get10( void )
{
return val; // тут возвращается ссылка на val
}
void test( void )
{
int &c = Get10();
c = 20; // По ссылке c в переменную val заносится 20
printf( "%d", val ); // выведет 20 а не 10
}
Советую Страутструпа почитать.
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-25 22:13:18.773333
|
|
|
craken
Сообщений: 15
Оценки: 0
Присоединился: 2009-07-17 20:06:16.480000
|
помогите пожалуйста, нужно прочитать содержимое файла и вывести на экран. на экран выводится такая кулибяка -842150451============='====='===' -842150451================= fgets пробовал не помогло
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//--------------------------------------------|
#include <windows.h>
char bufRus [256];
char* Rus(const char* text)
{
CharToOem(text, bufRus);
return bufRus;
}
//--------------------------------------------|
const int l_pol=2;
const int l_obroz=10;
const int l_otvet=3;
struct Man {
int age;
char pol[l_pol];
char obroz[l_obroz];
char otvet[l_otvet];
Man* next;
};
Man* read_dbase(char* filename);
Man* add(Man* beg, const Man& man);
void print_dbase(Man* deg);
int main(){
Man* beg = read_dbase("dbase.txt");
if (!beg)
return 1;
print_dbase(beg);
return 1;
}
//----------------------Чтение базы данных из файла|
Man* read_dbase(char* filename) {
FILE* fin;
Man man, *deg = 0;
if((fin = fopen(filename, "r")) == 0){
printf(Rus("Нет файла %s\n"), filename);
return 0;
}
while(!feof(fin)){
fscanf(fin, "%i%s%s%s",&man.age, &man.pol, &man.obroz, &man.otvet);
deg = add(deg, man);
}
fclose(fin);
return deg;
}
//----------------------Вывод базы на экран|
void print_dbase(Man* beg) {
Man* pv = beg;
while (pv) {
printf("%i%s%s%s\n", pv->age, pv->pol, pv->obroz, pv->otvet);
pv=pv->next;
}
}
//--------------------------------------------|
Man* add(Man* beg, const Man& man) {
Man* pv = new Man;
pv->next = 0;
if (beg) {
Man* temp =beg;
while (temp->next)
temp = temp->next;
temp->next = pv;
}
else
beg = pv;
return beg;
}
//--------------------------------------------|
//--------------------------------------------|
//--------------------------------------------|
//1)Ввод анкет из файла
//2)Поиск людей, старше или моложе, м или ж, да или нет.
//3)Вывод на экран
//4)Вывод в файл
//5)
//6)
//7)
содержимое файла
32 s dffd g
43 d f g с кодировками тоже мудрил не помогает
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-26 11:50:52.746666
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Сложно понять твою логику. На вскидку следующее, могу и ошибаться: 1. Не вижу инициализации списка. Функция add либо его инициализирует, либо добавляет одну запись. Так что при добавлении первого элемента - облом ;). 2. return deg; в функции read_dbase возвращает указатель на конец списка, а не на начало, как ожидаолсь. Не совсем понятно, как оно вообще что-то выводит. ———- В этом я уже более-менее уверен: 3. В функции add ты забыл занести значения полей const Man& man в temp->… . Получается всё, что ты читаешь - ты читаешь впустую. 4. Попробуй такой fscanf: fscanf(fin, "%d%s%s%s",&man.age, man.pol, man.obroz, man.otvet); // без некоторых амперсантов.
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-26 17:24:21.973333
|
|
|
craken
Сообщений: 15
Оценки: 0
Присоединился: 2009-07-17 20:06:16.480000
|
вот исправил, как бы всё заработало)) в том смысле что выводится man.age, а всё остальное белеберда если не написать
pv->obroz=man.obroz;
pv->obroz=man.obroz;
pv->pol=man.pol;
pv->otvet=man.otvet; но вот вылетает ошибка error C2440: '=' : cannot convert from 'const char [10]' to 'char [10]' There is no context in which this conversion is possible
//--------------------------------------------|
Man* add(Man* beg, const Man &man) {
Man* pv = new Man;
pv->next = 0;
pv->age = man.age;
pv->obroz=man.obroz;
pv->obroz=man.obroz;
pv->pol=man.pol;
pv->otvet=man.otvet;
if (beg) {
Man* temp =beg;
while (temp->next)
temp = temp->next;
temp->next = pv;
}
else
beg = pv;
return beg;
}
//--------------------------------------------|
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-26 17:52:57.373333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Учи основы языка Си, у тебя непонимание того, что такое строка ;). Для строк юзай strcpy. P.S. можно проще: Man* pv = new Man; *pv = man; pv->next = 0;
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-26 18:02:22.073333
|
|
|
D1_F
Сообщений: 5
Оценки: 0
Присоединился: 2009-12-16 23:28:14.056666
|
товарищи программисты, ниже представлена программа которая реализовывает управление базой данных успеваемости студентов, помогите пожалуйста сделать так чтобы при ввооде номера группы больше 699, оценки больше 5ти или меньше 3х программа выдавала сообщение что данные введены неверно,и предлагала проделать данную операцию заново, заранее спасибо….
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <io.h>
#include <fcntl.h>
#include <string.h>
struct record
{
char surname[16];
char name[16];
char group[16];
int mat;
int fiz;
int inf;
float sred;
};
void ramka(int x1,int y1,int x2,char s[20],int flag)
{
int i;
window(x1,y1,x2,y1+3);
textmode(C80);
textcolor(flag);
gotoxy(x1,y1);
cprintf("Ъ");
for (i=x1;i<x2-1;i++)
cprintf("Д");
cprintf("ї");
gotoxy(x1,y1+1);
cprintf("і");
gotoxy(x2,y1+1);
cprintf("і");
gotoxy(x1+3,y1+1);
cprintf("%s",s);
gotoxy(x1,y1+2);
cprintf("А");
for (i=x1;i<x2-1;i++)
cprintf("Д");
cprintf("Щ");
}
void menu(int mode)
{
clrscr();
switch(mode)
{
case 1:
{
ramka(27,4,53,"Џа®б¬®ваҐвм Ў §г",RED);
ramka(27,7,53,"„®Ў ўЁвм § ЇЁбм",GREEN);
ramka(27,10,53,"ђҐ¤ ЄвЁа®ў вм § ЇЁбм",GREEN);
ramka(27,13,53,"“¤ «Ёвм § ЇЁбм",GREEN);
ramka(27,16,53," Џ®ЁбЄ ",GREEN);
ramka(27,19,53," ‚л室 ",GREEN);
break;
}
case 2:
{
ramka(27,4,53,"Џа®б¬®ваҐвм Ў §г",GREEN);
ramka(27,7,53,"„®Ў ўЁвм § ЇЁбм",RED);
ramka(27,10,53,"ђҐ¤ ЄвЁа®ў вм § ЇЁбм",GREEN);
ramka(27,13,53,"“¤ «Ёвм § ЇЁбм",GREEN);
ramka(27,16,53," Џ®ЁбЄ ",GREEN);
ramka(27,19,53," ‚л室 ",GREEN);
break;
}
case 3:
{
ramka(27,4,53,"Џа®б¬®ваҐвм Ў §г",GREEN);
ramka(27,7,53,"„®Ў ўЁвм § ЇЁбм",GREEN);
ramka(27,10,53,"ђҐ¤ ЄвЁа®ў вм § ЇЁбм",RED);
ramka(27,13,53,"“¤ «Ёвм § ЇЁбм",GREEN);
ramka(27,16,53," Џ®ЁбЄ ",GREEN);
ramka(27,19,53," ‚л室 ",GREEN);
break;
}
case 4:
{
ramka(27,4,53,"Џа®б¬®ваҐвм Ў §г",GREEN);
ramka(27,7,53,"„®Ў ўЁвм § ЇЁбм",GREEN);
ramka(27,10,53,"ђҐ¤ ЄвЁа®ў вм § ЇЁбм",GREEN);
ramka(27,13,53,"“¤ «Ёвм § ЇЁбм",RED);
ramka(27,16,53," Џ®ЁбЄ ",GREEN);
ramka(27,19,53," ‚л室 ",GREEN);
break;
}
case 5:
{
ramka(27,4,53,"Џа®б¬®ваҐвм Ў §г",GREEN);
ramka(27,7,53,"„®Ў ўЁвм § ЇЁбм",GREEN);
ramka(27,10,53,"ђҐ¤ ЄвЁа®ў вм § ЇЁбм",GREEN);
ramka(27,13,53,"“¤ «Ёвм § ЇЁбм",GREEN);
ramka(27,16,53," Џ®ЁбЄ ",RED);
ramka(27,19,53," ‚л室 ",GREEN);
break;
}
case 6:
{
ramka(27,4,53,"Џа®б¬®ваҐвм Ў §г",GREEN);
ramka(27,7,53,"„®Ў ўЁвм § ЇЁбм",GREEN);
ramka(27,10,53,"ђҐ¤ ЄвЁа®ў вм § ЇЁбм",GREEN);
ramka(27,13,53,"“¤ «Ёвм § ЇЁбм",GREEN);
ramka(27,16,53," Џ®ЁбЄ ",GREEN);
ramka(27,19,53," ‚л室 ",RED);
break;
}
}
}
struct record addrec()
{
struct record rec;
char n [16];
int i;
int k;
float j;
clrscr();
printf("‚ўҐ¤ЁвҐ д ¬Ё«Ёо: ");
scanf("%s",&n);
for (k=0;k<16;k++)
{
rec.surname[k]=n[k];
}
printf("‚ўҐ¤ЁвҐ Ё¬п: ");
scanf("%s",&n);
for (k=0;k<16;k++)
{
rec.name[k]=n[k];
}
printf("‚ўҐ¤ЁвҐ ЈагЇЇг: ");
scanf("%s",&n);
for (k=0;k<16;k++)
{
rec.group[k]=n[k];
}
printf("‚ўҐ¤ЁвҐ ®жҐЄг Ї® ¬ вЁЄҐ: ");
scanf("%i",&i);
rec.mat=i;
printf("‚ўҐ¤ЁвҐ ®жҐЄг Ї® дЁ§ЁЄҐ: ");
scanf("%i",&i);
rec.fiz=i;
printf("‚ўҐ¤ЁвҐ ®жҐЄг Ї® Ёд®а¬ вЁЄҐ: ");
scanf("%i",&i);
rec.inf=i;
j=(rec.inf+rec.fiz+rec.mat);
rec.sred=j/3;
return(rec);
}
void printrec(struct record rec[30],int c,int c1,int flag)
{
int i;
if (flag==0)
{
clrscr();
printf("|Ќ®¬|” ¬Ё«Ёп |€¬п |ѓагЇЇ |Њ в|”Ё§|€д|‘।|\n");
}
for (i=c1;i<c;i++)
{
printf("|%-3d|",i+1);
printf("%-16s|",rec[i].surname);
printf("%-16s|",rec[i].name);
printf("%-8s|",rec[i].group);
printf("%-3d|",rec[i].mat);
printf("%-3d|",rec[i].fiz);
printf("%-3d|",rec[i].inf);
printf("%-1.2f|\n",rec[i].sred);
}
}
void search(struct record rec[30],int c, int n)
{
float ff;
int i,f,j,l,z=0;
char q[16]="\0";
switch(n)
{
case 1: printf("‚ўҐ¤ЁвҐ бва®Єг Ї®ЁбЄ \n");
scanf("%s",&q);
clrscr();
for (i=0;i<c;i++)
{
l=0;
for (j=0;j<strlen(q);j++)
{
if (rec[i].surname[j]==q[j]) l=1; else l=0;
}
if (l==1)
{
printrec(rec,i+1,i,z);
z++;
}
}
if (z==0) printf("‘®ўЇ®¤ҐЁ© Ґ¤!!! Ё¤ЁвҐ ЁйЁвҐ ᥢҐаҐ =)\n");
getch();
break;
case 2: printf("‚ўҐ¤ЁвҐ бва®Єг Ї®ЁбЄ \n");
scanf("%s",&q);
clrscr();
for (i=0;i<c;i++)
{
l=0;
for (j=0;j<strlen(q);j++)
{
if (rec[i].name[j]==q[j]) l=1; else l=0;
}
if (l==1)
{
printrec(rec,i+1,i,z);
z++;
}
}
if (z==0) printf("‘®ўЇ®¤ҐЁ© Ґ¤!!! Ё¤ЁвҐ ЁйЁвҐ ᥢҐаҐ =)\n");
getch();
break;
case 3: printf("‚ўҐ¤ЁвҐ бва®Єг Ї®ЁбЄ \n");
scanf("%s",&q);
clrscr();
for (i=0;i<c;i++)
{
l=0;
for (j=0;j<strlen(q);j++)
{
if (rec[i].group[j]==q[j]) l=1; else l=0;
}
if (l==1)
{
printrec(rec,i+1,i,z);
z++;
}
}
if (z==0) printf("‘®ўЇ®¤ҐЁ© Ґ¤!!! Ё¤ЁвҐ ЁйЁвҐ ᥢҐаҐ =)\n");
getch();
break;
case 4: printf("‚‚Ґ¤ЁвҐ ®жҐЄг\n");
scanf("%i",&l);
j=0;
for (i=0; i<c; i++)
if (l==rec[i].mat)
{
printrec(rec,i+1,i,z);
z++;
j++;
}
if (j==0) printf("‘®ўЇ®¤ҐЁ© Ґ¤!!! Ё¤ЁвҐ ЁйЁвҐ ᥢҐаҐ =)\n");
getch();
break;
case 5: printf("‚‚Ґ¤ЁвҐ ®жҐЄг\n");
scanf("%i",&l);
j=0;
for (i=0; i<c ;i++)
if (l==rec[i].fiz)
{
printrec(rec,i+1,i,z);
z++;
j++;
}
if (j==0) printf("‘®ўЇ®¤ҐЁ© Ґ¤!!! Ё¤ЁвҐ ЁйЁвҐ ᥢҐаҐ =)\n");
getch();
break;
case 6: printf("‚‚Ґ¤ЁвҐ ®жҐЄг\n");
scanf("%i",&l);
j=0;
for (i=0;i<c;i++)
if (l==rec[i].inf)
{
printrec(rec,i+1,i,z);
z++;
j++;
}
if (j==0) printf("‘®ўЇ®¤ҐЁ© Ґ¤!!! Ё¤ЁвҐ ЁйЁвҐ ᥢҐаҐ =)\n");
getch();
break;
case 7: printf("‚‚Ґ¤ЁвҐ ®жҐЄг\n");
scanf("%f",&ff);
j=0;
for (i=0;i<c;i++)
if (ff==rec[i].sred)
{
printrec(rec,i+1,i,z);
z++;
j++;
}
if (j==0) printf("‘®ўЇ®¤ҐЁ© Ґ¤!!! Ё¤ЁвҐ ЁйЁвҐ ᥢҐаҐ =)\n");
getch();
break;
}
}
int main()
{
struct record base [30];
int nn;
int c;
int count=1;
int basecount=0;
int i,j;
int fd;
float q;
fd=open("W:/LAB2_2/BAZA.DB",O_RDONLY);
if (fd!=-1)
{
read(fd,&basecount,sizeof(int));
for (i=0;i<basecount;i++)
read(fd,&base[i],sizeof(struct record));
}
close(fd);
clrscr();
while (c!=283)
{
menu(count);
c = bioskey(0);
switch(c)
{
case 18432: if (count!=1) count--;
break;
case 20480: if (count!=6) count++;
break;
case 7181:
{
switch(count)
{
case 1:printrec(base,basecount,0,0);
getch();
clrscr();
menu(count);
break;
case 2:base [basecount]=addrec();
basecount++;
clrscr();
menu(count);
break;
case 3:clrscr();
printf("‚ўҐ¤ЁвҐ ®¬Ґа । ЄвЁа㥬®© § ЇЁбЁ:\n");
scanf("%d",&nn);
--nn;
clrscr();
printf("‚л । ЄвЁагҐвҐ ¤ го § ЇЁбм:\n");
printrec(base,nn+1,nn,0);
getch();
clrscr();
base [nn]=addrec();
clrscr();
menu(count);
break;
case 4:clrscr();
printf("‚ўҐ¤ЁвҐ ®¬Ґа г¤ «пҐ¬®© § ЇЁбЁ:\n");
scanf("%d",&nn);
--nn;
printrec(base,nn+1,nn,0);
clrscr();
for(i=nn;i<basecount-1;i++)
{
base[i]=base[i+1];
}
basecount--;
menu(count);
break;
case 5:clrscr();
printf("‚ўҐўЁвҐ Ї®«Ґ Ї®ЁбЄ :\n 1 - ” ¬Ё«Ёп\n 2 - €¬п\n 3 - ѓагЇЇ \n 4 - ЋжҐЄ Ї® ¬ ⥬ вЁЄҐ\n 5 - ЋжҐЄ Ї® дЁ§ЁЄҐ\n 6 - ЋжҐЄ Ї® Ёд®а¬ вЁЄҐ\n 7 - ‘।Ё© Ў «\n");
scanf("%d",&nn);
search(base,basecount,nn);
menu(count);
break;
case 6: fd=open("W:/LAB2_2/BAZA.DB",O_CREAT|O_RDWR|O_TRUNC);
if (fd!=-1)
{
write(fd,&basecount,sizeof(int));
for (i=0;i<basecount;i++)
write(fd,&base[i],sizeof(struct record));
}
close(fd);
exit();
}
}
}
}
}
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-26 18:04:15.346666
|
|
|
craken
Сообщений: 15
Оценки: 0
Присоединился: 2009-07-17 20:06:16.480000
|
ну ё маё, я и учу… ты предлагаеш чтобы тип был string а не char??? Можете помоч с данной задачей? мне главное отладить вывод, алгоритм сортировки и тд я сам напишу. делаю по книге павловская щупак, так там вообще половина всего не работало, просто новую тему начали проходить вот вопросы и возникают… если не охота разбиратся лучше так и сказать… я просто уже 2 день бьюсь над ней
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-26 18:21:46.290000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Для копирования строк используй strcpy, типа: strcpy( pv->otvet, man.otvet ); Просто сильно много тебе объяснять ;), если хочется правильно сделать.
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-26 21:09:14.783333
|
|
|
craken
Сообщений: 15
Оценки: 0
Присоединился: 2009-07-17 20:06:16.480000
|
спасибо буду разбираться))
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-26 23:32:44.030000
|
|
|
craken
Сообщений: 15
Оценки: 0
Присоединился: 2009-07-17 20:06:16.480000
|
жесть, учебник называется((( половину кода пришлось переписать, вот чему нас учат?? p.s. есть хоть на кого свалить xD
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-26 23:41:31.503333
|
|
|
iidsp
Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
|
Всегда избегал объявление в теле цикла каких-либо переменных, думал, что при каждой итерации, они будут переобъявляться, и их адреса будут меняться(хз почему я так думал), но вот сейчас попробовал посмотреть адреса переменных в цикле и понял, что эти самые переменные объявляются 1 раз. правильно я понял?
#include <iostream>
int main(void)
{
int i = 0;
while(i < 4)
{
int a = 1;
int *pA = &a;
int b = 2;
int *pB = &b;
std::cout << "*pA= " << pA << "\t*pB= " << pB <<std::endl;
++i;
}
system("PAUSE");
} И мне кажется, что я не до конца понимаю разницу между объявлением и определением. Объявить переменную, как я понял - это значит, выделить для нее область памяти, соотв. ее типу и дать ей имя. А что тогда есть определить переменную?
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-26 23:49:01.466666
|
|
|
Sрam
Сообщений: 2863
Оценки: 372
Присоединился: 2009-01-16 15:23:43.276666
|
Можно объявить переменную и инициализировать(определить) её объявить: выделить под нее память, но не присваивать каких либо значений инициализировать : присвоить ей какие либо значение… Понято? Ошибочка…. пямять при обьявл не выделяется! PS на сколько я знаю функция system использутся только совместно с библиотекой stdlib.h …
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-26 23:53:39.753333
|
|
|
iidsp
Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
|
quote:
PS на сколько я знаю функция system использутся только совместно с библиотекой stdlib.h … в с++ - не надо подключать доп хедеров. Значит определить переменную и инициализировать - это синонимы?! стыдно, конечно, задавать такие глупости, но это так сказать, всплыло что-то внезапно…
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-26 23:58:09.506666
|
|
|
Sрam
Сообщений: 2863
Оценки: 372
Присоединился: 2009-01-16 15:23:43.276666
|
Нет, переменную нельзя проинициализировать не обьявив!!!
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 00:12:36.330000
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: iidsp Всегда избегал объявление в теле цикла каких-либо переменных, думал, что при каждой итерации, они будут переобъявляться, и их адреса будут меняться(хз почему я так думал), но вот сейчас попробовал посмотреть адреса переменных в цикле и понял, что эти самые переменные объявляются 1 раз. правильно я понял? Да, ты правильно понял. Чтобы переменные, объявленные в блоке, создались повторно надо выйти из блока и войти снова. То есть цикл должен завершиться, и начаться заново, тогда это будут уже другие переменные. quote:
ORIGINAL: iidsp И мне кажется, что я не до конца понимаю разницу между объявлением и определением. Объявить переменную, как я понял - это значит, выделить для нее область памяти, соотв. ее типу и дать ей имя. А что тогда есть определить переменную? Строго говоря всё не так. Объявление (declaration) переменной – это просто объявление. Это когда мы говорим компилятору что такая переменная должна быть, но не выделяем под неё память. А определение (definition) – это тоже самое но с выделением памяти. Определение может сопровождаться инициализацией. Например:extern int i; //чистой воды объявление. мы говорим что "есть переменная i с типом int"
int j; //определение -- мы требуем от компилятора создать переменную j с типом int
int k = 5; // определение с инициализацией Но, как правило, никто не следит за строгостью своего языка, и везде используют термин "объявление".
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 00:45:44.856666
|
|
|
iidsp
Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
|
quote:
Да, ты правильно понял. Чтобы переменные, объявленные в блоке, создались повторно надо выйти из блока и войти снова. То есть цикл должен завершиться, и начаться заново, тогда это будут уже другие переменные. к сожалению, у меня не получилось получить другие переменные(для меня другие переменные это те, у которых сменился адрес, мб я не прав) #include <iostream>
int main(void)
{
m1:
for(int i = 0; i < 2; ++i)
{
for(int j = 0; j < 2; ++j)
{
int a = 1;
int *pA = &a;
int b = 2;
int *pB = &b;
std::cout << "*pA= " << pA << "\t*pB= " << pB <<std::endl;
}
}
system("PAUSE");
goto m1;
}
да же первый(и последний) раз в жизни написал goto. quote:
Но, как правило, никто не следит за строгостью своего языка, и везде используют термин "объявление". спасибо, буду говорить правильно!
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 00:48:14.430000
|
|
|
iidsp
Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
|
quote:
extern int i; //чистой воды объявление. мы говорим что "есть переменная i с типом int" а в каком случае нам может это понадобиться?
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 00:50:51.270000
|
|
|
iidsp
Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
|
quote:
quote: extern int i; //чистой воды объявление. мы говорим что "есть переменная i с типом int" а в каком случае нам может это понадобиться? примерный ответ нашел тут http://www.rsdn.ru/forum/cpp/2706624.1.aspx
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 01:08:50.576666
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: iidsp quote:
Да, ты правильно понял. Чтобы переменные, объявленные в блоке, создались повторно надо выйти из блока и войти снова. То есть цикл должен завершиться, и начаться заново, тогда это будут уже другие переменные. к сожалению, у меня не получилось получить другие переменные(для меня другие переменные это те, у которых сменился адрес, мб я не прав) Сложный философский вопрос. На самом деле адрес новой переменной может просто совпасть со старым. Но я считаю, что если мы пишем: int k = 1; и после этого значение k всегда 1, то это значит что мы создаём новую переменную. Я, кстати, не прав был. Переменные будут меняться при переходе от одной итерации к другой. Смотри: for (i = 0; i < 10; i ++) {
for (j = 0; j < 3; j ++) {
int k = 0;
printf ("[%2d;%2d] k == %d\n", i, j, ++k);
}
p[i] = (char*)alloca (32);
} выводит на экран:[ 0; 0] k == 1
[ 0; 1] k == 1
[ 0; 2] k == 1
[ 1; 0] k == 1
[ 1; 1] k == 1
[ 1; 2] k == 1
[ 2; 0] k == 1
[ 2; 1] k == 1
[ 2; 2] k == 1
[ 3; 0] k == 1
[ 3; 1] k == 1
[ 3; 2] k == 1
[ 4; 0] k == 1
... Значение k ресетится каждый раз. Хм. Вот что значит иметь C-шную привычку объявлять все локальные переменные в начале функции. Такая важная особенность, а я не знаю.
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 01:57:38.460000
|
|
|
craken
Сообщений: 15
Оценки: 0
Присоединился: 2009-07-17 20:06:16.480000
|
помогите ещё раз, вылетает ошибка Laba_9.obj : error LNK2001: unresolved external symbol "void __cdecl find_u(struct Man *,int,char,char,char)" (?find_u@@YAXPAUMan@@HDDD@Z)
void find_u (Man* beg, int age, const char *pol,const char *obroz, const char *otvet){
Man* pv = beg;
bool flak = false;
while (pv){
if (pv->age == age)
if (strcmp(pv->pol, pol)==0)
if (strcmp(pv->obroz, obroz)==0)
if (strcmp(pv->otvet, otvet)==0){
printf("%d,%s,%s,%s\n", pv->age, pv->pol, pv->obroz, pv->otvet);
flak=true;
};
};
if (!flak)
printf(Rus("Íåò òàêèõ àíêåò"));
} нужно просто сравнить pv->pol и pol, и т.д. а там пораметры должны быть const
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 02:46:56.250000
|
|
|
iidsp
Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
|
quote:
Значение k ресетится каждый раз. Хм. Вот что значит иметь C-шную привычку объявлять все локальные переменные в начале функции. Такая важная особенность, а я не знаю. И это был бы неплохим вопросом на собеседовании =) дак можно определять переменные внутри цикла - или это плохой стиль?
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 02:50:47.800000
|
|
|
iidsp
Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
|
Читая Страуструпа, наткнулся на такой момент, который меня ввел в ступор s1 = s1 + '\n'; s2 += '\n'; Он пишет, что оба способа эквивалентны, но он предпочитает второй, т.к, внимание, он скорее всего реализован более эффективно(3 спец издание стр. 85). Он что не уверен?
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 03:04:29.290000
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
дак можно определять переменные внутри цикла - или это плохой стиль? Да нет, вряд ли. quote:
Он пишет, что оба способа эквивалентны, но он предпочитает второй, т.к, внимание, он скорее всего реализован более эффективно. Он что не уверен? А как он может быть уверен в том, что все компиляторы C++ будут из s2+='\n' делать более эффективный код? Хуже того, я думаю что современные компиляторы C++ генерят одинаково эффективный код для обоих выражений. Они в состоянии понять, что семантически выражения одинаковы. А может на каких-то платформах (не на x86) нельзя += сделать как-то по-особенному. Это на x86 инструкция `add a, b' работает прямо как `a+=b', а на других может быть нету такой add, но есть инструкция `add a, b, c', которая эквивалентна `a=b+c', причём инструкция выкидывает исключение, если a и b – это одна и та же ячейка памяти. На такой гипотетической платформе += не будет лучше. Но я подчеркну, вряд ли на x86 a+=b скомпилируется во что-то более эффективное чем a=a+b, я думаю компилятор заметит одинаковость и реализует оба варианта одним и тем же ассемблерным кодом, одной инструкцией add.
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 03:13:50.316666
|
|
|
iidsp
Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
|
quote:
Да нет, вряд ли. а почему тогда у Бьерна написано так bool accept3()
{
int tries = 1;
while(tries < 4)
{
char answer = 0;
cin >> answer;
...
}
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 03:33:56.146666
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: iidsp quote:
Да нет, вряд ли. а почему тогда у Бьерна написано так Я ж говорю: вряд ли это плохой стиль. Да и вообще, понятия о хорошем/плохом стиле очень расплывчаты. Важен не стиль, важно следование стилю. Хоть какому-нибудь.
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 11:45:18.446666
|
|
|
Lost_boy
Сообщений: 327
Оценки: 0
Присоединился: 2009-03-25 11:07:27.910000
|
iidsp главное чтобы ты знал, что ты делаешь и ясно понимал, что в твоем конкретном случае будет предпочтительней. На счет объявления переменных в цикле, это абсолютно нормально, так что можешь не мучать свой мозг этим вопросом =)
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 18:01:10.893333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
Попробуем "на пальцах":
int foo( void )
{
int i;
// Do something...
for ( i = 0; i < 10; ++i )
{
int var; // Будем говорить про эту переменную.
var = 5;
}
return 0;
}
В данном случае переменная var объявлена внутри какого-то блока. Память под переменную var будет выделена при входе в функцию, но при написании программы сама переменная будет "видна" только внутри блока for. Т.е. в коде переменные можно использовать только внутри того блока, в котором они объявлены. Но если сделать такой выкрутас:
int foo( void )
{
int i;
int *p = 0;
// Do something...
for ( i = 0; i < 10; ++i )
{
int var;
if ( p != &var )
{
std::cout << "Value of P changed" << std::endl; // Будет выведено только 1 раз.
p = &var;
}
}
return 0;
}
То сообщение будет выведено только один раз, когда p (проинициализированный нулём) будет первый раз сравниваться. Но такими "фичами" крайне не рекомендуется (да и незачем) пользоваться в языке С++, когда в роли переменной будут объекты. Для объектов деструктор будет вызываться сразу после выхода из блока, где объявлена переменная, но память будет освобождаться после выхода из функции. В общем, правило простое: где объявил переменную - там её и используй. Стоит считать, что это каждый раз новая переменная. Но на использование памяти место объявления переменной никак не влияет.
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 21:47:27.150000
|
|
|
craken
Сообщений: 15
Оценки: 0
Присоединился: 2009-07-17 20:06:16.480000
|
ребят чего за фигня такая??? если ввести a и b MMM и MMM работает всё, а если mmm и mmm, то зацикливание. а русские вообще не тянет
void sravnenie(const char *a,const char *b){
if (strcmp(a,b)==0)
printf(Rus("Не равны\т"));
else
printf(Rus("равны\n"));
}
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-27 21:53:32.813333
|
|
|
Sрam
Сообщений: 2863
Оценки: 372
Присоединился: 2009-01-16 15:23:43.276666
|
Полностью листинг покажи
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-28 01:58:17.570000
|
|
|
iidsp
Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
|
используйте ли вы в своих программах typedef? Нужно ли это…
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-28 04:34:05.690000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
quote:
ORIGINAL: iidsp используйте ли вы в своих программах typedef? Нужно ли это… Смысл опроса? Юзать что-то вроде: #ifdef UNICODE typedef std::wstring string; #else typedef std::string string; #endif typedef обычно юзаю только для объявления указателей на функции, других ситуаций, где с ним было бы реально удобнее - не встречал (или не помню). Примеры использования посмотри тут: http://code.google.com/intl/ru/query/#q=typedef
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-28 05:26:06.716666
|
|
|
iidsp
Сообщений: 379
Оценки: 0
Присоединился: 2009-10-14 23:13:19.856666
|
ни какой это не опрос, просто я изучаю с++ и то, что мне кажется на данном этапе непонятным в плане использования, я спрашиваю… так. что - это всего лишь моя гипер любознательность…
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-28 06:19:39.560000
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
Если загодя сделать тайпдеф, то потом запись можно нехило укоротить код и сделать его понятнее: for (list<vect<GLfloat, 4> >::iterator i = p.begin(); i != p.end (); i++) Сравните с вариантом, когда вместо list<vect<GLfloat, 4> >::iterator стоит что-нибудь в стиле: vlist_iter_t
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-02-28 13:49:55.413333
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
quote:
… Сравните с вариантом, когда вместо list<vect<GLfloat, 4> >::iterator стоит что-нибудь в стиле: vlist_iter_t Если проект большой и у него есть косяки в дизайне (приходилось одну софтину дописывать), то разные программисты могут начать плодить тайпдэфы. Причём разные на одни и те же типы данных. Очень сложно потом разобраться, где и что. Укоротить код - да, сделать понятнее - не факт. Нужно жёстко заранее оговаривать правила именования типов, да и то, для надёжности придётся постоянно лазить и смотреть эти тайпдэфы. Лично мне всё понятно и без тайпдэфов. Хочется более лаконичного языка - вперёд, на C# ;). Хотя это тоже вопрос вкуса. ——- Тут подумал, и решил дописать, что всё-таки всё зависит от области применения тайпдэфов. Лупить их везде подрят не стоит, но и лишними они тоже не будут.
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-03-01 13:42:26.383333
|
|
|
little_programmer
Сообщений: 7
Оценки: 0
Присоединился: 2010-03-01 13:37:15.853333
|
Господа программисты, помогите решить вот такую задачу, а если и не решить, то хотя бы подскажите алгорит решения.. Задача. Имеются 5 значений в формате sasha_*набор разных символов* и 5 значений в формате masha_*набор разных символов*, каждому из которых соответствует определенный код md5 в формате 415cd536c9fa1a491b20ee6e9a75a377 . Задача: составить программу с интерфейсом 1 поле для ввода и 1 кнопка, которая после ввода кода 63946d05e8869f6498b60fea371a46aa и нажатия на кнопку анализировала бы его, подставляя имеющиеся в базе значения. Все символы определять не обязательно, достаточно определить только первую букву (s или m). Задача не решается с помощью словаря. Таблица имеющихся данных: sasha_5L27dhuVOB - 7345f8a66509c9371d7714a9552f81b4 sasha_2Yg2KFH56Y - 95009f023f870652545eb58205a7b5af sasha_pRo6np0g2Y - 6f0a7fbab551e6c4d81e0017498ac482 sasha_O5sHB08x6T - 30d825ca30c1ed17ee8e9b38756d46ee sasha_KVJ5cA64tK - afebc08dd424fdb0559d6523847db2fd masha_tK4D5GPr75 - 3e55dcbc3487e59d5f8a020355eb643b masha_0G2FRJ810N - e40a0cf8810252d79f3cc1f15a420864 masha_biR2Q7Lb7O - ccb5d49cfe6476f7a4dc1224881f53b1 masha_7OS1v03GiI - 2cf1287b62d3f3ec5eb57b2c518ba25e masha_6KpkyQC237 - 2a6e425d56380293a8907e495e6888d6 Ответ: 63946d05e8869f6498b60fea371a46aa - ?asha_*набор разных символов*.
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-03-01 14:50:59.170000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
1. Берешь первое значение из базы, находишь его md5 2. Сравниваешь полученный хэш с введённым 3. Если остались ещё записи - переходишь к пункту 1. P.S. А вообще нифига не понятно, что должно быть после слова "Ответ:"
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-03-01 14:53:21.040000
|
|
|
sanday
Сообщений: 41
Оценки: 0
Присоединился: 2010-02-06 12:52:26.896666
|
quote:
Следующая моя задача - просят ввести число нечетное ( от 1 до 19) - и на основании этого числа, построить ромб, где введенное число - является числом строк в ромбе, так вот, если использовать выше написанный код, для данной задачи, уж очень большим и на вид не удобным получается код. код: //Программа для печати ромба с заданым числом строк
#include <iostream>
using namespace std;
main() {
int line, gap;
cout << "Введите нечетное число строк от 1 до 19: ";
cin >> line;
gap = (line - 1) / 2;
for (int j = 0; j <= gap; j++) {
for (int i = 1; i <= gap - j; i++)
cout << " ";
for (int a = 0; a <= j; a++)
cout << "*";
for (int b = 0; b <= j - 1; b++)
cout << '*';
cout << endl;
}
for (int k = 0; k <= gap - 1; k++) {
for (int i = 0; i <= k; i++)
cout << " ";
for (int a = 1; a <= gap - k; a++)
cout << "*";
for (int b = 1; b <= gap - k - 1; b++)
cout << "*";
cout << endl;
}
system("pause");
return 0;
}
немного попроще, с учетом моих знаний на данном этапе)))
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-03-01 15:14:47.650000
|
|
|
little_programmer
Сообщений: 7
Оценки: 0
Присоединился: 2010-03-01 13:37:15.853333
|
Надо чтобы программа как-то сравнивала (как я не понимаю).. А в ответе должна быть буква m или s. То есть нужно сделать такую программку и ввести в поле 63946d05e8869f6498b60fea371a46aa. Ответом является то, что выдаст программа.
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-03-01 16:04:04.410000
|
|
|
_SaZ_
Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
|
quote:
ORIGINAL: little_programmer Надо чтобы программа как-то сравнивала (как я не понимаю).. А в ответе должна быть буква m или s. То есть нужно сделать такую программку и ввести в поле 63946d05e8869f6498b60fea371a46aa. Ответом является то, что выдаст программа. Мне закономерность не понятна. В каком случае и что выводить. Опиши предполагаемый алгоритм работы программы. Телепаты в отпуске.
|
|
|
RE: Вопросы по C/C++ (Для новичков) - 2010-03-01 16:21:21.653333
|
|
|
little_programmer
Сообщений: 7
Оценки: 0
Присоединился: 2010-03-01 13:37:15.853333
|
Работа программы такова: вводишь в строку md5 код 63946d05e8869f6498b60fea371a46aa и нажимаешь на кнопку, после чего программа дает ответ. Алгоритм: после ввода md5 кода программа орбатится к своей базе данных. Грубо говоря, она состоит из 2-х столбцов: в первом все md5 коды, при расшифровке которых первая буква - s (т.е. sasha_*10 цифр*, это точно известно), во втором тоже самое, только для буквы m. Программа должна как-то сравнить введенное значение со значениями md5, имеющимися в базе. Если больше всего подойдет любой из md5 кодов "правого столбца", то программа выводит ответ "s", а если "левого" - "m". То есть программа выбирает одно из двух - s или m. Я не могу понять, по какому принципу сравнивать введенный md5 код с md5 кодами в базе.
|
|
|
|
|