Jump to content

търся помощ за една програма


Препоръчан пост

Здравейте. Търся помощ за една задача на с++. Имам проблем с написването и. Ако някой може да помогне ще съм ви благодарен много.

 

 

За група студенти са зададени факултетен номер, оценките по 3 дисциплини, среден успех. Да се създаде програма която:

- въвежда информация за групата студенти, без среден успех

- изччислява средния успех на всеки един от студентите

- изчислява средния успех по първата дисциплина

- намира фак. номер на студента с най- висок успех

Link to comment
Сподели другаде

Ще го направим със библиотеката за стандартен вход/изход <stdio.h> от едно време, така както се учи :).

 

Начало:

 

#include <stdio.h>

struct Student
{
char Name[40];
char FakNomer[10];
float Ocenka1;
float Ocenka2;
float Ocenka3;
float SrUspeh;
};

const int MaxStudNumber=100;

int main()
{
Student *stud[MaxStudNumber]; // Това не е добро решение. Има ограничение на 
			// максималния брой на студентите "MaxStudNumber" 
			// което можеш да си зададеш сам (колкото решиш)
			//По принцип бих го направил със двусвързан списък
          	// но смятам, че не сте стигнали до там още 	
int br_studenti;

printf("%s", "Въведете броя на студентите в групата: ");
scanf("%d", &br_studenti);

for (int i=1; i<br_studenti+1; i++)
{
stud[i] = new Student;

printf("%s%d", "Въведете Името на студент номер ", i);
scanf("%s", &stud[i]->Name);

printf("%s%d", "Въведете Фак. номер на студент номер ", i);
scanf("%s", &stud[i]->FakNomer);

printf("%s%d", "Въведете първата оценка на студент номер ", i);
scanf("%f", &stud[i]->Ocenka1);

printf("%s%d", "Въведете втората оценка на студент номер ", i);
scanf("%f", &stud[i]->Ocenka2);

printf("%s%d", "Въведете третата оценка на студент номер ", i);
scanf("%f", &stud[i]->Ocenka3);

stud[i]->SrUspeh = (stud[i]->Ocenka1 + stud[i]->Ocenka2 + stud[i]->Ocenka3)/3; 

}

float SUPD=0; // среден успех по първата дисциплина
float Sum=0;

for (int i=1; i<br_studenti+1; i++)
{
Sum += stud[i]->Ocenka1; 
}

SUPD = Sum/br_studenti;

Student *Max_Uspeh_ptr; // указател сочещ студента със най висок среден успех
					// ако има с равен ср. успех ще бъде първия срешнат

Max_Uspeh_ptr = stud[1];
for (int i=2; i<br_studenti+1; i++)
{
if (Max_Uspeh_ptr->SrUspeh<stud[i]->SrUspeh)
Max_Uspeh_ptr = stud[i];
}

// извеждане на резултатите:

for (int i=1; i<br_studenti+1; i++)
{
printf("%s%d%s", "Средния успех на студент номер ", i, " e:");
printf("%f\n", stud[i]->SrUspeh); 	
}

printf("%s%f", "Средния успех по първата дисциплина е: ", SUPD);

printf("%s\n", "Студентът с най-висок успех:");
printf("%s\n", Max_Uspeh_ptr->Name );
printf("%s\n", Max_Uspeh_ptr->FakNomer );
printf("%f\n", Max_Uspeh_ptr->Ocenka1 );
printf("%f\n", Max_Uspeh_ptr->Ocenka2 );
printf("%f\n", Max_Uspeh_ptr->Ocenka3 );
printf("%s\n", "--------------------" );
printf("%f\n", Max_Uspeh_ptr->SrUspeh );

return 1;
}

 

Край.

 

Значи, това е изключително просто, ако ти трябва да се окраси, ако не ти излиза кирилицата на екрана, въобще ако искаш промени пиши в тази тема. Ще го променим набързо.

Link to comment
Сподели другаде

благодаря много !!! Ще я прегледам и ако има нещо ще пиша. Благодаря отново

излизат ми 3 грешки и всички са за че има много инициализиране

и не ми излиза кирилица

Link to comment
Сподели другаде

Това е заради компилаторите най-вероятно. Това трябва да не дава грешка.

За кирилицата незнам. И на мен ми излизаха фигурки като я пуснах. Понеже е конзлоно приложение, май си използва само ASCII код, а в него няма букви на кирилица.

