1. 在android中對資料庫做增刪改查有兩種方式分別是sqlitedatabase這個類中的哪幾個
一、使用嵌入式關系型SQLite資料庫存儲數據
在Android平台上,集成了一個嵌入式關系型資料庫——SQLite,SQLite3支持NULL、INTEGER、REAL(浮點數字)、 TEXT(字元串文本)和BLOB(二進制對象)數據類型,雖然它支持的類型只有五種,但實際上sqlite3也接受varchar(n)、 char(n)、decimal(p,s) 等數據類型,只不過在運算或保存時會轉成對應的五種數據類型。 SQLite最大的特點是你可以把各種類型的數據保存到任何欄位中,而不用關心欄位聲明的數據類型是什麼。例如:可以在Integer類型的欄位中存放字元串,或者在布爾型欄位中存放浮點數,或者在字元型欄位中存放日期型值。 但有一種情況例外:定義為INTEGER PRIMARY KEY的欄位只能存儲64位整數, 當向這種欄位保存除整數以外的數據時,將會產生錯誤。 另外,在編寫CREATE TABLE 語句時,你可以省略跟在欄位名稱後面的數據類型信息,如下面語句你可以省略name欄位的類型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite可以解析大部分標准SQL語句,如:
復制代碼 代碼如下:
查詢語句:select * from 表名 where 條件子句 group by 分組字句 having ... order by 排序子句
如: select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分頁SQL與mysql類似,下面SQL語句獲取5條記錄,跳過前面3條記錄
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入語句:insert into 表名(欄位列表) values(值列表)。如: insert into person(name, age) values(『傳智',3)
更新語句:update 表名 set 欄位名=值 where 條件子句。如:update person set name=『傳智『 where id=10
刪除語句:delete from 表名 where 條件子句。如:delete from person where id=10
二、使用SQLiteOpenHelper對資料庫進行版本管理
我們在編寫資料庫應用軟體時,需要考慮這樣的問題:因為我們開發的軟體可能會安裝在很多用戶的手機上,如果應用使用到了SQLite資料庫,我們必須在用戶初次使用軟體時創建出應用使用到的資料庫表結構及添加一些初始化記錄,另外在軟體升級的時候,也需要對數據表結構進行更新。那麼,我們如何才能實現在用戶初次使用或升級軟體時自動在用戶的手機上創建出應用需要的資料庫表呢?總不能讓我們在每個需要安裝此軟體的手機上通過手工方式創建資料庫表吧?因為這種需求是每個資料庫應用都要面臨的,所以在Android系統,為我們提供了一個名為SQLiteOpenHelper的抽象類,必須繼承它才能使用,它是通過對資料庫版本進行管理來實現前面提出的需求。
為了實現對資料庫版本進行管理,SQLiteOpenHelper類提供了兩個重要的方法,分別是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用於初次使用軟體時生成資料庫表,後者用於升級軟體時更新資料庫表結構。當調用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法獲取用於操作資料庫的SQLiteDatabase實例的時候,如果資料庫不存在,Android系統會自動生成一個資料庫,接著調用onCreate()方法,onCreate()方法在初次生成資料庫時才會被調用,在onCreate()方法里可以生成資料庫表結構及添加一些應用使用到的初始化數據。onUpgrade()方法在資料庫的版本發生變化時會被調用,一般在軟體升級時才需改變版本號,而資料庫的版本是由程序員控制的,假設資料庫現在的版本是1,由於業務的變更,修改了資料庫表結構,這時候就需要升級軟體,升級軟體時希望更新用戶手機里的資料庫表結構,為了實現這一目的,可以把原來的資料庫版本設置為2(有同學問設置為3行不行?當然可以,如果你願意,設置為100也行),並且在 onUpgrade()方法裡面實現表結構的更新。當軟體的版本升級次數比較多,這時在onUpgrade()方法裡面可以根據原版號和目標版本號進行判斷,然後作出相應的表結構及數據更新。
getWritableDatabase()和 getReadableDatabase()方法都可以獲取一個用於操作資料庫的SQLiteDatabase實例。但 getWritableDatabase() 方法以讀寫方式打開資料庫,一旦資料庫的磁碟空間滿了,資料庫就只能讀而不能寫,倘若使用getWritableDatabase()打開資料庫就會出錯。getReadableDatabase()方法先以讀寫方式打開資料庫,如果資料庫的磁碟空間滿了,就會打開失敗,當打開失敗後會繼續嘗試以只讀方式打開資料庫。
注意:getWritableDatabase(),getReadableDatabase的區別是當資料庫寫滿時,調用前者會報錯,調用後者不會,所以如果不是更新資料庫的話,最好調用後者來獲得資料庫連接。
代碼:
復制代碼 代碼如下:
public class DatabaseHelper extends SQLiteOpenHelper {
//類沒有實例化,是不能用作父類構造器的參數,必須聲明為靜態
private static final String name = "ljqdb"; //資料庫名稱
private static final int version = 1; //資料庫版本
public DatabaseHelper(Context context) {
//第三個參數CursorFactory指定在執行查詢時獲得一個游標實例的工廠類,設置為null,代表使用系統默認的工廠類
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS person (
personid integer primary key autoincrement, name varchar(20), age INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(" ALTER TABLE person ADD phone VARCHAR(12) NULL "); //往表中增加一列
// DROP TABLE IF EXISTS person 刪除表
}
}
在實際項目開發中,當資料庫表結構發生更新時,應該避免用戶存放於資料庫中的數據丟失。
三、使用SQLiteDatabase操作SQLite資料庫
Android提供了一個名為SQLiteDatabase的類,該類封裝了一些操作資料庫的API,使用該類可以完成對數據進行添加(Create)、查詢(Retrieve)、更新(Update)和刪除(Delete)操作(這些操作簡稱為CRUD)。對SQLiteDatabase的學習,我們應該重點掌握execSQL()和rawQuery()方法。execSQL()方法可以執行insert、delete、update和CREATE TABLE之類有更改行為的SQL語句; rawQuery()方法用於執行select語句。
execSQL()方法的使用例子:
復制代碼 代碼如下:
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values('林計欽', 24)");
db.close();
執行上面SQL語句會往person表中添加進一條記錄,在實際應用中, 語句中的「林計欽」這些參數值會由用戶輸入界面提供,如果把用戶輸入的內容原樣組拼到上面的insert語句, 當用戶輸入的內容含有單引號時,組拼出來的SQL語句就會存在語法錯誤。要解決這個問題需要對單引號進行轉義,也就是把單引號轉換成兩個單引號。有些時候用戶往往還會輸入像「 & 」這些特殊SQL符號,為保證組拼好的SQL語句語法正確,必須對SQL語句中的這些特殊SQL符號都進行轉義,顯然,對每條SQL語句都做這樣的處理工作是比較煩瑣的。 SQLiteDatabase類提供了一個重載後的execSQL(String sql, Object[] bindArgs)方法,使用這個方法可以解決前面提到的問題,因為這個方法支持使用佔位符參數(?)。使用例子如下:
復制代碼 代碼如下:
SQLiteDatabase db = ....;
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"傳智播客", 4});
db.close();
execSQL(String sql, Object[] bindArgs)方法的第一個參數為SQL語句,第二個參數為SQL語句中佔位符參數的值,參數值在數組中的順序要和佔位符的位置對應。
SQLiteDatabase的rawQuery()用於執行select語句,使用例子如下:
復制代碼 代碼如下:
SQLiteDatabase db = ....;
Cursor cursor = db.rawQuery("select * from person", null);
while (cursor.moveToNext()) {
int personid = cursor.getInt(0); //獲取第一列的值,第一列的索引從0開始
String name = cursor.getString(1);//獲取第二列的值
int age = cursor.getInt(2);//獲取第三列的值
}
cursor.close();
db.close();
rawQuery()方法的第一個參數為select語句;第二個參數為select語句中佔位符參數的值,如果select語句沒有使用佔位符,該參數可以設置為null。帶佔位符參數的select語句使用例子如下:
復制代碼 代碼如下:
Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%林計欽%", "4"});
Cursor是結果集游標,用於對結果集進行隨機訪問,如果大家熟悉jdbc, 其實Cursor與JDBC中的ResultSet作用很相似。使用moveToNext()方法可以將游標從當前行移動到下一行,如果已經移過了結果集的最後一行,返回結果為false,否則為true。另外Cursor 還有常用的moveToPrevious()方法(用於將游標從當前行移動到上一行,如果已經移過了結果集的第一行,返回值為false,否則為true )、moveToFirst()方法(用於將游標移動到結果集的第一行,如果結果集為空,返回值為false,否則為true )和moveToLast()方法(用於將游標移動到結果集的最後一行,如果結果集為空,返回值為false,否則為true ) 。
除了前面給大家介紹的execSQL()和rawQuery()方法, SQLiteDatabase還專門提供了對應於添加、刪除、更新、查詢的操作方法: insert()、delete()、update()和query() 。這些方法實際上是給那些不太了解SQL語法的菜鳥使用的,對於熟悉SQL語法的程序員而言,直接使用execSQL()和rawQuery()方法執行SQL語句就能完成數據的添加、刪除、更新、查詢操作。
2. C語言,編寫一個簡單的通訊錄管理系統
#include <string.h>
#include <stdio.h>
#include<stdlib.h>
int cntAddr=0,i,j;
char in[12];
const char * strFmt=" %d %s %s %s %s ";
typedef struct ADDRESSD {
int ID;
char name[12];
char workPlace[12];
char teleOff[12];
char teleHome[12];
}ADDRESS;
ADDRESS addrTmp[100],adTmp;
int load(ADDRESS adr[]){
FILE *fp;
if((fp=fopen("c:\txl.txt","r"))!=NULL){
cntAddr=0;
while(!feof(fp)){
fscanf(fp,"%d %s %s %s %s ",&(adr[cntAddr].ID),adr[cntAddr].name,adr[cntAddr].workPlace,adr[cntAddr].teleOff,adr[cntAddr].teleHome);
++cntAddr;
}
}
fclose(fp);
return cntAddr;
};
void list(ADDRESS addr[],int length){
for(i=0;i<length;++i)printf(strFmt,addr[i].ID,addr[i].name,addr[i].workPlace,addr[i].teleOff,addr[i].teleHome);
}
void display(ADDRESS addr[]){
for(i=0;i<cntAddr;++i)addrTmp[i]=addr[i];
for(i=0;i<cntAddr-1;++i)for(j=i+1;j<cntAddr;++j)if(addrTmp[i].ID>addrTmp[j].ID){adTmp=addrTmp[i];addrTmp[i]=addrTmp[j];addrTmp[j]=adTmp;}
for(i=0;i<cntAddr;++i)printf(strFmt,addrTmp[i].ID,addrTmp[i].name,addrTmp[i].workPlace,addrTmp[i].teleOff,addrTmp[i].teleHome);
}
void namesort(ADDRESS addr[],int length){
for(i=0;i<length;++i)addrTmp[i]=addr[i];
for(i=0;i<length-1;++i)for(j=i+1;j<length;++j)if(strcmp(addrTmp[i].name,addrTmp[j].name)>0){adTmp=addrTmp[i];addrTmp[i]=addrTmp[j];addrTmp[j]=adTmp;}
for(i=0;i<length;++i)printf(strFmt,addrTmp[i].ID,addrTmp[i].name,addrTmp[i].workPlace,addrTmp[i].teleOff,addrTmp[i].teleHome);
};
void save(ADDRESS adr[],int length){
FILE *fp;
fp=fopen("c:\txl.txt","w");
for(i=0;i<cntAddr;++i)fprintf(fp,"%d %s %s %s %s ",adr[i].ID,adr[i].name,adr[i].workPlace,adr[i].teleOff,adr[i].teleHome);
fclose(fp);
};
void unitssort(ADDRESS addr[],int length){
for(i=0;i<length;++i)addrTmp[i]=addr[i];
for(i=0;i<length-1;++i)for(j=i+1;j<length;++j)if(strcmp(addrTmp[i].workPlace,addrTmp[j].workPlace)>0){adTmp=addrTmp[i];addrTmp[i]=addrTmp[j];addrTmp[j]=adTmp;}
for(i=0;i<length;++i)printf(strFmt,addrTmp[i].ID,addrTmp[i].name,addrTmp[i].workPlace,addrTmp[i].teleOff,addrTmp[i].teleHome);
};
void namesearch(ADDRESS addr[],int length){
printf("請輸入姓名: ");
scanf("%s",&in);
for(i=0;i<length;++i)if(strcmp(addr[i].name,in)==0)printf(strFmt,addr[i].ID,addr[i].name,addr[i].workPlace,addr[i].teleOff,addr[i].teleHome);
};
void unitssearch(ADDRESS adr[],int length){
printf("請輸入工作單位: ");
scanf("%s",&in);
for(i=0;i<length;++i)if(strcmp(adr[i].workPlace,in)==0)printf(strFmt,adr[i].ID,adr[i].name,adr[i].workPlace,adr[i].teleOff,adr[i].teleHome);
};
void officenumbersearch(ADDRESS adr[],int length){
printf("請輸入辦公電話: ");
scanf("%s",&in);
for(i=0;i<length;++i)if(strcmp(adr[i].teleOff,in)==0)printf(strFmt,adr[i].ID,adr[i].name,adr[i].workPlace,adr[i].teleOff,adr[i].teleHome);
};
void homenumbersearch(ADDRESS adr[],int length){
printf("請輸入家庭電話: ");
scanf("%s",&in);
for(i=0;i<length;++i)if(strcmp(adr[i].teleHome,in)==0)printf(strFmt,adr[i].ID,adr[i].name,adr[i].workPlace,adr[i].teleOff,adr[i].teleHome);
};
int delet(ADDRESS adr[],int length){
printf("要修改第幾條記錄: ");
scanf("%d",&j);
for(i=j;i<length-1;++i)adr[i]=adr[i+1];
return --length;
};
void rewrite(ADDRESS adr[],int length){
printf("要修改第幾條記錄: ");
scanf("%d",&j);
printf("請輸入ID: ");
scanf("%d",&i);
adr[j].ID=i;
printf("請輸入姓名: ");
scanf("%s",in);
strcpy(adr[j].name,in);
printf("請輸入工作單位: ");
scanf("%s",in);
strcpy(adr[j].workPlace,in);
printf("請輸入辦公電話: ");
scanf("%s",in);
strcpy(adr[j].teleOff,in);
printf("請輸入家庭電話: ");
scanf("%s",in);
strcpy(adr[j].teleHome,in);
};
int add(ADDRESS adr[],int length){
printf("請輸入ID: ");
scanf("%d",&i);
adr[length].ID=i;
printf("請輸入姓名: ");
scanf("%s",in);
strcpy(adr[length].name,in);
printf("請輸入工作單位: ");
scanf("%s",in);
strcpy(adr[length].workPlace,in);
printf("請輸入辦公電話: ");
scanf("%s",in);
strcpy(adr[length].teleOff,in);
printf("請輸入家庭電話: ");
scanf("%s",in);
strcpy(adr[length].teleHome,in);
return ++cntAddr;
};
void (){
FILE *fp,*fc;
printf("請輸入新文件名(路徑中的反斜杠用\表示) ");
scanf("%s",&in);
if((fp=fopen("c:\txl.txt","r"))!=NULL){
fc=fopen(in,"w");
while(!feof(fp)){
fscanf(fp,"%d %s %s %s %s ",&(adTmp.ID),adTmp.name,adTmp.workPlace,adTmp.teleOff,adTmp.teleHome);
fprintf(fc,"%d %s %s %s %s ",adTmp.ID,adTmp.name,adTmp.workPlace,adTmp.teleOff,adTmp.teleHome);
}
fclose(fc);
}
fclose(fp);
};
int enter(ADDRESS adr[]){
cntAddr=0;
printf("請按次序輸入數據,結束按CTRL+z: ");
while(1){
printf("請輸入ID: ");
if(scanf("%d",&i)==EOF)break;
adr[cntAddr].ID=i;
printf("請輸入姓名: ");
if(scanf("%s",in)==EOF)break;
strcpy(adr[cntAddr].name,in);
printf("請輸入工作單位: ");
if(scanf("%s",in)==EOF)break;
strcpy(adr[cntAddr].workPlace,in);
printf("請輸入辦公電話: ");
if(scanf("%s",in)==EOF)break;
strcpy(adr[cntAddr].teleOff,in);
printf("請輸入家庭電話: ");
if(scanf("%s",in)==EOF)break;
strcpy(adr[cntAddr].teleHome,in);
++cntAddr;
}
return cntAddr;
};
void showpaixu(ADDRESS adr[],int length)
{
int choice;
menu1:
system("cls");
printf(" *************************通訊錄信息管理系統************************* ");
printf(" 1. 全部顯示通訊錄信息 ");
printf(" 2. 按序號顯示通訊錄信息 ");
printf(" 3. 按姓名排序 ");
printf(" 4. 按工作單位排序 ");
printf(" 0. 返回上一級菜單 ");
printf(" ******************************************************************** ");
printf(" 請選擇(0~4) ");
scanf("%d",&choice);
switch(choice)
{
case 1:
list(adr,length);
printf(" 請按任意鍵返回... ");
system("pause");
break; /*顯示全部記錄*/
case 2:
display(adr);
printf(" 請按任意鍵返回... ");
system("pause");break; /*按序號顯示記錄*/
case 3:
namesort(adr,length);
printf(" 請按任意鍵返回... ");
system("pause");
break; /*按姓名排序*/
case 4:
unitssort(adr,length);
printf(" 請按任意鍵返回... ");
system("pause");
break; /*按工作單位排序*/
case 0: return;
}
goto menu1;
}
/*通訊錄信息查找功能*/
void chazhao(ADDRESS adr[],int length)
{
int choice;
menu2:
system("cls");
printf(" *************************通訊錄信息管理系統************************* ");
printf(" 1. 通過姓名查找 ");
printf(" 2. 通過工作單位查找 ");
printf(" 3. 通過辦公電話查找 ");
printf(" 4. 通過家庭電話查找 ");
printf(" 0. 返回上一級菜單 ");
printf(" ******************************************************************** ");
printf(" 請選擇(0~4) ");
scanf("%d",&choice);
switch(choice)
{
case 1:
namesearch(adr,length);
printf(" 請按任意鍵返回... ");
system("pause");
break; /*按姓名查找記錄*/
case 2:
unitssearch(adr,length);
printf(" 請按任意鍵返回... ");
system("pause");
break; /*按工作單位查找記錄*/
case 3:
officenumbersearch(adr,length);
printf(" 請按任意鍵返回... ");
system("pause");
break; /*按辦公電話查找記錄*/
case 4:
homenumbersearch(adr,length);
printf(" 請按任意鍵返回... ");
system("pause");
break; /*按住宅電話查找記錄*/
case 0: return;
}
goto menu2;
}
/*通訊錄信息變更功能*/
void biangeng(ADDRESS adr[],int length)
{
int choice;
menu3:
system("cls");
printf(" *************************通訊錄信息管理系統************************* ");
printf(" 1. 刪除記錄 ");
printf(" 2. 修改記錄 ");
printf(" 3. 添加記錄 ");
printf(" 0. 返回上一級菜單 ");
printf(" ******************************************************************** ");
printf(" 請選擇(0~3) ");
scanf("%d",&choice);
switch(choice)
{
case 1:
length=delet(adr,length);
save(adr,length);
printf(" 請按任意鍵返回... ");
getchar();
break; /*刪除記錄*/
case 2:
rewrite(adr,length);
save(adr,length);
printf(" 請按任意鍵返回... ");
getchar();
break; /*修改記錄*/
case 3:
length=add(adr,length);
save(adr,length);
printf(" 請按任意鍵返回... ");
getchar();
break; /*插入記錄*/
case 0: return;
}
goto menu3;
}
int wenjian(ADDRESS adr[],int length)
{
int choice;
menu4:
system("cls");
printf(" *************************通訊錄信息管理系統************************* ");
printf(" 1. 導入文件到通訊錄 ");
printf(" 2. 把當前文件復制到新文件上 ");
printf(" 0. 返回上一級菜單 ");
printf(" ******************************************************************** ");
printf(" 請選擇(0~2) ");
scanf("%d",&choice);
switch(choice)
{
case 1: length=load(adr);
printf("您已經成功的導入文件到通訊錄! ");
printf(" 請按任意鍵返回... ");
system("pause");break;
case 2: ();
printf("復製成功! ");
printf(" 請按任意鍵返回... ");
system("pause");break;
case 0: return length;
}
goto menu4;
}
/*關於*/
void about()
{
system("color 87");
system("cls");
printf(" 《通訊錄信息管理系統》 ");
printf(" ***************************************** ");
printf(" 版權所有(C) 2009-2010 DIY軟體 ");
printf(" 製作人:西北民族大學計算機科學與信息09級計算機3班 王元波 ");
printf(" ***************************************** ");
printf(" 請按任意鍵返回主菜單...");
system("pause");
}
/******主函數開始*******/
void main()
{
int choice;
int length; /*保存記錄長度*/
ADDRESS adr[100] ; /*定義結構體數組*/
menu:
system("color f9");
system("cls");
printf(" *************************通訊錄信息管理系統************************* ");
printf(" 請選擇以下通訊錄管理功能: ");
printf(" 1. 通訊錄信息輸入 ");
printf(" 2. 通訊錄信息瀏覽及排序 ");
printf(" 3. 通訊錄信息查詢 ");
printf(" 4. 通訊錄信息更改 ");
printf(" 5. 通訊錄及文件操作 ");
printf(" 6. 關於通訊錄信息管理系統 ");
printf(" 0. 退出通訊錄管理系統 ");
printf(" ******************************************************************** ");
printf(" 請選擇(0~6) ");
scanf("%d",&choice);
switch(choice)
{
case 1: length=enter(adr);
save(adr,length);
printf(" 請按任意鍵返回... ");
system("pause");break;/*輸入記錄*/
case 2: showpaixu(adr,length);break;
case 3: chazhao(adr,length);break;
case 4: biangeng(adr,length);break;
case 5: length=wenjian(adr,length);break;
case 6: about();break;/*關於*/
case 0: return; /*如返回值為則程序結束*/
}
goto menu;
}
拓展資料
C語言是一門通用計算機編程語言,應用廣泛。C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
3. 通訊錄管理系統
我這里有一個,你看看吧,滿意的給分哦(在visual c++6.0上運行)
#include<stdlib.h>
#include<string.h> /*使用字元串函數*/
#include<conio.h> /*使用通過控制台進行數據輸入和數據輸出的函數*/
#include<stdio.h>
#include<dos.h> /*使用DOS函數*/
int i; /*定義一個全局變數i*/
struct addr /*定義通訊地址結構體*/
{ char post_num[10]; /*郵編*/
char addr[60]; /*家庭地址*/
};
struct birth /*定義出生年月結構體*/
{ int year; /*年份*/
int month; /*月份*/
int day; /*日期*/
};
struct record1 /*定義電子通訊錄結構體*/
{ int number; /*序號*/
char name[20]; /*姓名*/
char sex; /*性別*/
struct birth birth; /*出生年月*/
struct addr addr; /*通信地址*/
char telephone[13]; /*聯系電話*/
}records[50];
FILE *fp; /*定義指向file類型結構體的指針變數*/
void Data_Load() /*定義載入數據函數*/
{ int j;
long k;
fp=fopen("record.txt","r+t"); /*打開文件record.txt,進行讀寫*/
if(fp!=NULL) /*如果文件不為空*/
{ for(i=1;i<50;i++)
{ j=fgetc(fp); /*從"records.txt"文件讀入整型數字*/
if(j==EOF) /*判斷是否到了文件尾*/
return; /*如果到了結尾,返回*/
k=i-1;
fseek(fp,k*sizeof(struct record1),SEEK_SET); /*將位置指針移到record1結構體所含位元組
的第k倍個位元組處*/
fread(&records[i],sizeof(struct record1),1,fp); /*讀取一條記錄*/
}
}
else
{ fp=fopen("record.txt","w"); /*打開文件record.txt,只寫*/
i=1;
}
}
void Data_Show(int j) /*定義顯示數據函數*/
{
printf("\n\n\tNo:%3d\n",records[j].number); /*序號*/
printf("\n\tname:%2s\n",records[j].name); /*姓名*/
printf("\n\tbirthday (y/m/d):%4d%2d%2d", records[j].birth.year, records[j].birth.month,
records[j].birth.day); /*列印第j個成員的出生年月日*/
printf("\n\tpost code:%-10s",records[j].addr.post_num); /*郵編*/
printf("\n\taddress:%-40s",records[j].addr.addr); /*家庭地址*/
printf("\n\tphone%-13s",records[j].telephone); /*聯系電話*/
}
void Data_Input(int j) /*定義添加數據函數*/
{
fflush(stdin); /*清空輸入緩沖區*/
records[j].number=j;
printf("\n\n\n\tinputNo %d ",j);
printf("\n\tname:"); /*輸入姓名*/
scanf("%s",records[j].name);
fflush(stdin); /*清空輸入緩沖區*/
printf("\tsex(m/f):"); /*輸入性別*/
scanf("%c",&records[j].sex);
printf("\t---birthday---"); /*輸入出生年月*/
printf("\n\tyear:");
scanf("%d",&records[j].birth.year);
printf("\tmonth:");
scanf("%d",&records[j].birth.month);
printf("\tday:");
scanf("%d",&records[j].birth.day);
printf("\tpost code:"); /*輸入郵編*/
scanf("%s",records[j].addr.post_num);
printf("\taddress:"); /*輸入家庭地址*/
scanf("%s",records[j].addr.addr);
printf("\tphone:"); /*輸入聯系電話*/
scanf("%s",records[j].telephone);
}
void Data_Save() /*定義保存函數*/
{
int j;
fp=fopen("record.txt","w"); /*打開文件record.txt,只寫*/
for(j=1;j<=i;j++)
{ fwrite(&records[j],sizeof(struct record1),1,fp); /*將結構體變數records的確定個數位元組輸
入到record.txt文件中,個數為結構體friend1所含位元組數*/
}
}
void main() /*主函數*/
{
int j,k;
char ch;
char search_name[40]; /*定義字元串變數*/
Data_Load(); /*聲明載入數據函數*/
i--;
do
{ printf("********************************* MENU ***************************************\n");
printf("------------------------! WELLCOME TO THE SYSTEM !------------------------------");
printf("\n*\tSelect Function: *");
printf("*\t1.Add New *");
printf("*\t2.View the data *");
printf("*\t3.Delete *");
printf("*\t4.Search *");
printf("*\t5.Insert *");
printf("*\t6.Save and quit *");
printf("*\t7.Quit *");
printf("\n******************************** MENU ****************************************\n");
printf("\tPlease choose the option you need:");
ch=getche(); /*輸入字元*/
switch(ch)
{
case '1':
{ int p;
printf("\n\tPlease input the number of people you want to add:");
scanf("%d",&p);/*增加記錄*/
printf("\tPlease press ENTER again");
while(getch()!=0x1b&&i<p)
{ i++;
Data_Input(i);
printf("Please press Enter again to continue\n");
}
if(i==p)printf("\n\tThe data is full\n");
} /*記錄完後顯示通訊錄已滿*/
break;
case '2': j=1; /*列印所有記錄*/
while(getch()!=0x1b&&j<=i) Data_Show(j++); /*聲明列印數據函數*/
if(j>i) printf("\n\tThe system is end\n"); /*顯示記錄末尾*/
break;
case '3': /*刪除通訊錄中的記錄*/
if(i<1)
{ printf("\n\tno record\n"); /*顯示無記錄*/
break;
}
printf("\n\tplease input the number you want to delect:");
scanf("%d",&k);
printf("\tsucceed!\n");
for(j=k;j<i;j++) /*將刪除位置後的元素順序前移,即後一數據復制到前一位置,循環操作*/
{ strcpy(records[j].name,records[j+1].name);
records[j].sex=records[j+1].sex;
records[j].birth.year=records[j+1].birth.year;
records[j].birth.month=records[j+1].birth.month;
records[j].birth.day=records[j+1].birth.day;
strcpy(records[j].addr.post_num,records[j+1].addr.post_num);
strcpy(records[j].addr.addr,records[j+1].addr.addr);
strcpy(records[j].telephone,records[j+1].telephone);
}
i--; /*元素總數減1*/
break;
case '4': /*通訊錄搜索功能*/
printf("\n\tPlease input the name:"); /*輸入名字*/
scanf("%s", search_name); /*獲得名字到指針型字元串變數*/
for(j=1;j<=i;j++)
{
if(strcmp(search_name,records[j].name)==0) /*比較字元串,即查看是否與記錄中名字
相同*/
{ Data_Show(j);
printf("\n"); /*搜索成功,列印記錄結束循環*/
break;
}
}
if(j>i) /*搜索失敗*/
printf("\n\tNo Record "); /*顯示無此記錄*/
break;
case '5':
printf("\n\tInsert No:"); /*錄入插入位置*/
scanf("%d",&k);
for(j=k+1;j<i;j++) /*將插入位置後的元素順序後移,即將其復制到後一位置,循環操作*/
{ strcpy(records[j].name,records[j-1].name);
records[j].sex=records[j-1].sex;
records[j].birth.year=records[j-1].birth.year;
records[j].birth.month=records[j-1].birth.month;
records[j].birth.day=records[j-1].birth.day;
strcpy(records[j].addr.post_num,records[j-1].addr.post_num);
strcpy(records[j].addr.addr,records[j-1].addr.addr);
strcpy(records[j].telephone,records[j-1].telephone);
}
Data_Input(k); /*聲明增加數據函數*/
i++;/*將記錄數目加一*/
break;
case '6': Data_Save();
printf("\n"); /*聲明保存函數*/
exit(0); break; /*保存後退出*/
case '7': printf("\n\tsave or not?:(y/n)");
ch=getch(); /*獲得輸入字元*/
if(ch=='y') Data_Save();
fclose(fp); /*關閉record.txt文件*/
exit(0); /*退出程序*/
default: printf("Please choose1-4\n"); /*輸入的如果不是數字1-4,讓其重新輸入*/
}
}
while(1); /*每次都從第一個功能開始,循環操作*/
}
請採納答案,支持我一下。