Страница 1 из 1

помогите разобраться

Добавлено: 08 июл 2005, 15:26
Тёма_2375
Всем привет!
Блин пришло лето - наступила летняя практика! ужас!
в общем ща опишу свою проблему. у меня задание было такое:
Задание:
SELECT UPPER (surname), UPPER (name)
FROM STUDENT
WHERE NAME LIKE ‘И%’ OR NAME LIKE ‘С%’

написано оно на sql.

Вот уточнение задания, уже написаное мной -
В задании необходимо вывести в верхнем регистре фамилии и имена студентов, имена которых начинаются на “И” или на “С”.

вот приблизительный листинг программы, в ней 2 проблемы!

Листинг программы:
#include "stdafx.h"
#include "string.h"

// Используемые структуры
struct STUDENT { // Студент
long STUDENT_ID; // числовой код, идентифицирующий студента
char SURNAME[15]; // фамилия студента
char NAME[15]; // имя студента
short STIPEND; // стипендия, которую получает студент
short KURS; // курс, на котором учится студент
char CITY[50]; // город, в котором живет студент
char BIRTHDAY[11]; // дата рождения студента
long UNIV_ID; // числовой код, идентифицирующий университет, в котором учится студент
} *TSTUDENT, *TRezult;

// Реализованные процедуры и функции
void InputData(void);
void InputRecord(int Index);
void CultivationData(void);
void DifinitionSise(void);
void InitData(void);
void MoveRecord(unsigned long IndexIn, unsigned long IndexOut);
void OutputData(void);
void OutputRecord(unsigned long Index);

// Глобальные переменные
unsigned long RSize; //Размер результирующего массива
int N; //Количество строк в таблице STUDENT

int main(int argc, char* argv[])
{
InputData();
CultivationData();
OutputData();

//Освобождаем память
delete [] TSTUDENT; // освобождение памяти
delete [] TRezult; // освобождение памяти

//printf("Hello World!\n");
return 0;
}



// Ввод данных таблицы STUDENT
void InputData(void)
{
// Спрашиваем количество строк
printf("\nPlease enter the number of record tab STUDENT:");
scanf("%ld",&N);

// Создаем динамический массив STUDENT
TSTUDENT = new STUDENT [N]; // выделение памяти под массив

// Заполняем массив данными
printf("\nPlease enter: STUDENT_ID SURNAME NAME STIPEND KURS CITY BIRTHDAY UNIV_ID\n");
for(int ii=0;ii<N;++ii) InputRecord(ii);
printf("\n");
}

// Ввод одной строки, заполнение элемента массива STUDENT
void InputRecord(int Index)
{ // Index - индекс заполняемого массива
// текущий номер, заполняемого элемента

printf("record %04d : ",Index+1);
scanf("%ld %ld %ld %hd %10s", &TSTUDENT[Index].STUDENT_ID, &TSTUDENT[Index].SURNAME, &TSTUDENT[Index].NAME, &TSTUDENT[Index].STIPEND, TSTUDENT[Index].KURS, TSTUDENT[Index].CITY, TSTUDENT[Index].BIRTHDAY, TSTUDENT[Index].UNIV_ID);

}

// Обработка данных, формирование результирующей таблицы Rezult
void CultivationData(void)
{
// Определение размерности результата (RSize)
DifinitionSise();

// Создаем динамический массив TRezult
TRezult = new STUDENT [RSize]; // выделение памяти под массив

// Заполняем динамический массив Rezalt данными
InitData();
}

// Определение размерности результата (RSize)
void DifinitionSise(void)
{
RSize=0;

//Вот здесь собственно и начинается проблемма
//нужно написать условие - что если имя начинается на И или на С, то результат увеличивается
for(int ii=0; ii<N; ++ii)
if (TSTUDENT[ii].NAME = ‘И%’ && TSTUDENT[ii].NAME = ‘С%’) ++RSize;
}

// Заполняем динамический массив Rezalt данными
void InitData(void)
{
int jj=0;
//Здесь тоже самое, что и немного выше. такое же условие
for(int ii=0; ii<N; ++ii)
if (TSTUDENT[ii].NAME = ‘И%’ && TSTUDENT[ii].NAME = ‘С%’){
// Перенос данных в результирующую таблицу
MoveRecord(jj,ii);
++jj;
}
}



// Перенос записи из одной таблицы в другую
void MoveRecord(unsigned long IndexIn, unsigned long IndexOut)
{

TRezult[IndexIn].SURNAME = TSTUDENT[IndexOut].SURNAME; // идентификатор фамилии
TRezult[IndexIn].NAME = TSTUDENT[IndexOut].NAME; // идентификатор имени

// Вывод данных на экран
void OutputData(void)
{
// Выводим на экран заголовок таблицы
printf("\n SURNAME \t NAME");
for(int ii=0;ii<(int)RSize;++ii) OutputRecord(ii);

// Концовка
printf("\n\n\n");
}

// Вывод на экран строки (Index - номер строки)
void OutputRecord(unsigned long Index)
{
// Выводим на экран строку результирующей таблицы
//И наконец здесь - мне нужно вывести всё в верхнем регистре - т.е. большими буквами. как это сделать???
printf("\n Record %04d: %04d %04d", Index+1, TRezult[Index].SURNAME, TRezult[Index].NAME);
}


Вот собственно и всё!!! :D
Помогите кто чем может!!! Если есть какие-то ошибки или замечания по программе прошу сообщить!

А компилятор не ругается?

Добавлено: 08 июл 2005, 16:47
Albor
Вопервых в операторе if идёт присваивание, а не сравнение. Должно быть ==. Во вторых - NAME это указатель на нулевой элемент массива и для сравнения с символом, его, как минимум, нужно разименовать *NAME=='И' или так NAME[0]=='И'.

Добавлено: 08 июл 2005, 23:40
Тёма_2375
Albor,
спасибо за подсказку.
Компилятор ругается ещё как! поэтому я и прошу помощи!

Верхний регистр

Добавлено: 10 июл 2005, 18:21
Тёма_2375
Во! долго искал, и всё-таки нашёл функцию, которая преобразует литеры к верхнему регистру.
кому надо - можете пользоваться! мне пригодилась.

STRUPR

Описание
Функция преобразует все литеры нижнего регистра строки
string в соответствующие литеры верхнего регистра.

Использование
#include <string.h>
char *strupr(char *string);

Возвращаемое значение
Функция возвращает string.

Пример

#include <stdio.h>
#include <string.h>
char *string = "Строка В Разных Регистрах";
main()
{
printf("Пример со strupr [%s]\n", strupr(string));
}