Но можеш да смениш кирилицата с латиница както в чата. Аз така правех.

 

#include <stdio.h>

struct Student
{
char Name[40];
char FakNomer[10];
float Ocenka1;
float Ocenka2;
float Ocenka3;
float SrUspeh;
};

const int MaxStudNumber=100;

int main()
{
int i=0;

Student *stud[MaxStudNumber]; // Това не е добро решение. Има ограничение на 
                               // максималния брой на студентите "MaxStudNumber" 
                               // което можеш да си зададеш сам (колкото решиш)
                               //По принцип бих го направил със двусвързан списък
               // но смятам, че не сте стигнали до там още 	
int br_studenti;

printf("%s", "Въведете броя на студентите в групата: ");
scanf("%d", &br_studenti);

for (i=1; i<br_studenti+1; i++)
{
stud[i] = new Student;
       
printf("%s%d", "Въведете Името на студент номер ", i);
scanf("%s", &stud[i]->Name);

printf("%s%d", "Въведете Фак. номер на студент номер ", i);
scanf("%s", &stud[i]->FakNomer);

printf("%s%d", "Въведете първата оценка на студент номер ", i);
scanf("%f", &stud[i]->Ocenka1);

printf("%s%d", "Въведете втората оценка на студент номер ", i);
scanf("%f", &stud[i]->Ocenka2);

printf("%s%d", "Въведете третата оценка на студент номер ", i);
scanf("%f", &stud[i]->Ocenka3);

stud[i]->SrUspeh = (stud[i]->Ocenka1 + stud[i]->Ocenka2 + stud[i]->Ocenka3)/3; 

}

float SUPD=0; // среден успех по първата дисциплина
float Sum=0;

for (i=1; i<br_studenti+1; i++)
{
Sum += stud[i]->Ocenka1; 
}

SUPD = Sum/br_studenti;

Student *Max_Uspeh_ptr; // указател сочещ студента със най висок среден успех
                                               // ако има с равен ср. успех ще бъде първия срешнат

Max_Uspeh_ptr = stud[1];
for (int i=2; i<br_studenti+1; i++)
{
if (Max_Uspeh_ptr->SrUspeh<stud[i]->SrUspeh)
Max_Uspeh_ptr = stud[i];
}

// извеждане на резултатите:

for (i=1; i<br_studenti+1; i++)
{
printf("%s%d%s", "Средния успех на студент номер ", i, " e:");
printf("%f\n", stud[i]->SrUspeh);   	
}

printf("%s%f", "Средния успех по първата дисциплина е: ", SUPD);

printf("%s", "Студентът с най-висок успех:");
printf("%s", Max_Uspeh_ptr->FakNomer );

return 1;
}

Link to comment
Сподели другаде

Моля.

Ако неразбираш нещо по програмката, спокойно ме питай. Аз обичам да обяснявам, а и тия дни почти нямам работа.

По принцип предпочитам да обяснявам с лист и химикал, но и с думи мисля че ще се получи. ;)

Link to comment
Сподели другаде

Значи, имам някаква бегла представа за какво става вапрос,ясно ми е какви са циклите и кога се вавеждат интиджърски или флоутски стоиности, но не мога да намирам последователността или пък ,ако има грешки не мога да ги отстраня всички. И незнам защо са се получили. Преправих на латински кирилицата ,но програмата ми исписва 3 грешки за , че бил многозначен и да погледна декларирането,ти ми каза, че било заради компилаторите, но на мен това не ми говори нищо и незнам как да я подкарам. Грешките са в последните 3 цикъла for и като ги променя с j,k,m, програмата трагва. В момента в който въведа студентите и оценките и трябва да изведе резултатите, исписва грешка и спира. Незнам дали е от самата програма Micrsoft visual c++ 6.0 ,но е някаква рязана версия и е около 1,2GB взел съм я от един колега от вимес. Тези проблеми ги прави с първата програмка. Втората има пак същия проблм само, че 1 грешка.Аз много не разбирам от това , но ни обясняваха нешо за двумерен масив . :bang:
Link to comment
Сподели другаде

Ясно. Сигурно ви предава Цецо Василев на лекции ... :). Той е добър преподавател между другото.

Би трябвало грешката да е Multiple declaration of i. В редовете for (int i=2; i<br_studenti+1; i++). Дава тази грешка, защото се опитваме да обявим i няколко пъти (аз във втория вариант съм пропуснал един грешен ред да поправя). Втората грешка, най-вероятно е access violation. Само предполагам за това, защото при мен работи. Може би трябва след реда Student *Max_Uspeh_ptr; да добавиш:

Max_Uspeh_ptr = new Student;

Аз, между другото, първо написах програмата в средата C-Free 5. После я пуснах и даде резултат, с изключение на кирилицата. Не мога да повярвам, че Miscrosoft Visual Studio 6, не може да компилира този код. А аз използвам същия синтаксис в C++ Builder 6 и RAD Studio.

Като прочетох за двумерния масив, се сетих, че вие не сте взели още за структури и указатели. Затова ще направя промени по програмата и ще ти обясня горе долу какво се случва с подробни коментари.

Да ти кажа една "тайна" - образованието е под всякаква критика. Вие започвате с език от високо ниво. За това няма как да ти обясня точно какво става. Ще ми трябват лист и химикал. Все едно да строиш къща отгоре надолу. То ако ще се учи програмиране за да си направиш програмка за пресмятане на някакви неща, по-добре е да се учи Excel. Доста по-удобно е.

 

#include <stdio.h>

const int MaxStudNumber=100; 
/* 
Тук си определяме колко записа най-много може да има. 
Ако надвишим тази стойност, програмата ще блокира. За да я защитим
можем да добавим след scanf("%d", &br_studenti); следното:
if (br_studenti>MaxStudNumber)
br_studenti = MaxStudNumber;
Така, дори да въведем по-голяма стойност, автоматично тя ще стане равна
на MaxStudNumber 
По принцип, програмите се правят по друг начин. Но това ще учите чак във 
втори курс .
*/

int main()
{
int i=0;	
char Name[MaxStudNumber][40];
char FakNomer[MaxStudNumber][10]; 
float Ocenka1[MaxStudNumber]; 
float Ocenka2[MaxStudNumber]; 
float Ocenka3[MaxStudNumber]; 
float SrUspeh[MaxStudNumber]; 

int br_studenti;

printf("%s", "Въведете броя на студентите в групата: ");
scanf("%d", &br_studenti);	

for (i=1; i<br_studenti+1; i++)
{	
printf("%s%d", "Въведете Името на студент номер ", i);
scanf("%s", &Name[i]);

printf("%s%d", "Въведете Фак. номер на студент номер ", i);
scanf("%s", &FakNomer[i]);

printf("%s%d", "Въведете първата оценка на студент номер ", i);
scanf("%f", &Ocenka1[i]);

printf("%s%d", "Въведете втората оценка на студент номер ", i);
scanf("%f", &Ocenka2[i]);

printf("%s%d", "Въведете третата оценка на студент номер ", i);
scanf("%f", &Ocenka3[i]);

SrUspeh[i] = (Ocenka1[i] + Ocenka2[i] + Ocenka3[i])/3;
//пресмятаме средния успех на студента с номер i

}   // видях, че си писал, че въвеждането и извеждането са ти ясни.

float SUPD=0; // среден успех по първата дисциплина
float Sum=0;  // сумата на оценките по дисциплина 1. 

for (i=1; i<br_studenti+1; i++)
{
Sum = Sum + Ocenka1[i];  // събираме оценка 1 на всички студенти
}

SUPD = Sum/br_studenti; // разделяме сумата на броя на студентите за да получим 
		                                   // ср. успех по дисциплината

/* Сега трябва да намерим кой е най високия ср. успех. Затова ще намерим
номера му и после ще изпишем ФН с този номер. 
Първо ще си запишем ср. успех на първия студент. Ако има с по-висок успех, ще си
запишем неговия номер и неговия успех. */

int nomer=1;
float su=SrUspeh[1];

for (i=2; i<br_studenti+1; i++)
{
if (SrUspeh[i]>su)
{
su=SrUspeh[i];
nomer=i;
}

}

// извеждане на резултатите:

for (i=1; i<br_studenti+1; i++)
{
printf("%s%d%s", "Средния успех на студент номер ", i, " e: ");
printf("%f\n", SrUspeh[i]);  // "\n" e за нов ред.   	
}
// извеждаме ср. успех на всеки един

printf("%s%f\n", "Средния успех по първата дисциплина е: ", SUPD);
// извеждаме средния успех по дисциплина 1, който пресметнахме.

printf("%s\n", "Факултетния номер на студентът с най-висок успех е: ");
printf("%s", FakNomer[nomer]);
// Намерихме, че nomer е номера на студента който има най-висок ср. успех.
// Изписваме FakNomer с номера на студента с най-висок успех.

return 1;
}

 

