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語句內輸出超出范圍的提示