C语言怎样编程用键盘输入学生的分数,并求平均分和不及格人数

C语言怎样编程用键盘输入学生的分数,并求平均分和不及格人数,第1张

#include <stdioh>

#include <stdlibh>

int main(int argc, char argv[])

{

//num代表总人数,score用于记录当前输入的分数,sum记录总分,

//average记录平均分,failed记录不及格人数,所有分数都定为“整数”。

int num=0, score=0,sum=0,average=0,failed=0;

do{

scanf("%d",&score);

if(score>=0)

{

sum+=score;//大于0的数,累加

num++;//大于0的计数

if(score<60)

failed++;//不及格的计数

}

}while(score>=0);//score大于0,继续循环;否则终止

average=sum/num;//平均值

printf("平均分:%d 不及格的人数:%d",average,failed);

return 0;

}

关于C语言中的Debug Assertion Failed,在编译和运行时都不会出现错误,但是在执行时会出现错误。发生这种错误的原因可能是:

1、直接释放了一个空指针

2、一个指针被释放了两次(即第二次释放一个空指针);

3、数组越界:访问了超过数组长度的内存

以下面一段简单的源程序代码为例:

在执行程序时d出的“Debug Assertion Failed”错误警告对话框,这种情况大多是指针引起的错误。

下图红框标记的地方,是Distance类析构函数,这里使用了delete。这里其实是不需要的,因为pDist指针是静态分配的内存,当程序运行完后,其内存自动释放,此时使用delete就是删除一个不存在的指针,从而报错,而实际上delete是与new搭配使用的。

扩展资料:

除了指针会引起“Debug Assertion Failed”这种错误,数组越界也会引起这种错误,也就是内存泄漏。

内存泄漏(即Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,从而导致程序运行速度减慢甚至系统崩溃。

无论是C还是C++程序,运行时候的变量主要有三种分配方式:堆分配、栈分配、全局和静态内存分配。而内存泄漏主要是发生在堆内存分配方式中,即“配置了内存后,所有指向该内存的指针都遗失了”。

若缺乏语言这样的垃圾回收机制,这样的内存片就无法归还系统。因为内存泄漏属于程序运行中的问题,无法通过编译识别,所以只能在程序运行过程中来判别和诊断。

参考资料来源:百度百科-内存泄漏

#include<stdioh>

#include<stringh>

#include<stdlibh>

#define ARR_SIZE 20 //array数组大小

int getkey(int key[]);

int getarray(int array[]);

int insert(int array[],int key,int vol);

int result(int flag);

int main()

{

int M,n,flag,vol;

int array[ARR_SIZE];

int key;

memset(array,0,sizeof(array));//初始化数组为0

printf("请输入M:\n");

scanf("%d",&M);

while(M)//循环M次

{

getarray(array);

printf("请输入n:\n");

scanf("%d",&n);

key=(int )malloc(n);//根据输入n申请数组大小

//将数组大小放入数组首位,主要由于你给的 getkey(int key[])只

//有一个参数,无法传递数组大小,因此放到手位置传递

key[0]=n;

getkey(key);

for(int i=0;i!=n;i++)//key[]中有n个值,因此n次判断

{

result(insert(array,key[i],ARR_SIZE));

}

memset(array,0,sizeof(array));//清空数组,为下次数据准备

M--;

}

}

int getarray(int array[])

{

printf("\n请输入array[](<=%d):\n",ARR_SIZE);

int tmp,i=0;

while(1)

{

scanf("%d",&tmp);

if(tmp==0)

return 0;

array[i]=tmp;

i++;

}

}

int getkey(int key[])

{

int num=key[0];

for(int i=0;i!=num;i++)

scanf("%d",key++);

}

int insert(int array[],int key,int vol)

{

int now_size=0,p=0;

for(int i=0;i!=ARR_SIZE;i++)

{

if(array[i])

now_size++;//统计array[]数组值的个数

if(array[i]==key)

return -2;// The key is already in this array!

if(key>array[i]&&array[i])

p++; //该位置就是需要插入的位置

}

if(now_size==ARR_SIZE)

return -1;//The array if full!

for(int i=now_size;i>=p;i--)

array[i+1]=array[i];

array[p]=key;

return p; //返回插入位置

}

int result(int flag)

{

if(flag==-1)

printf("The array if full! ");

else if(flag==-2)

printf("The key is already in this array! ");

else

printf("The key is inserted in position %d ",flag);

}

报错行出现在系统函数_free_dbg的_ASSERTE(_CrtIsValidHeapPointer(pUserData)); 这个是堆栈释放错误

综合你三个点,应该很可能是对文件长度的处理不好,内存分配和文件长度不匹配,或者内存 *** 作和文件长度不匹配

检查办法:单步调试,随时监控各个参数的值和地址状态。

以上就是关于C语言怎样编程用键盘输入学生的分数,并求平均分和不及格人数全部的内容,包括:C语言怎样编程用键盘输入学生的分数,并求平均分和不及格人数、assertion failed是什么原因、inserted failed.在C语言中什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9739019.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存