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

вывод

Добавлено: 03 мар 2010, 15:58
Евгений Александрович
вывести на экран тех студентов у которых оченка меньше 4 ?
что у меня не так?

Код: Выделить всё

#include "stdafx.h"

#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <stdlib.h>
struct my{
char fio[40];
int numer_zach;
char date[40];
int mark;
}list[20],temp[20];
int n;
struct my list1[10]= { {"Vasya",433},{"zhenya",34},{"bobr",45},{"sasha",342},{"belka",4322},{"sachek",3244},{"bredly",324},{"alex",244},{"kostya",3422},{"knedlik",90}};
struct my list2[10]={ {"masha",433},{"tanya",34},{"ulya",45},{"katya",342},{"polina",4322},{"vika",3244},{"sveta",232},{"olga",23211},{"margarita",434}};
void enter(){
	int a,b;
printf(" skol`ko?!\n");
scanf("%i",&n);
for(a=0;a<n;a++){
	printf(" enter date:\n");
	scanf("%s",&list[20].date);
		printf(" enter mark\n");
		scanf("%i\n",&list[a].mark);
}

for(a=0;a<n;a++){
	if(list[a].mark<4) list[b]=list[a]; }//printf("%s",list[a].fio);

for(int b=0;b<n;b++){
	printf("%s",list[b]);}
}
void main(){
	enter();	
	getch();
}

Re: вывод

Добавлено: 03 мар 2010, 16:51
Albor
Евгений Александрович, вы сами читали своё послание? Уважайте пожалуйста форумчан - дайте читаемое сообщение, иначе врядли вам ответят.

Re: вывод

Добавлено: 03 мар 2010, 18:56
Евгений Александрович
Извиняюсь,батарея садилась, на скорую руку набирал, вот моя проблема:
вывести на экран тех студентов ,у которых оченка меньше 4 ?

Re: вывод

Добавлено: 03 мар 2010, 20:31
Romeo
Ошибка здесь:

Код: Выделить всё

for(a=0;a<n;a++){
    if(list[a].mark<4) list[b]=list[a]; }//printf("%s",list[a].fio);
Переменная b не была даже инициализирована.

Re: вывод

Добавлено: 03 мар 2010, 21:13
Евгений Александрович
Исправил ошибки. Добавил динамическую память. Проблема: почему я не могу освободить в конце проги память(frrr(p))
->кидает ошибку. В чем моя ошибка?

Код: Выделить всё

struct my{
char fio[40];
int numer_zach;
char date[40];
int mark;
}temp[40];
int n;
struct my list[10]= { {"Vasya",433},{"zhenya",34},{"bobr",45},{"sasha",342},{"belka",4322},{"sachek",3244},{"bredly",324},{"alex",244},{"kostya",3422},{"knedlik",90}};

void enter(struct my *p){
    int a;
printf(" skol`ko?!\n");
scanf("%i",&n);
for(a=0;a<n;a++){
    printf(" enter date:\n");
    scanf("%s",&p[a].date);
        printf(" enter mark\n");
        scanf("%i",&p[a].mark);
}

for(a=0;a<n;a++){
	if(p[a].mark<4) temp[b]=list[a]; }

for(int b=0;b<n;b++){
    printf("%s",temp[b].fio);}
}
void main(){
	struct my *p;
	p=(struct my*)malloc(n*sizeof(my));
    enter(p);    
    getch();
	free(p);/// тут проблема (може ее не тут нужно освобождать?!)
}

Re: вывод

Добавлено: 04 мар 2010, 08:42
Albor
После malloc обязательно нужно проверить возвращённый указатель, не равен ли он NULL. Если не равен,то можно использовать. Я в твоём коде вижу проблему ранее - не инициализирована переменная n, используемая при выделении памяти, там наверняка мусор и malloc возвращает NULL.

Re: вывод

Добавлено: 04 мар 2010, 21:00
Евгений Александрович
Ошибок больше нету, но возникла новая проблема: мне нужно выводить имена всех тех, у кого оченка ниже 4, а оно выводит только текущего (т.е. про вводе к примеру 2 студенто оно выводит второго, а не обоих, хотя я намеренно дил им по 3 бала) ?

Код: Выделить всё

struct my{
char fio[40];
int numer_zach;
char date[40];
int mark;
}temp[40];
int n;
struct my list[10]= { {"Vasya",433},{"zhenya",34},{"bobr",45},{"sasha",342},{"belka",4322},{"sachek",3244},{"bredly",324},{"alex",244},{"kostya",3422},{"knedlik",90}};

void enter(struct my *p){
    int a;
printf(" skol`ko?!\n");
scanf("%i",&n);
for(a=0;a<n;a++){
    printf(" enter date:\n");
    scanf("%s",&p[a].date);
        printf(" enter mark\n");
        scanf("%i",&p[a].mark);
}

for(a=0;a<n;a++){
	if(p[a].mark<4) temp[b]=list[a]; }

for(int b=0;b<n;b++){
    printf("%s",temp[b].fio);}
}
void main(){
	struct my *p;
	p=(struct my*)malloc(50*sizeof(my));
	if(p==NULL) exit(1);
    enter(p);    
    getch();
	free(p);
}

Re: вывод

Добавлено: 05 мар 2010, 09:02
Albor
не инициализирована переменная n
В этом я ошибся, конечно, так как глобальные переменные инициализируются автоматически, в данном случае значением 0, но это наверняка способствовало получению нулевого указателя.
а оно выводит только текущего
Тебе Romeo уже писал о переменной b. Зачем ты вообще копируешь массив структур, если стоит задача просто вывести инфу по определённому условию? Делай вывод по условию и всё.

Re: вывод

Добавлено: 05 мар 2010, 20:33
Евгений Александрович
Все, дошло, огромное спасибо. :eek: