如何用C语言实现进度条

Python021

如何用C语言实现进度条,第1张

第一种,用printf模拟输出百分比,在控制台输出,实现进度监控。

代码:

#include<stdio.h>

#define N 20

void mBar(float fBar){

 

    int i,j,k,m

    for ( i=0i<N+6i++ ) printf("\b")

    k=N*fBar m=fBar*100 printf("[")

    for ( i=0i<ki++ ) printf("=")

    for ( j=0j<N-kj++ ) printf(" ")

    printf("]%3d%%",m) 

}

void delay(int n) { int i,j,k for ( i=0i<ni++ ) for ( j=0j<0x07fffj++ ) k++ }

void main()

{

    float x

    int i

    for ( i=0,x=0i<100i++,x+=0.01 ) { mBar(x) delay(1024) }

    mBar(1)

}

第二种,使用窗口组件。这个要看程序工作环境,纯粹的c语言是无法实现的。可以使VC++。Visual C++中的MFC类提供了标准的进度指示器控件(CProgressCtrl)。

m_progress->GetPos()//获取进度条的当前位置

m_progress->GetRange(int min,int max)//获取进度条控件的范围的下限和上限

m_progress->OffsetPos(int nPos)//用指定的增量推进进度条控件的当前位置,重绘进度条反映新位置

m_progress->SetBkColor(COLORREF clrNew)//设定进度条的背景颜色

m_progress->SerPos(int nPos)//设定进度条控件的当前位置,重绘进度条反映新位置

m_progress->SetRange(int min,int max)//设定进度条控件的范围的下限和上限

m_progress->SetRange32(int min,int max)//设定进度条控件的范围的下限和上限

m_progress->SetStep(int nStep)//指定进度条控件的步进增量

m_progress->StepIt()//通过步进增量,推进进度条控件的当前位置,重绘进度条反映新位置

应用:

CProgressCtrl *m_progress//头文件中声明

在OnInitDialog初始化

   {

   m_progress = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1)

   m_progress->SetRange(0,1000)

   m_progress->SetPos(0)

   UINT m_timer =(UINT) SetTimer(1,200,NULL)

   }

采用在定时器的消息处理函数WM_TIMER内添加不断更新进度条界面的方法

OnTimer (nIDEvent)

{

   pos = pos + 50

   if(pos>500)

   pos = 0

   m_Progress->SetPos(pos)

}

或者采用在某种循环体内添加不断更新进展条界面的方法

<p>您好,sa团队给出的答案</p> <p>(由于本人不用做百分比进度条,所以从网上找了一个,不知道对不对,仅供参考)</p> <p>#!/bin/sh<br>off (){<br>echo -e "\e[?25l"<br>}<br>on (){<br>echo -e "\e[?25h"<br>}<br>gotoxy (){<br>echo -ne "\e[$1$2h"<br>}<br>character (){<br>gotoxy 0 0<br>echo "["<br>gotoxy 0 44<br>echo "]"<br>n=2<br>num=0<br>while [ $n != 44 ]<br>do<br>sleep 0.07<br>gotoxy 0 $n<br>echo -en "\e[144m \e[0m"<br>gotoxy 0 45<br>echo -n "$num%"<br>num=$(echo "$n * 2.3 + 1" | bc )<br>(( n++ ))<br>done<br>gotoxy 0 45<br>echo -n "100.0%"<br>}<br>clear<br>off<br>character <br>on</p> <p></p> <p></p> <p>这里有一个网址,提供给您(cfm补丁0.2版,增加了进度条,百分比等内容的显示 </p> <p>): <a href="https://wenwen.sogou.com/login/redirect?url=http%3a%2f%2fclub.noahedu.com%2fthread-116262-1-1.html" target="_blank">http://club.noahedu.com/thread-116262-1-1.html</a></p>

这里有个现成的!拿去改改就行了!!

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include <windows.h>

#include <winbase.h>

typedef struct node{ /* 定义链表 */

char name[20]/* 姓名 */

char address[40]/* 地址 */

char phone[15]/* 电话 */

long zip/* 邮编 */

struct node *next

}add_list

struct person{ /* 定义一个结构备用 */

char name[20]

char address[50]

char phone[15]

long zip

}

FILE *fp

add_list *tail,*head/* 定义链表尾节点指针和头指针 */

/* 从文件中读出数据生成通讯录链表,如果文件不存在,生成空链表 */

add_list *load(char filename[])

{ add_list *new1,*head

struct person t

head=(add_list *)malloc(sizeof(add_list))

tail=head=NULL

if((fp=fopen(filename,"rb"))==NULL)

return head

else

if(!feof(fp))

if(fread(&t,sizeof(struct person),1,fp)==1)

{ new1=(add_list *)malloc(sizeof(add_list))/* 连入链表第一个节点 */

strcpy(new1->name,t.name)

strcpy(new1->address,t.address)

strcpy(new1->phone,t.phone)

new1->zip=t.zip

head=tail=new1

new1->next=NULL

while(!feof(fp)) /* 连入链表其余节点 */

{ if(fread(&t,sizeof(struct person),1,fp)==1)

{ new1=(add_list *)malloc(sizeof(add_list))

strcpy(new1->name,t.name)

strcpy(new1->address,t.address)

strcpy(new1->phone,t.phone)

new1->zip=t.zip

tail->next=new1

new1->next=NULL

tail=new1

}

}

}

fclose(fp)

return head

}