Между другото вие учите по-скоро C, не C++(макар границата да е доста тънка).

Има и още нещо, което ви го спестяват, незнайно защо. Значи трябва да знаеш, че когато напишеш програма и пуснеш Compile или компилиране на българси, този текст се превръща в машинен код. Това осзначава, че той се разбива на по-прости команди(машинни инструкции) и данни(операнди). После това, което се е получило е годно за четене от процесора. Иначе този текст, който пишем, процесора не го разбира. Той трябва да бъде, един вид, преведен. За създаването на машинен код от текста, който пишем, освен превода има и други неща, но има време да се запознаете и с тях.

Според мен е важно да знаеш горе долу какво правиш. Например, когато напишеш a=b+c. Процесорът първо прочита от паметта стойността на b, после на c. После ги събира и полученото, записва в паметта на мястото на a. Това става с помощта на няколко машинни инструкции, а данните са стойностите на a, b и c. Когато напишеш printf(......), извикваш голяма програма, която се грижи за изрисуването на символите по екрана. Защото, за да се видят на екрана, те трябва да бъдат изрисувани там. Като се записва определена информация във видео паметта се променя картината на дисплея. Това се използва във функцията printf(....). Всъщност функцията printf(), извиква пък други функции, които свършват работата с видео паметта. Но главно ние извикваме printf() и не се интересуваме сега кои по-прости функции извиква тя.

Въобще, трябва да знаеш, че всеки ред който пишеш на C, се превръща в много машинни инструкции. И за да разбереш защо трябва да обявиш(да заделиш памет) някаква променлива преди да я използваш, трябва първо да разбереш как работи процесора(а това е по-просто от C) и как горе-долу работи компилатора(това е програмата, която превръща текста в машинен код). А за да обясня това ми трябват лист и химикал, защото трябва да се нарисува.

Надявам се да не съм те отекчил.

Link to comment
Сподели другаде

Здравей. Не си ме отегчил изобщо. Напротив дори засили интереса ми. Знам, че като го разбера ще ми се струва ,че е било много лесно, но би ли ми от къде да започна и в каква последователност, някаква по проста програма накоято да се уч, абе като начинаещ от най-простите неща
Link to comment
Сподели другаде

И да ми кажеш каква роля играе командата const на втория ред и за какво точно е char виждам че е нещо за масив и защо са два (предплагам). А на нас са ни говорили за void main и са ни учили с нея, но незнам каква е разликата между двете int и void, ако може и там да ме просветлиш
Link to comment
Сподели другаде

Първо ще отговоря на 2-рия коментар. const означава, че това число повече не можеш да го промениш. Това дава възможност да го използваш при обявяването на масив. Просто така е измислено.

Не можеш да направиш така:

int i=100;

int j;

Но можеш да направиш така:

const int i=100;

int j;

 

char е 1 байт, цяло число със знак. Можеш да запишеш число от -128 до 127. Например short int е 2 байта цяло число със знак, можеш да запишеш от -32768 до 32767. Ако след изчисления, например, ти се получи 400 000 и трябва да се запише в short int, ще има проблем, няма да се побере.

Но всъщност char се използва за текст. Текста всъщност преставлява числа. Например A е с номер 65(ASCII), B е 66, C е 67 и т.н. тоест:

char a = 65; и char a = "A"; е едно и също. char a = 65; a = a+1; вече е 66 или "B". a = a+2; Вече е 68 или "D".

Когато обявиш char a[100]; Ти всъщност обявяваш 100 числа от тип char, т.е. от -128 до 127;

ако искаш първото да е A, можеш да напишеш: a[0] = "A"; или a[0] = 65;

Ако искаш първите 10 да са А, int i=0; for (i=0; i<10; i++) a = "A";

Когато напишеш printf("%s", a); компютъра започва да чете последователно числата и да ги извежда като букви на екрана. За това се пише това %s. За да знае компютъра, че става въпрос за текст. Защото може да става въпрос и за цели числа.

Ако напишеш printf("%s", a[0]) - ще се изведе А.

Ако напишеш printf("%d", a[0]) - ще се изведе 65.

