A. 跪求!!关于c语言的编程问题!急~
/*
题目:《设计实现一个班级信息管理系统》
要求:
合理运用C语言的数组,指针,结构体以及文件操作等,实现一个模拟的班级通讯录管理系统。
该系统用来管理学生的基本信息,通信信息。具体的要如下:
1) 工作人员可以通过此程序来管理学生的信息,包括查询,添加,修改,删除等功能。
2) 在进行添加时,系统会自动监测所添加的学生信息是否已经存在,如果存在,会提示用户,
该学生已经存在。
3) 在删除时,要首先弹出对话框,让用户确认是否删除。只有经过确认才能够被删除。
4) 在进行学生信息管理时,不准用户修改学号。
5) 通过键盘或读取文件的方法读取学生的信息。
6) 能够运用结构化程序设计的选择和循环结构,并熟练使用相关的语句(如 do while,for,if-else,if等)。
7) 程序要有主菜单,能够完成主要的功能。
[附1]
有关学生的信息,包括,学号,姓名,性别,年龄,电话。
[附2]
我是大一的新生,现在C的内容还没有完全学完,关于枚举,链表,文件操作等还未学,所以请各位高手在帮小弟时多加一点提示,不然我可能看不懂```
还有,关于第(4)个要求和第(7)个要求,可以忽略```
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
typedef struct Student//学生信息
{
signed short id;
char name[11];
char sex[7];
signed short age;
char telNum[16];
}Student;
typedef struct Node
{
Student data;
Node* next;
}Node;
static Node* begin=NULL;//哨兵结点
static signed short len=0;//链表长度
void printMenu();//打印菜单
void printBye();//打印结束语
void printList();//打印所有学生信息
void printStudent(Student st);//打印学生信息
Node* lookupNode(signed short stid);//根据学号查询学生信息。
int addNode(Student st);//添加学生信息。成功返回链表长度。内存分配失败-1;信息重复0
int deleteNode(signed short stid); //根据学号删除学生信息。成功返回链表长度;未找到-1
int updateNode(Student st);//根据学号修改学生信息。成功返回链表长度;未找到0
void main()
{
//初始化链表。
begin=(Node*)malloc(sizeof(Node));
begin->next=NULL;
printf("----------------------------------------------------------------------------\n");
printf("--- 班级信息管理系统 ---\n");
printf("--- 沙支夸依 2007-12-21 ---\n");
printf("----------------------------------------------------------------------------\n");
printf("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n");
printMenu();
while (1)
{
char ch;
ch=getchar();
fflush(stdin);
Student student;
memset(&student,0,sizeof(Student));
switch (ch)
{
case '1':
printf("---添加学生信息。(学号为 0 结束)\n");
while (1)
{
printf("请输入新学号: ");
scanf("%d", &student.id);
if (!student.id)
break;
printf("请输入学生姓名: ");
fflush(stdin);
gets(student.name);
printf("请输入学生姓别: ");
scanf("%s", student.sex);
printf("请输入学生年龄: ");
scanf("%d", &student.age);
printf("请输入学生电话: ");
scanf("%s", student.telNum);
int succ=addNode(student);
if (succ)
{
if (-1==succ)
printf("内存错误!请重新输入!\n");
}
else
printf("对不起!该学号已被占用!\n");
printf("\n");
}
break;
case '2':
printf("---删除学生信息。(学号为 0 结束)\n");
while (1)
{
signed short stid=0;
printf("请输入要删除学生的学号:");
fflush(stdin);
scanf("%d", &stid);
if (!stid)
break;
Node* delNode=lookupNode(stid);
if (!delNode)
printf("对不起!你要删除的记录不存在。\n");
else
{
printStudent(delNode->data);
printf("您确定要删除这条记录吗?(任意键删除/ n 取消)\n");
fflush(stdin);
char cDelete=getchar();
if ('n'==cDelete)
continue;
printf("删除成功!剩余记录数: %d\n",deleteNode(stid));
}
printf("\n");
}
break;
case '3':
printf("---修改学生信息。(学号为 0 结束)\n");
while (1)
{
signed short stid=0;
printf("请输入要修改学生的学号:");
fflush(stdin);
scanf("%d", &stid);
if (!stid)
break;
Node* updataNode=lookupNode(stid);
if (!updataNode)
printf("对不起!你要删除的记录不存在。\n");
else
{
printStudent(updataNode->data);
Student student;
student.id=stid;
printf("修改学生姓名: ");
fflush(stdin);
gets(student.name);
printf("修改学生姓别: ");
scanf("%s", student.sex);
printf("修改学生年龄: ");
scanf("%d", &student.age);
printf("修改学生电话: ");
scanf("%s", student.telNum);
updateNode(student);
printf("修改成功!\n");
printStudent(updataNode->data);
}
printf("\n");
}
break;
case '4':
printf("---查询学生信息。(学号为 0 结束)\n");
while (1)
{
signed short stid=0;
printf("请输入要修改学生的学号:");
fflush(stdin);
scanf("%d", &stid);
if (!stid)
break;
Node* findNode=lookupNode(stid);
if (!findNode)
printf("对不起!你要删除的记录不存在。\n");
else
{
printStudent(findNode->data);
}
printf("\n");
}
break;
case '5':
printList();
printMenu();
break;
case '6':
printBye();
return;
default:
printMenu();
}
}
}
void printMenu()
{
printf("----------------------------------------------------------------------------\n");
printf("--- 1、增加学生信息。 2、删除学生信息。 ---\n");
printf("--- 3、修改学生信息。 4、查询学生信息。 ---\n");
printf("--- 5、打印所有信息。 6、退出。 ---\n");
printf("----------------------------------------------------------------------------\n");
}
void printBye()
{
printf("----------------------------------------------------------------------------\n");
printf(" 感谢您使用班级信息管理系统 \n");
printf(" 再 见 \n");
printf("----------------------------------------------------------------------------\n");
}
void printList()
{
Node* temp=begin->next;
if (!temp)
{
printf("暂时无记录可供操作!\n");
}
while (temp)
{
printStudent(temp->data);
temp=temp->next;
}
}
void printStudent(Student st)
{
printf("学号:%-6d 姓名:%-10s 性别:%-6s 年龄:%-3d 电话:%-15s\n",
st.id, st.name, st.sex, st.age, st.telNum);
printf("--------------------------------------------------------------------------\n");
}
Node* lookupNode(signed short stid)
{
Node* temp=begin->next;
while (temp)
{
if (temp->data.id==stid)
return temp;
temp=temp->next;
}
return NULL;
}
int addNode(Student st)
{
if (lookupNode(st.id))
return 0;
Node* temp=(Node*)malloc(sizeof(Node));
if (!temp)
return -1;
temp->data=st;
temp->next=begin->next;
begin->next=temp;
return ++len;
}
int deleteNode(signed short stid)
{
Node* temp=begin;
Node* pos=NULL;
while (temp->next)
{
if (temp->next->data.id==stid)
{
pos=temp->next;
temp->next=pos->next;
free(pos);
return --len;
}
temp=temp->next;
}
return -1;
}
int updateNode(Student st)
{
Node* temp=lookupNode(st.id);
if (!temp)
return 0;
temp->data=st;
return len;
}
B. 在if之前应为非限定ID是什么意思
。只要就是这么样的衣服,这个ID的话,不在他们的限定范围内
C. 怎么解决单片机编程中 undefined identifier
undefined identifier是未定义的标志符,在程序内使用了没有被定义的标志符或者变量。
具体解决办法:找到未定义的标志符,对其进行赋值即可。
定义的是unsigned char num,在使用的时候,写成了NUM,也会出现同样的错误p1,undefined identifier:英文意思就是p1未定义,找不到p1编译出错。
(3)c语言非限定id怎么解决扩展阅读
硬件特征
(1)单片机的体积比较小, 内部芯片作为计算机系统,其结构简单,但是功能完善,使用起来十分方便,可以模块化应用。
(2)单片机有着较高的集成度,可靠性比较强,即使单片机处于长时间的工作也不会存在故障问题。
(3) 单片机在应用时低电压、低能耗,是人们在日常生活中的首要选择, 为生产与研发提供便利。
(4)单片机对数据的处理能力和运算能力较强,可以在各种环境中应用,且有着较强的控制能力。
D. C语言的一些问题
FILE *fp; -- fp 相当于打开后的文件的 id, C 语言用这个id来区分打开的是哪个文件,读还是写还是又读又写又添加,是2进制文件还是ASCII文件。FILE 是系统定义的结构。
fp=fopen("fstu","wb"); -- 打开文件,文件名 fstu, wb--写, 2进制文件, fstu文件 id 是 fp。
fclose(fp); -- 文件用完要关闭文件,让读写缓冲区的内容写入fstu。
stu[] -- 学生结构数组,stu[i]--存第i个学生信息的一个结构,stu[i].n -- 序号。从 1 开始编。数组下标 i 从 0 开始.
if(stu[i].score[j]>100) { j--;continue;} -- 分数大于100,则j减1,跳过循环体内的下面的语句:
s+=stu[i].score[j]; -- 计算分数之和,存入s
执行下一循环,实际作用是让刚才的j循环重做一次,重做输入分数计算。
j 循环 计算了 3 门成绩 之和
stu[i].avr=s/3.0; -- 除3 得平均分,存入 第i个学生信息结构里的 avr 里。
fwrite(&stu[i],sizeof(struct student),1,fp); -- 把第i个学生信息结构里的数值,共 sizeof(struct student) 个 字节内容,写到 fp 的文件fstu里。
继续 i 循环。
E. 关于C语言的问题
您好:
0x01是值,您可能考虑多了点,因为即使两者的值都是0x01也是没有问题的,比如说你的程序中若是出现
if(DEV_SPK_IF_ID && DEV_AUD_CTLR_IF_ID)
{
……
}
事实上它等价于
if(0x01 && 0x01)
{
……
}
您看,一点问题没有的。
呵呵,祝你好运!
F. C语言问题
admin*,sk*,seller*都是类型,不能作为枚举变量,直接写enum ID{admin*,sk*,seller*};会报编译错误吧?
可以在函数开始用 void*作为返回值
然后函数执行完之后再强制转换成实际的类型,如返回值为p的seller,则可以用(seller*)p实现强制转换
G. 急求!!!!!!!!
一.使用CSS缩写
使用缩写可以帮助减少你CSS文件的大小,更加容易阅读。css缩写的主要规则请参看《常用css缩写语法总结》,这里就不展开描述。
二.明确定义单位,除非值为0
忘记定义尺寸的单位是CSS新手普遍的错误。在HTML中你可以只写width=100,但是在CSS中,你必须给一个准确的单位,比如:width:100px width:100em。只有两个例外情况可以不定义单位:行高和0值。除此以外,其他值都必须紧跟单位,注意,不要在数值和单位之间加空格。
三.区分大小写
当在XHTML中使用CSS,CSS里定义的元素名称是区分大小写的。为了避免这种错误,我建议所有的定义名称都采用小写。
class和id的值在HTML和XHTML中也是区分大小写的,如果你一定要大小写混合写,请仔细确认你在CSS的定义和XHTML里的标签是一致的。
四.取消class和id前的元素限定
当你写给一个元素定义class或者id,你可以省略前面的元素限定,因为ID在一个页面里是唯一的,鸩las s可以在页面中多次使用。你限定某个元素毫无意义。例如:
以下是引用片段:
div#content { /* declarations */ }
fieldset.details { /* declarations */ }
可以写成
#content { /* declarations */ }
.details { /* declarations */ }
这样可以节省一些字节。
五.默认值
通常padding的默认值为0,background-color的默认值是transparent。但是在不同的浏览器默认值可能不同。如果怕有冲突,可以在样式表一开始就先定义所有元素的margin和padding值都为0,象这样:
以下是引用片段:
* {
margin:0;
padding:0;
}
六.不需要重复定义可继承的值
CSS中,子元素自动继承父元素的属性值,象颜色、字体等,已经在父元素中定义过的,在子元素中可以直接继承,不需要重复定义。但是要注意,浏览器可能用一些默认值覆盖你的定义。
七.最近优先原则
如果对同一个元素的定义有多种,以最接近(最小一级)的定义为最优先,例如有这么一段代码
Update: Lorem ipsum dolor set
在CSS文件中,你已经定义了元素p,又定义了一个classupdate
以下是引用片段:
p {
margin:1em 0;
font-size:1em;
color:#333;
}
.update {
font-weight:bold;
color:#600;
}
八.多重class定义
一个标签可以同时定义多个class。例如:我们先定义两个样式,第一个样式背景为"http://www.28600.com/article1/#"666;第二个样式有10 px的边框。
以下是引用片段:
.one{width:200px;background:"http://www.28600.com/article1/#"666;}
.two{border:10px solid "http://www.28600.com/article1/#"F00;}
在页面代码中,我们可以这样调用:
以下是引用片段:
<div class=one two></div>
这样最终的显示效果是这个div既有"http://www.28600.com/article1/#"666的背景,也有10px的边框。是的,这样做是可以的,你可以尝试一下。
九.使用子选择器(descendant selectors)
CSS初学者不知道使用子选择器是影响他们效率的原因之一。子选择器可以帮助你节约大量的class定义。我们来看下面这段代码:
以下是引用片段:
<div id=subnav>
<ul>
<li class=subnavitem> <a href="http://www.28600.com/article1/#" class=subnavitem>Item 1</a></li>>
<li class=subnavitemselected> <a href="http://www.28600.com/article1/#" class=subnavitemselected> Item 1</a> </li>
<li class=subnavitem> <a href="http://www.28600.com/article1/#" class=subnavitem> Item 1</a> </li>
</ul>
</div>
这段代码的CSS定义是:
以下是引用片段:
div#subnav ul { /* Some styling */ }
div#subnav ul li.subnavitem { /* Some styling */ }
div#subnav ul li.subnavitem a.subnavitem { /* Some styling */ }
div#subnav ul li.subnavitemselected { /* Some styling */ }
div#subnav ul li.subnavitemselected a.subnavitemselected { /* Some styling */ }
你可以用下面的方法替代上面的代码
以下是引用片段:
<ul id=subnav>
<li> <a href="http://www.28600.com/article1/#>" Item 1</a> </li>
<li class=sel> <a href="http://www.28600.com/article1/#>" Item 1</a> </li>
<li> <a href="http://www.28600.com/article1/#>" Item 1</a> </li>
</ul>
样式定义是:
以下是引用片段:
#subnav { /* Some styling */ }
#subnav li { /* Some styling */ }
#subnav a { /* Some styling */ }
#subnav .sel { /* Some styling */ }
#subnav .sel a { /* Some styling */ }
用子选择器可以使你的代码和CSS更加简洁、更加容易阅读。
十.不需要给背景图片路径加引号
为了节省字节,我建议不要给背景图片路径加引号,因为引号不是必须的。例如:
background:url(images/***.gif) #333;
可以写为:
background:url(images/***.gif) #333;
如果你加了引号,反而会引起一些浏览器的错误。
十一.组选择器(Group selectors)
当一些元素类型、class或者id都有共同的一些属性,你就可以使用组选择器来避免多次的重复定义。这可以节省不少字节。
例如:定义所有标题的字体、颜色和margin,你可以这样写:
以下是引用片段:
h1,h2,h3,h4,h5,h6 {
font-family:Lucida Grande,Lucida,Arial,Helvetica,sans-serif;
color:#333;
margin:1em 0;
}
如果在使用时,有个别元素需要定义独立样式,你可以再加上新的定义,可以覆盖老的定义,例如:
以下是引用片段:
h1 { font-size:2em; }
h2 { font-size:1.6em; }
十二.用正确的顺序指定链接的样式
当你用CSS来定义链接的多个状态样式时,要注意它们书写的顺序,正确的顺序是::link :visited :hover :active。抽取第一个字母是LVHA,你可以记忆成LoVe HAte(喜欢讨厌)。为什么这么定义,可以参考Eric Meyer的《Link Specificity》。
如果你的用户需要用键盘来控制,需要知道当前链接的焦点,你还可以定义:focus属性。:focus属性的效果也取决与你书写的位置,如果你希望聚焦元素显示:hover效果,你就把:focus写在:hover前面;如果你希望聚焦效果替代:hover效果,你就把:focus放在:hover后面。
十三.清除浮动
一个非常常见的CSS问题,定位使用浮动的时候,下面的层被浮动的层所覆盖,或者层里嵌套的子层超出了外层的范围。
通常的解决办法是在浮动层后面添加一个额外元素,例如一个div或者一个br,并且定义它的样式为clear: both。这个办法有一点牵强,幸运的是还有一个好办法可以解决,参看这篇文章《How To Clear Floats Without Structural Markup》(注:本站将尽快翻译此文)。
上面2种方法可以很好解决浮动超出的问题,但是如果当你真的需要对层或者层里的对象进行clear的时候怎么办?一种简单的方法就是用overflow属性,这个方法最初的发表在《Simple Clearing of Floats》,又在《Clearance》和《Super simple clearing floats》中被广泛讨论。
上面那一种clear方法更适合你,要看具体的情况,这里不再展开论述。另外关于float的应用,一些优秀的文章已经说得很清楚,推荐你阅读:《Floatutorial》、《Containing Floats》和《Float Layouts》
十四.横向居中(centering)
这是一个简单的技巧,但是值得再说一遍,因为我看见太多的新手问题都是问这个:CSS如何横向居中?你需要定义元素的宽,并且定义横向的margin,如果你的布局包含在一个层(容器)中,就象这样:
<!-- 你的布局这里开始 -->
你可以这样定义使它横向居中:
以下是引用片段:
#wrap {
width:760px; /* 修改为你的层的宽度 */
margin:0 auto;
}
但是IE5/Win不能正确显示这个定义,我们采用一个非常有用的技巧来解决:用text-align属性。就象这样:
以下是引用片段:
body {
text-align:center;
}
#wrap {
width:760px; /* 修改为你的层的宽度 */
margin:0 auto;
text-align:left;
}
第一个body的text-align:center; 规则定义IE5/Win中body的所有元素居中(其他浏览器只是将文字居中) ,第二个text-align:left;是将#warp中的文字居左。
十五.导入(Import)和隐藏CSS
因为老版本浏览器不支持CSS,一个通常的做法是使用@import技巧来把CSS隐藏起来。例如:
@import url(main.css);
然而,这个方法对IE4不起作用,这让我很是头疼了一阵子。后来我用这样的写法:
@import main.css;
这样就可以在IE4中也隐藏CSS了,呵呵,还节省了5个字节呢。想了解@import语法的详细说明,可以看这里《centricle’s css filter chart》
十六.针对IE的优化
有些时候,你需要对IE浏览器的bug定义一些特别的规则,这里有太多的CSS技巧(hacks),我只使用其中的两种方法,不管微软在即将发布的IE7 beta版里是否更好的支持CSS,这两种方法都是最安全的。
1.注释的方法
(a)在IE中隐藏一个CSS定义,你可以使用子选择器(child selector):
以下是引用片段:
html>body p {
/* 定义内容 */
}
(b)下面这个写法只有IE浏览器可以理解(对其他浏览器都隐藏)
以下是引用片段:
* html p {
/* declarations */
}
(c)还有些时候,你希望IE/Win有效而IE/Mac隐藏,你可以使用反斜线技巧:
以下是引用片段:
/* */
* html p {
declarations
}
/* */
2.条件注释(conditional comments)的方法
另外一种方法,我认为比CSS Hacks更加经得起考验就是采用微软的私有属性条件注释(conditional comments)。用这个方法你可以给IE单独定义一些样式,而不影响主样式表的定义。就象这样:
以下是引用片段:
<!--[if IE]>
<link rel=stylesheet type=text/css href="http://www.28600.com/article1/ie.css" />
<![endif]-->
十七.调试技巧:层有多大?
当调试CSS发生错误,你就要象排版工人,逐行分析CSS代码。我通常在出问题的层上定义一个背景颜色,这样就能很明显看到层占据多大空间。有些人建议用border,一般情况也是可以的,但问题是,有时候border 会增加元素的尺寸,border-top和boeder-bottom会破坏纵向margin的值,所以使用background更加安全些。
另外一个经常出问题的属性是outline。outline看起来象boeder,但不会影响元素的尺寸或者位置。只有少数浏览器支持outline属性,我所知道的只有Safari、OmniWeb、和Opera。
十八.CSS代码书写样式
在写CSS代码的时候,对于缩进、断行、空格,每个人有每个人的书写习惯。在经过不断实践后,我决定采用下面这样的书写样式:
以下是引用片段:
selector1,
selector2 {
property:value;
}
当使用联合定义时,我通常将每个选择器单独写一行,这样方便在CSS文件中找到它们。在最后一个选择器和大括号{之间加一个空格,每个定义也单独写一行,分号直接在属性值后,不要加空格。
我习惯在每个属性值后面都加分号,虽然规则上允许最后一个属性值后面可以不写分号,但是如果你要加新样式时容易忘记补上分号而产生错误,所以还是都加比较好。
最后,关闭的大括号}单独写一行。
空格和换行有助与阅读。
H. C语言问题
你这个程序是捕捉0到9的按键状态,按下再松开时才会记录,想要识别所有按键,把for循环范围扩大。
比如for(charch=32;ch<=127;ch++)这样就包含了特殊符号及大小写字母还有数字。
但是,这个代码是有问题的!
一、你这个代码需在键位已经按下后启动才能识别,否则启动时没有按下对应键位,程序就结束了。要嵌套死循环,让其一直检测。
二、直接扩大ASCII区间,像上面的那样32~127,识别字母区间会被防毒软件直接判断为病毒!!。
三、GetAsyncKeyState不是C语言库函数,是window的函数,换其它操作系统就失效。
GetAsyncKeyState返回值最高位为1则说明对应ch的键被按下,所以这里用&0x8000来判断最高位。
四、想要捕获其它软件界面内容还有很多方法,比如:
1、通过windowAPI函数FindWindow来获取窗口句柄。
2、遍历窗口下控件句柄,找到输入框句柄。
3、通过窗口句柄找到进程id(GetWindowThreadProcessId函数),再通过id获取进程句柄(OpenProcess函数)。
4、向目标进程申请内存(VirtualAllocEx),再通过PostMessage函数异步发送消息获取目标控件内的内容(具体消息要结合控件类型,另外注意PostMessage是异步执行)。
具体自行查阅资料,一言两语说不清,上面步骤需先搞懂window消息机制。
注意:以上方法依然只限window系统,且有数据保护的控件无法获取。
五、或简单暴力的方法,直接写个定时截图,只要硬盘够不停桌面截图。
但不论写什么程序,和装摄像头一样,终究都会被发现。!!!!!!!!!!!!!
I. c语言随机数如果没有限定范围怎么写
#include "stdlib.h"
#include "stdio.h"
void main( )
{
int i;
/*将当前时间设置成随机函数的种子,所以每次产生的数都不一样*/
srand( (unsigned)time( NULL ) );
/* 输出10个随机数*/
for( i = 0; i < 10;i++ )
printf( “ %d\n”, rand() ); }
J. c语言:如何限制数字在某个范围
这个可以用if循环实现。比如你要输入一个数a的范围是0到100,你先从键盘输入一个数字,经if循环if(a>=0&&a<=100)判定,如果在这个范围内,进入循环内进行其他运算,不在这个范围内跳出if循环,在else语句内输出超出范围的提示