/* 自定义函数,进度条 */

void jindutiao(void)

{ int i

for(i=0i<78i++) putchar('.')

printf("\r\a")

for(i=0i<78i++)

{

if(i==0) putchar('|')

Sleep(100)

printf("\b|>")

}

}

/* 插入一条通讯录记录 */

void insert(add_list **head)

{ add_list * new1

new1=(add_list *)malloc(sizeof(add_list))

system("cls")

printf("\n请输入姓名:")getchar()gets(new1->name)

printf("\n请输入地址:")scanf("%s",new1->address)

printf("\n请输入电话:")scanf("%s",new1->phone)

printf("\n请输入邮编:")scanf("%ld",&new1->zip)

if(*head==NULL) /* 表头为空时 */

{ *head=new1

new1->next=NULL

tail=new1

}

else /* 插入到表尾 */

{ tail->next=new1

new1->next=NULL

tail=new1

}

printf("输入完成,按回车键返回......")

getchar()

getchar()

}

/* 将通讯录链表中的内容保存到指定文件中 */

void save(add_list *head,char filename[])

{ add_list *p

struct person t

if((fp=fopen(filename,"wb"))==NULL)

{ printf("错误:不能打开文件%s\n",filename)

exit(1)

}

else

{ p=head

while(p!=NULL)

{ strcpy(t.name,p->name)

strcpy(t.address,p->address)

strcpy(t.phone,p->phone)

t.zip=p->zip

fwrite(&t,sizeof(struct person),1,fp)

p=p->next

}

}

fclose(fp)

printf("保存成功,按回车键返回......")

getchar()getchar()

}

/* 显示通讯录内容 */

void display(add_list *head)

{ add_list *p

p=head

if(p!=NULL)

printf("姓名:\t\t住址:\t\t邮编:\t\t电话:\n")

while(p!=NULL)

{

printf("%s\t\t%s\t\t%ld\t\t%s\n",p->name,p->address,p->zip,p->phone)

p=p->next

}

printf("按回车键返回......")

getchar()getchar()

}

/* 按姓名查询通讯录记录 */

int search(add_list *head)

{ add_list *p

char name[20]

int flag=0

printf("请输入要查找的人的姓名:")

getchar()

gets(name)

p=head

while(p!=NULL)

{ if(strcmp(name,p->name)==0)

{ printf("姓名:\t\t住址:\t\t邮编:\t\t电话:\n")

printf("%s\t\t%s\t\t%ld\t\t%s\n",p->name,p->address,p->zip,p->phone)

flag=1

}

p=p->next

}

return flag

}

/* 按姓名删除一条通讯录记录 */

int delete1(add_list **head)

{ add_list *p,*q,*t

char name[20],c

int flag=0

printf("请输入要删除人的姓名:")

scanf("%s",name)

q=p=*head

while(p!=NULL)

{ if(strcmp(name,p->name)==0) /* 找到要删除的人 */

{ printf("姓名:\t\t住址:\t\t邮编:\t\t电话:\n")

printf("%s\t\t%s\t\t%ld\t\t%s\n",p->name,p->address,p->zip,p->phone)

printf("真的要删除吗?(Y:是,N:否)\n")/* 征求意见(删&不删) */

getchar()c=getchar()

if(c=='y'||c=='Y') /* 删除 */

{ if(p==*head)

*head=p->next

else

q->next=p->next

t=p

p=p->next

free(t)

flag=1

}

else /* 不删,跳过 */

{ q=p

p=p->next

flag=1

}

}

else /* 没找到,继续 */

{ q=p

p=p->next

}

}

return flag

printf("按回车键返回......")

getchar()

}

/* 显示菜单并选择菜单项 */

int menu_select()

{ char c

system("cls")

printf("\t\t********************通讯录********************\n")

printf("\t\t\t 1:输入新的通讯记录\n")

printf("\t\t\t\t 2:删除记录\n")

printf("\t\t\t\t 3:查找\n")

printf("\t\t\t\t 4:保存文件\n")

printf("\t\t\t 5:浏览所有通讯记录\n")

printf("\t\t\t\t 6:退出\n")

do{

printf("请输入你的选择(1~~6):")

c=getchar()

}while(c<'1'||c>'6')

return c

}

/* 主函数 */

int main(void)

{ char filename[20]

char c

int t

printf("\n\n\n\n\n\n\t\t\t\t通讯录启动中...\n\n\n\n\n\n\n\n\n\n\n\n\n")

jindutiao()

system("cls")

printf("请输入通讯录文件名称:\n")

scanf("%s",filename)

getchar()

head=load(filename)

while(1)

{ c=menu_select()

switch(c)

{ case '1': insert(&head)break

case '2': t=delete1(&head)

if(!t) printf("记错了吧,没这人!\n按回车键返回......")getchar()getchar()break

case '3': t=search(head)

if(!t) printf("天啊!居然没找到!\n按回车键返回......")getchar()break

case '4': save(head,filename)break

case '5': display(head)break

case '6': exit(0)

}

}

}