Ако напишеш printf("%d", a) - ще ти каже, че има грешка защото a е 100 числа а ти искаш да изведеш 1.

Ако напишеш printf("%s", a) - ще изведе целия текст.

 

Ако те интересуват номерата на символите виж това: http://www.google.bg...ved=0CDUQ9QEwBg

 

Във колонката DEC е номера. Другите са в други бройни системи(ще учите това във втори курс, както казах системата на обучение е малко крива).

Ще забележиш, че "A" е 65, "B" е 66, "0" е 48, "1" е 49, "2" е 50, "a" е 97 и т.н.

Има и други таблици, например Unicode, където 1 символ се записва с 2 байта. Тогава 5 букви ще са 10 байта, ане както при нас, сега са 5 байта.

Също важна таблица е Windows 1251. Където има кирилица, зашото в ASCII таблицата както виждаш няма.

 

Веднага ще кажеш, но защо тогава не извежда текст със 100 букви. А само няколко. Защото, когато тази функция срещне 0 (не символа '0', а числото нула, т.е. стойността char a=0;), за нея това е края на текста.

Ако напишем:

char a[50]="Alexander";

a[4] = 0;

printf("%s", a);

резултата ще е "Alex".

http://www.cplusplus.../tutorial/ntcs/

 

За int и void main - за теб в момента няма никакво значение. Единственото е, че с някои компилатори за void main, ще ти даде грешка.

 

http://einstein.drex...C_basics/#first http://www.intap.net/~drw/cpp/

Разгледай тези. Това са уроци за начинаещи. Следвай точките, последователно. Всяка една си има своето значение за по-нататъчната ти работа.

Ще ти обясня на кратко: Във програмирането има няколко основни действия: прочитане/записване, пресмятане и логически/безусловни преходи. Общо взето всичко се свежда до прочитането, пресмятането и записването на някаква информация, накакви данни. Всичко друго се получава, чрез тези прости действия, когато се повторят многократно. Както, например в строителството има - носене, поставяне и прикрепване. В следствие на повторението на тези действия се получава някаква зграда. За здравината и удобството на сградата се грижи архитекта. Също така той определя, колко ще се носи, какво ще се носи, къде ще се постави и как ще се прикрепи. Значи ние сега трябва да определим първо, каква ще бъде нашата цел. Каква програма ще правим. Да речем, че ще правим програма за изчисляване на ДДС, което е било начислено, върху сумата на всички разходи за месеца. Първо знаем че цената*1.2 = цената_с_ДДС. Ние цял месец сме плащали цени, които са с включено ДДС. т.е. за да разберем колко е сумата на цените без ДДС - цената = цената_с_ДДС/1.2 . Сега да направим програмата:

 

#include <stdio.h>
int main()
{
float suma=0;
float x=1;
float y=0;
printf("Въведете последователно всички покупки за месеца(за да приключите с въвеждането въведете 0:\n"); // \n е за нов ред
while (x != 0) 	// докато x не е равно на нула цикъла ще продължава.
{
scanf("%f", &x);
suma = suma + x;      // може да се напише и suma += x; същото е
}

// сега ще изчислм по горната формула сумата на цените без ДДС.

y = suma/1.2;

printf("Сумата на разходите без ДДС за месеца е : %f", y);   // на мястото на %f ще се изведе y. Ако напишем printf("Кола %d има %d гуми", 1, 4 ); ще стане "кола 1 има 4 гуми"

return 1;
}

 

Сега се опитай да направиш следната програма:

-Въвеждаш разхода на един автомобил, например 8 л./100 км.

-После въвеждаш колко литра е имало в началото в резервоара

-После колко километра е изминала

 

Накрая да ти изведе колко литра има в резервоара.

Можеш ли да я направиш сам?

Link to comment
Сподели другаде

Здравей. Днес бях на изпит и затова не ми остана време да погледна тая задачка сега ще опитам, но първо трябва да реша една друга. Трябва да направя блок схема или алгоритъм (честно да ти кажа и аз не разбрах какво) на тази програма, за да ми приеме курсовата задача. Ако можеш да помогнеш ще съм ти много благодарен (за кой път вече).
Link to comment
Сподели другаде

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гост
Отговори на тази тема

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   Не можете да качите директно снимка. Качете или добавете изображението от линк (URL)

Loading...
×
×
  • Създай ново...