A. c语言程序调试出错
你的运行报错问题不是出在算法上。我也没仔细看你的排序算法,算法你自己把握把!
但你的代码有一个严重错误:
那就是在 int *sort(struct staff memb[])函数中的 int wl[10],sn[10]; 语句造成 sn数组是一函数的局部变量,而你在main函数中又去调用该局部变量,其实在main函数调用时,该数组已经销毁,所以出错了!
1.一种最简单但绝对不提倡的修改方法是:把 int wl[10],sn[10]; 改成 static int wl[10],sn[10]; 就可以了!(静态局部变量退出函数不销毁,但一般用指针还是可以访问到,但这样程序效果能实现,但是该方法不可取)
2.另外的一种方法是把sn数组设置成全局变量
3.还有一个办法是用malloc()函数在内存堆区申请分配指定size个字节的内存空间,方法是把
int wl[10],sn[10];
改成
intwl[10];
int*sn;
sn=(int*)malloc(sizeof(int)*10);
该方法在前面要加上 #include<stdlib.h>
附方法3代码:(时间关系,算法没有分析过)
#include<stdio.h>
#include<stdlib.h>
#include<fstream.h>
structstaff//定义结构体,num为职员编号,number为完成数量。质量qual中优=3良=2中=1.日期输入格式20160630
{
intnum;
charname[20];
intnumber;
intqual;
intdate;
}memb[10];//结构体大小为36
voidinput(staffmemb[])//输入职员信息并输入到文件中
{
charfname[80];
inti;
FILE*fp;
for(i=0;i<10;i++)
{
sprintf(fname,"memb%d.dat",i);
fp=fopen(fname,"w");
printf("输入职员信息 ");
printf("编号:");
scanf("%d",&memb[i].num);
printf("姓名:");
scanf("%s",&memb[i].name);
printf("数量:");
scanf("%d",&memb[i].number);
printf("质量:");
scanf("%d",&memb[i].qual);
printf("日期:");
scanf("%d",&memb[i].date);
fwrite(&memb[i],sizeof(memb),1,fp);
fclose(fp);
}
}
int*sort(structstaffmemb[])
{
intwl[10];
int*sn;
sn=(int*)malloc(sizeof(int)*10);
inti,t;
for(i=0;i<10;i++)
{
wl[i]=memb[i].number*memb[i].qual;
sn[i]=i;
}
for(i=0;i<9;i++)
{
if(wl[i]<wl[i+1])
{t=sn[i];sn[i]=sn[i+1];sn[i+1]=t;}
elseif(wl[i]=wl[i+1])
{
if(memb[i].number<memb[i+1].number)
{t=sn[i];sn[i]=sn[i+1];sn[i+1]=t;}
elseif(memb[i].number<memb[i+1].number)
{
if(memb[i].num>memb[i+1].num)
{t=sn[i];sn[i]=sn[i+1];sn[i+1]=t;}
}
}
}
returnsn;
}
intmain()
{
int*sn;
input(memb);
inti,j;
sn=sort(memb);
printf("职员工作量排序为");
for(i=0;i<10;i++)
{
j=sn[i];
printf("第%d名:编号:%d 姓名:%s ",i+1,memb[j].num,memb[j].name);
}
free(sn);
sn=NULL;
return0;
}
B. C语言求完全平方数的问题,调试时为什么会拒绝访问
你用的是win7以上的系统,Visual
Studio
2012以上版本吧
出现拒绝访问,是因为没有使用管理员身份运行Visual
Studio
你可以把它关掉,然后在Visual
Studio的图标(桌面或开始菜单)上使用右键,然后选择“以管理员身份运行”试试,这样的话重新打开项目应该就可以了
判断某个数是否完全平方数,只需要判断它的算术平方根取整后等于它的算术平方根就行
如sqrt(i)==(long)sqrt(i);即可
C. c语言程序调试:程序产生一个访问违例(段异常)
#include"stdio.h"
#include"string.h"
#include"windows.h"
void sort(char array[][20],int n);
int main(void)
{
char str[10][20];
int i,j,k,n;
printf("input n (n<=10):");
scanf("%d",&n);
getchar();
printf("input %d string:",n);
for(i=0;i<n;i++)
gets(str[i]);
sort(str,n);
printf("sort string:\n");
for(i=0;i<n;i++)
puts(str[i]);
system("pause");
return 0;
}
void sort(char array[][20],int n)
{
char temp[20];
int i,j,k;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
if(strcmp(array[j],array[i])>0)
{
strcpy(temp,array[j]);
strcpy(array[j],array[i]);
strcpy(array[i],temp);
}
}
}
D. 编译C语言队列程序作业的时候调试出现问题 求教该怎么办
这个不是程序的问题,是环境的问题。去网上重新下载一个VC安装包,重新安装一下就可以了。或者直接去下载这个libcpd.lib库放到VC安装目录里试试。不过最好是重新安装。
E. c语言 写入位置时发生访问冲突是怎么回事儿
c语言 写入位置时发生访问冲突是设置错误造成的,解决方法为:
1、用VS2013打开程序。
F. 我的c语言程序编对了但是调试就出现这个错误为什么呢
可能很多人在安装VC 6.0后有过点击“Compile”或者“Build”后被出现的
“Compiling... ,Error spawning cl.exe”错误提示给郁闷过。很多人的
选择是重装,实际上这个问题很多情况下是由于路径设置的问题引起的,
“CL.exe”是VC使用真正的编译器(编译程序),其路径在“VC根目录\VC98\Bin”下面,
你可以到相应的路径下找到这个应用程序。
因此问题可以按照以下方法解决:打开vc界面 点击VC“TOOLS(工具)”—>“Option(选择)”
—>“Directories(目录)”重新设置“Excutable Fils、Include Files、
Library Files、Source Files”的路径。很多情况可能就一个盘符的不同
(例如你的VC装在C,但是这些路径全部在D),改过来就OK了。
如果你是按照初始路径安装vc6.0的,路径应为:
executatble files:
C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin
C:\Program Files\Microsoft Visual Studio\VC98\BIN
C:\Program Files\Microsoft Visual Studio\Common\TOOLS
C:\Program Files\Microsoft Visual Studio\Common\TOOLS\WINNT
include files:
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE
C:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE
C:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE
library files:
C:\Program Files\Microsoft Visual Studio\VC98\LIB
C:\Program Files\Microsoft Visual Studio\VC98\MFC\LIB
source files:
C:\Program Files\Microsoft Visual Studio\VC98\MFC\SRC
C:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE
C:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE
C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC
如果你装在其他盘里,则仿照其路径变通就行(我就是装在D盘)。
关键是microsoft visual studio\ 后面的东西要相同。
G. C语言数据结构,调试出现访问禁止,怎么回事
1、
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MaxSize 5
typedef struct {
int data[MaxSize];
int top;
}STACK;
STACK *S;
STACK *InitStack() //初始化
{
STACK *tmp;
tmp=(STACK *)malloc(sizeof(STACK));
if(!tmp)
{
printf("分配失败!\n");
exit(0);
}
else
{
tmp->top = -1;
return tmp;
}
}
int Push(STACK *S ,int x) //入栈
{
if(S->top==MaxSize-1)
{
printf("栈满!\n");
return 0;
}
else
{
//这里的S->top也出错
S->top++;
//下面的句子出错
S->data[S->top] =x;
}
return 1;
}
int EmptyStack(STACK *S) //判断是否是空
{
if(S->top == -1)
return 1;
else
return 0;
}
int Pop(STACK *S) //出栈
{
int x;
if( EmptyStack(S) )
{
printf("\t栈空!\n");
exit(0);
}
x= S->data[S->top];
S->top--;
return x;
}
void main()
{
int temp;
S = InitStack();
int i,k,x;
printf("1. 入栈\n");
printf("2. 出栈\n");
printf("3. 推出\n");
printf("输入操作:\n ");
scanf("%d",&k);
switch(k)
{
case 1:
printf("输入入栈项:\n");
scanf("%d",&x);
temp=Push(S,x);
if(temp!=1)
printf("堆栈已满!入栈失败!\n");
else {
printf("成功入栈!\n"); //成功入栈
printf("%d\n",S->data[S->top]);
}
break;
case 2:
printf("出栈:\n");
for(i=0;i<MaxSize;i++)
printf("\t%d\n",Pop(S));
break;
default:
exit(0);
}
free(S);
}
这样可能就行了
在第一步进行初始化的时候可以通过传回来一个指针赋值给S
最后的时候对S的释放不要再添加S了
因为S本来就是动态分配的对象
2、
如果你要使用自己的函数的话
就把InitStack()中的参数去除
因为如果你在参数中利用了这样的一个参数的话就相当于覆盖了全局变量中的S
最后进行返回值的时候返回的是1或0,此时的局部变量(子函数中的S)被销毁了
这样并没有对S进行赋值,所以以后的访问中会出错
H. C语言调试出错 0xC0000005: Access Violation
出现这个错误要么是因为你试图访问一块已经被释放的内存,要么是想使用一个还未创建对象的指针
I. C语言程序调试老出现错误
#include<stdio.h>
int main()
{
int plus(int,int); //增加一个plus定义
int sum,a,b;
printf("inputa and b:");
scanf("%d%d",&a,&b);
sum=plus(a,b); //函数名打错,且函数没有定义
printf("%d",sum);
return 0;
}int plus(x,y) //函数没有定义返回类型
{ //大括号打错地方
int x,y;
return(x+y);
}