当前位置:首页 > 说说 > 正文
文章正文

c语言flag的用法

导读: c语言flag的用法(共10篇)c语言函数的功能和用法函数名: abort功 能: 异常终止一个进程用 法: void abort(void);程序例: include include int...

说说 > :c语言flag的用法是由173资源网(www.fz173.com)为您精心收集,如果觉得好,请把这篇文章复制到您的博客或告诉您的朋友,以下是c语言flag的用法的正文:

【一】:c语言函数的功能和用法

函数名: abort

功 能: 异常终止一个进程

用 法: void abort(void);

程序例:

#include <stdio.h>

#include <stdlib.h>

int main(void)

{

printf("Calling abort()\n");

abort();

return 0; /* This is never reached */

}

函数名: abs

功 能: 求整数的绝对值

用 法: int abs(int i);

程序例:

#include <stdio.h>

#include <math.h>

int main(void)

{

int number = -1234;

printf("number: %d absolute value: %d\n", number, abs(number)); return 0;

}

函数名: absread, abswirte

功 能: 绝对磁盘扇区读、写数据

用 法: int absread(int drive, int nsects, int sectno, void *buffer); int abswrite(int drive, int nsects, in tsectno, void *buffer); 程序例:

/* absread example */

#include <stdio.h>

#include <conio.h>

#include <process.h>

#include <dos.h>

int main(void)

{

int i, strt, ch_out, sector;

char buf[512];

printf("Insert a diskette into drive A and press any key\n"); getch();

sector = 0;

if (absread(0, 1, sector, &buf) != 0)

{

perror("Disk problem");

exit(1);

}

printf("Read OK\n");

strt = 3;

for (i=0; i<80; i++)

{

ch_out = buf[strt+i];

putchar(ch_out);

}

printf("\n");

return(0);

}

函数名: access

功 能: 确定文件的访问权限

用 法: int access(const char *filename, int amode);

程序例:

#include <stdio.h>

#include <io.h>

int file_exists(char *filename);

int main(void)

{

printf("Does NOTEXIST.FIL exist: %s\n",

file_exists("NOTEXISTS.FIL") ? "YES" : "NO");

return 0;

}

int file_exists(char *filename)

return (access(filename, 0) == 0);

}

函数名: acos

功 能: 反余弦函数

用 法: double acos(double x);

程序例:

#include <stdio.h>

#include <math.h>

int main(void)

{

double result;

double x = 0.5;

result = acos(x);

printf("The arc cosine of %lf is %lf\n", x, result);

return 0;

}

函数名: allocmem

功 能: 分配DOS存储段

用 法: int allocmem(unsigned size, unsigned *seg);

程序例:

#include <dos.h>

#include <alloc.h>

#include <stdio.h>

int main(void)

{

unsigned int size, segp;

int stat;

size = 64; /* (64 x 16) = 1024 bytes */

stat = allocmem(size, &segp);

if (stat == -1)

printf("Allocated memory at segment: %x\n", segp);

else

printf("Failed: maximum number of paragraphs available is %u\n", stat);

return 0;

}

函数名: arc

功 能: 画一弧线

用 法: void far arc(int x, int y, int stangle, int endangle, int radius); 程序例:

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

int main(void)

{

/* request auto detection */

int gdriver = DETECT, gmode, errorcode;

int midx, midy;

int stangle = 45, endangle = 135;

int radius = 100;

/* initialize graphics and local variables */

initgraph(&gdriver, &gmode, "");

/* read result of initialization */

errorcode = graphresult(); /* an error occurred */

if (errorcode != grOk)

{

printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:");www.fz173.com_c语言flag的用法。

getch();

exit(1); /* terminate with an error code */

}

midx = getmaxx() / 2;

midy = getmaxy() / 2;

setcolor(getmaxcolor());

/* draw arc */

arc(midx, midy, stangle, endangle, radius);

/* clean up */

getch();

closegraph();

return 0;

}

函数名: asctime

功 能: 转换日期和时间为ASCII码

用 法: char *asctime(const struct tm *tblock);

程序例:

#include <stdio.h>

#include <string.h>

#include <time.h>

int main(void)

{

struct tm t;

char str[80];

/* sample loading of tm structure */

t.tm_sec = 1; /* Seconds */

t.tm_min = 30; /* Minutes */

t.tm_hour = 9; /* Hour */

t.tm_mday = 22; /* Day of the Month */

t.tm_mon = 11; /* Month */

t.tm_year = 56; /* Year - does not include century */

t.tm_wday = 4; /* Day of the week */

t.tm_yday = 0; /* Does not show in asctime */

t.tm_isdst = 0; /* Is Daylight SavTime; does not show in asctime */

/* converts structure to null terminated

string */

strcpy(str, asctime(&t));

printf("%s\n", str);

return 0;

}

【二】:C语言 #pragma用法详解

目录:

(0)前言

www.fz173.com_c语言flag的用法。

(1) #pragma message能够在编译信息输出窗口中输出相应的信息

(2) #pragma code_seg能够设置程序中函数代码存放的代码段,开发驱动程序的时会用到

(3) #pragma once若用在头文件的最开始处就能够保证头文件被编译一次

(4) #pragma hdrstop表示预编译头文件到此为止

(5) #pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程

(6) #pragma warning允许有选择性的修改编译器的警告消息的行为

(7) #pragma comment将一个注释记录放入一个对象文件或可执行文件中

(8) #pragma data_seg建立一个新的数据段并定义共享数据

应用1:在DLL中定义一个共享的,有名字的数据段

应用2:data_seg控制应用程序的启动次数

(9)其他用法

(0)前言

#Pragma 指令的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma 指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的, 且对于每个编译器都是不同的。

其格式一般为: #Pragma Para

其中Para为参数,下面来看一些常用的参数。

(1) #Pragma message参数能够在编译信息输出窗口中输出相应的信息

这对于源代码信息的控制是非常重要的。其使用方法为: Pragma message(“消息文本”) 当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法

#ifdef _X86

#pragma message(“_X86 macro activated!”)

#endif

若定义了_X86,程序编译时就会在显示“_X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。

(2) #pragma code_seg能够设置程序中函数代码存放的代码段,

开发驱动程序的时候就会使用到它。格式如下:

#pragma code_seg( [ [ { push | pop}, ] [ identifier, ] ][ "segment-name" [,

"segment-class" ] ])

该指令用来指定函数在.obj文件中存放的节,观察OBJ文件可以使用VC自带的dumpbin命令行程序 ,如果code_seg没有带参数的话,则函数在OBJ文件中存放在默认在.text节中。 push (可选参数) 将一个记录放到内部编译器的堆栈中,可选参数可以为一个标识符或者节名

pop(可选参数) 将一个记录从堆栈顶端弹出,该记录可以为一个标识符或者节名

identifier (可选参数) 当使用push指令时,为压入堆栈的记录指派的一个标识符,当该标识符被删除的时候和其相关的堆栈中的记录将被弹出堆栈

"segment-name" (可选参数) 表示函数存放的节名

例如:

//默认情况下,函数被存放在.text节中

void func1() { // stored in .text

}

//将函数存放在.my_data1节中

#pragma code_seg(".my_data1")

void func2() { // stored in my_data1

}

//r1为标识符,将函数放入.my_data2节中

#pragma code_seg(push, r1, ".my_data2")

void func3() { // stored in my_data2

}

int main() {}

(3)#pragma once (比较常用)若用在头文件的最开始处就能够保证头文件被编译一次.

一般在整个工程中我们只要包含头文件一次就够了,若多个.c/.cpp文件中都要包含同一个头文件,比如Windows.h,那很多声明等等岂不是有两次了?解决这个问题的传统的方法是在头文件开始出用 #define 定义一个宏,比如Windows.h中:

#ifndef _WINDOWS_

#define _WINDOWS_

#endif

这样就可以避免被包含多次。但是这样的后果是代码的可读性较差 (个人观点),VC给我们提供了另外一个途径,那就是在文件的前面加上:

#pragma once”

(4)#pragma hdrstop表示预编译头文件到此为止

后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件.有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma

startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。

(5)#pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体外观的定义。

(6) #pragma warning允许有选择性的修改编译器的警告消息的行为

指令格式如下:

#pragma warning( warning-specifier : warning-number-list [;warning-specifier : warning- number-list...]) #pragma warning( push[ ,n ] )

#pragma warning( pop )

主要用到的警告表示有如下几个:

once:只显示一次(警告/错误等)消息

default:重置编译器的警告行为到默认状态

1,2,3,4:四个警告级别

disable:禁止指定的警告信息

error:将指定的警告信息作为错误报告

#pragma warning( disable: 4507 34; once : 4385; error : 164 )

等价于:

#pragma warning(disable:4507 34) // 不显示4507和34号警告信息

#pragma warning(once:4385) // 4385号警告信息仅报告一次www.fz173.com_c语言flag的用法。

#pragma warning(error:164) // 把164号警告信息作为一个错误。

#pragma warning( push )保存所有警告信息的现有的警告状态。

#pragma warning( push,n)保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。

#pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。例如:

#pragma warning( push )

#pragma warning( disable : 4705 ) #pragma warning( disable : 4706 ) #pragma warning( disable : 4707 ) //.......

#pragma warning( pop )

在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。

(7)pragma comment将一个注释记录放入一个对象文件或可执行文件中 该指令的格式为

#pragma comment( "comment-type" [, commentstring] )

comment-type(注释类型):可以指定为五种预定义的标识符的其中一种,五种预定义的标识符为:

compiler:将编译器的版本号和名称放入目标文件中,本条注释记录将被编译器忽略,如果你为该记录类型提供了commentstring参数,编译器将会产生一个警告

例如:#pragma comment( compiler )

exestr: 链接时,将commentstring参数放入到可执行文件中,当操作系统加载可执行文件的时候,该参数字符串不会被加载到内存中.但是,该字符串可被 dumpbin之类的程序查找出并打印出来,你可以用这个标识符将版本号码之类的信息嵌入到可执行文件中!

lib:用来将一个库文件链接到目标文件中

比如我们连接的时候用到了WSock32.lib,你当然可以不辞辛苦地把它加入到你的工程中。但是我觉得更方便的方法是使用#pragma指示符,指定要连接的库:

#pragma comment(lib, "WSock32.lib")

linker:将一个链接选项放入目标文件中,你可以使用这个指令来代替由命令行传入的或者在开发环境中设置的链接选项,你可以指定/include选项来强制包含某个对象,例如: #pragma comment(linker, "/include:__mySymbol") 你可以在程序中设置下列链接选项

/DEFAULTLIB

/EXPORT

/INCLUDE

/MERGE

/ SECTION

这些选项在这里就不一一说明了,详细信息请看msdn!

user:将一般的注释信息放入目标文件中commentstring参数包含注释的文本信息,这个注释记录将被链接器忽略,例如:

#pragma comment( user, "Compiled on " __DATE__ " at " __TIME__ )

(8)#pragma data_seg建立一个新的数据段并定义共享数据

格式为:

#pragma data_seg ("shareddata")

HWND sharedwnd=NULL;//共享数据

#pragma data_seg()

应用1:在DLL中定义一个共享的,有名字的数据段。

注意:a、这个数据段中的全局变量能够被多个进程共享。否则多个进程之间无法共享DLL中的全局变量。

b、共享数据必须初始化,否则微软编译器会把没有初始化的数据放到.BSS段中,从而导致多个进程之间的共享行为失败。

假如在一个DLL中这么写:

#pragma data_seg("MyData")

intg_Value; // 全局变量未初始化

#pragma data_seg()

DLL提供两个接口函数:

intGetValue()

{

returng_Value;

}

voidSetValue(int n)

{

g_Value = n;

}

然后启动两个都调用了这个DLL的进程A和B,假如A调用了SetValue(5); B接着调用int m = GetValue(); 那么m的值不一定是5,而是个未定义的值。因为DLL中的全局数据对于每一个调用他的进程而言,是私有的,不能共享的。假如您对g_Value进行了初始化,那么g_Value就一定会被放进MyData段中。换句话说,假如A调用了SetValue(5); B接着调用int m = GetValue(); 那么m的值就一定是5!这就实现了跨进程之间的数据通信!#pragma

应用2: data_seg控制应用程序的启动次数

有的时候我们可能想让一个应用程序只启动一次,就像单件模式(singleton)一样,实现的方法可能有多种,这里说说用#pragma data_seg来实现的方法,很是简洁便利。应用程序的入口文件前面加上:

#pragma data_seg("flag_data")

intapp_count = 0;

【三】:c语言rand的用法

  C语言中rand用于产生随机数,与他相关的是srand ,下面将详细说明c语言rand的用法。   rand(产生随机数)   表头文件: #include   定义函数 :int rand(void)   函数说明 :   因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand ()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。   返回值:   返回0至RAND_MAX之间的随机整数值,RAND_MAX的范围最少是在32767之间(int),即双字节(16位数)。若用unsigned int 双字节是65535,四字节是4294967295的整数范围。   0~RAND_MAX每个数字被选中的机率是相同的。   rand的用法范例1:   /* 产生介于1 到10 间的随机数值,此范例未设随机数种子,完整的随机数产生请参考   srand()*/   #include   main()   {   int i,j;   for(i=0;i<10;i++)   {   j=1+(int)(10.0*rand()/(RAND_MAX+1.0));   printf("%d ",j);   }   }   执行:   9 4 8 8 10 2 4 8 3 6   9 4 8 8 10 2 4 8 3 6 //再次执行仍然产生相同的随机数   srand(设置随机数种子)   表头文件:#include   定义函数:void srand (unsigned int seed);   函数说明:   srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用geypid()或time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。   rand的用法范例2:   /* 产生介于1 到10 间的随机数值,此范例与执行结果可与rand()参照*/   #include   #include   main()   {   int i,j;   srand((int)time(0));   for(i=0;i<10;i++)   {   j=1+(int)(10.0*rand()/(RAND_MAX+1.0));   printf(" %d ",j);   }   }   执行:与rand范例比较   5 8 8 8 10 2 10 8 9 9   2 9 7 4 10 3 2 10 8 7   又或:   用"int x = rand() % 100;"来生成 0 到 100 之间的随机数这种方法是不或取的,比较好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))产生一个0到n之间的随机数   int main(void)   {   int i;   time_t t;   srand((unsigned) time(&t));   printf("Ten random numbers from 0 to 99/n/n");   for(i=0; i<10; i++)   printf("%d/n", rand() % 100);   return 0;   }   除以上所说的之外,补充一点就是srand这个函数一定要放在循环外面或者是循环调用的外面,否则的话得到的是相同的数字。   MSDN中的例子。   // crt_rand.c   // This program seeds the random-number generator   // with the time, then displays 10 random integers.   //   #include   #include   #include   int main( void )   {   int i;   // Seed the random-number generator with current time so that   // the numbers will be different every time we run.   //   srand( (unsigned)time( NULL ) );   // Display 10 numbers.   for( i = 0; i < 10;i++ )   printf( " %6d/n", rand() );   printf("/n");   // Usually, you will want to generate a number in a specific range,   // such as 0 to 100, like this:   {   int RANGE_MIN = 0;   int RANGE_MAX = 100;   for (i = 0; i < 10; i++ )   {   int rand100 = (((double) rand() /   (double) RAND_MAX) * RANGE_MAX + RANGE_MIN);   printf( " %6d/n", rand100);   }   }   rand的用法总结:   我们知道rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种了,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了 srand()函数,它的原形是void srand( int a) 功能是   初始化随机产生器既rand()函数的初始值,即使把种子的值改成a; 从这你可以看到通过sand()函数,我们是可以产生可以预见的随机序列,   那我们如何才能产生不可预见的随机序列呢?我们可能常常需要这样的随机序列,是吧。利用srand((unsign)(time(NULL))是一种方法,因为每一次运行程序的时间是不同的,对了,你知道time() 函数的功能是返回从1970/01/01到现在的秒数的吧,可能这个起始时间不正确,你查一下对不对吧,C还提供了另一个更方便的函数, randomize()   原形是void randomize(),功能是用来始初rand() 的种子的初始值,而且该值是不确定的,它相当于srand((unsign)(time(NULL)) 不过应注意的是randomize()的功能要通过time来实现所以在调用它时头文件要包含time.h罢了

【四】:C语言见习报告3篇

  C语言是一种计算机程序设计语言,属高级语言范畴。它既具有高级语言的特点,又具有汇编语言的特点。通过见习做一报告,本文是C语言见习的报告,仅供参考。

  C语言见习报告一:

  班级:姓名:

  实验名称:

  电话订餐信息处理

  实验目的:

  题目要求:

  一个小饭馆的生意非常红火,要想用餐必须提前一天打电话预订,假设我们是饭馆负责接受

  电话预订的服务员,我们需要做些什么呢?首先,需要准备一张大小适当的白纸,等待顾客的电话。李红最先打进了电话,她预约第2天中午12点用餐,用餐人数5人,服务员在纸上做了如下记录:“李红 12点 5人”;接着,刘娜、汪涵、孙杰和赵君分别来了电话,服务员根据他们的要求做了记录,此时纸上记录的内容是:

  李红 12点 5人

  刘娜 11点 2人

  汪涵 11点20分 3人

  孙杰 10点30分 5人

  赵君 13点20分 6人

  孙杰随后又来电话,将用餐时间推后一个小时,那么记录的内容也应该做相应的修改。刘娜来用餐以后,可以将其信息从纸上划去

  编写程序处理电话订餐的情况

  实验步骤:

  首先建立结构体类型,然后函数声明,编写主函数,定义函数,调用函数。完成后,对程序进行调试,确定所编写的程序是否能够运行。

  实验内容:

  #include

  #include

  #define max 30

  struct guest

  { intnum;

  char name[40];

  char time[20];

  int sum;

  }guestlink[max];

  void insert(int *p);

  void inquire(int);

  void change(int);

  void dele(int *p);

  void show(int);

  void main()

  { inti;

  int count=0;

  do

  {0

  printf("1.......插入\n");

  printf("2.......查询\n");

  printf("3.......修改\n");

  printf("4.......删除\n");

  printf("5.......显示\n");

  printf("6.......退出\n");

  scanf("%d",&i);

  switch(i)

  {

  case 1: insert(&count);break;

  case 2: inquire(count);break;

  case 3: change(count);break;

  case 4: dele(&count);break;

  case 5: show(count);break;

  case 6:break;

  default:printf("输入错误!");break;

  }

  }while(i!=6);

  }

  void insert(int *p)

  { inti,number;

  if(*p==max)

  { printf("用餐已满\n");return;}

  printf("请输入编号:");

  scanf("%d",&number);

  for(i=0;i<*p;i++)

  if(guestlink[i].num==number)

  { printf("已有相同的编号");return;}

  guestlink[i].num=number;

  printf("请输入姓名:");

  scanf("%s",guestlink[i].name);

  printf("请输入人数:");

  scanf("%d",&guestlink[i].sum);

  printf("请输入用餐时间:");

  scanf("%s",guestlink[i].time);

  (*p)++;

  }

  void inquire(int p)

  { inti,number,flag=1;

  printf("请输入要查询的编号");

  scanf("%d",&number);

  for(i=0;i

  if(guestlink[i].num==number)

  { printf("姓名:%s",guestlink[i].name);

  printf("用餐时间:%s",guestlink[i].time);

  printf("人数:%d\n",guestlink[i].sum);

  flag=0;

  }

  if(i>=p&&flag==1) printf("所查询的编号不存在");

  }

  void change(int p)

  { inti,number,flag=1;

  printf("请输入要修改的编号");

  scanf("%d",&number);

  for(i=0;i

  if(guestlink[i].num==number)

  { printf("请输入姓名:");

  scanf("%s",guestlink[i].name);

  printf("请输入用餐时间:");

  scanf("%s",guestlink[i].time);

  printf("请输入人数:");

  scanf("%d",&guestlink[i].sum);

  flag=0;

  }

  if(i>=p&&flag==1) printf("所查询的编号不存在");

  }

  void dele(int *p)

  { inti,j,number,flag=1;

  printf("请输入要删除的编号");

www.fz173.com_c语言flag的用法。  scanf("%d",&number);

  for(i=0;i<*p&&flag;i++)

  if(guestlink[i].num==number)

  {for(j=i;j<*p-1;j++)

  guestlink[j]=guestlink[j+1];

  flag=0;

  (*p)--;

  }

  if(i>=*p&&flag==1) printf("输入的编号不存在");

  }

  void show(int p)

  { inti;

  printf("编号 姓名 用餐时间 人数\n ");

  for(i=0;i

  { printf("%d",guestlink[i].num);

  printf("%8s",guestlink[i].name);

  printf("%8s",guestlink[i].time);

  printf("%8d\n",guestlink[i].sum);

  }

  }

  实验结果:

  实验体会:

  通过这次实践让我觉得用C语言在生活中的应用占有很大的比重,这次编程,让我体会到了学习C语言的乐趣,以及运用c语言给人们带来的方便。作为一名初学者,我了解到了计算机语言的神秘性和逻辑性,将算法与数据结构的充分结合,体现了程序的内涵,也同时展现了C语言的深度。也是因为这次实践的过程,加深了我对c语言的兴趣,也意识到学习c语言是需要耐心和细心的。只有透彻的学习,才能有熟练的运用。

  C语言见习报告二:

  一、实习时间:2010年6月21日—2010年6月25日

  二、实习地点:第一微机室

  三、实习目的:

  1、熟悉我们自己所用的计算机的C语言开发环境,并且能够熟练掌握,达到错误能找到原因并且加以改正。

  2、加深对课本理论知识的理解,进一步掌握书中重点、难点实例,锻炼自己的编写程序能力和实际应用能力。

  3、上机调试程序的过程中,发现错误,解决错误,保证程序的正确运行,运行结果与给定结果完全相同。

  4、学会用书中基本知识解决实际中的一些问题,将书本所学的内容与实际操作相结合,掌握把实际问题转变为C语言描述的算法的方法,明确思路。将自身的不足与缺陷改掉,养成良好编辑风格

  5、培养我们的主观能动性、沟通、表达能力和团队合作意识,为我们以后的发展打下基础。

  四、实习内容及方法:

  在本次实习中,我们采用了由浅及深、由易到难的实习方法,而且也是按照书本的教学进程内容进行的,同时采取了实际应用与理论相结合的方法,在机房里面实习,一边理解,思考做题的思路与解法,另一边就可以马上进行上机实际操作。这对于我们加深对C语言的理解、操作以及动手能力都有了很大的帮助与提高。

  实训的内容主要分为了七个版块:

  第一版块:

  1、Turbo C运行环境。

  了解TC的基本环境,熟悉常用菜单项和快捷键:在这一小节中,需要熟练的掌握并应用Turbo C的运行环境,和基本配置。Turbo C是在计算机上广泛使用的一个C语言开发环境,它具有方便、直观、易用的界面和丰富的函数库。它把程序的编辑、编译、连接和运行等操作去不都集中在一个界面上进行,使用非常方便。并且Turbo C不需要特别安装,只需要将其拷贝到硬盘上就可以使用了。 为了方便管理用户的程序文件和维Turbo C2.0的运行环境,客户应在机子

  上建立自己的工作目录,一边用来存放自己所需要开发的源程序文件。下面就是建立怎样自己文件夹,在空白区域内输入自己所建立的文件夹路径即可。

  2、C程序的编辑、编译、连接和运行过程。

  掌握C程序的运行步骤,初步了解C程序的特点。在Turbo C的运行中,快捷键使用非常方便,只需Ctrl+菜单栏中菜单名的首字母即可。

  上面是一个程序编译与链接的截屏。第一个Compile to OBJ将源程序编译为OBJ文件,Make EXE file 编译连接一次进行,Link EXE file将OBJ文件连接为EXE文件。

  3、VC6.0环境的熟悉,自己按照软件并在软件中能够调试简单的C语言程序。

  第二版块:

  1、C语言数据类型:整型、实型、字符型。

  C语言的函数类型非常丰富,除了这几类以外,还有实型、数组、指针、结构体等,在这一小节中,主要了解关于数据类型的定义、用法以及他们的存储类型,一边与以后灵活运用。

  C语言中还有常量与变量之分,常量是在程序执行过程中其值不变的量。二且在C语言中常量不需要类型说明就可以直接使用,常量的类型是由常量的本身隐含决定的。

  2、运算符及表达式。

  在C语言中,预算符非常丰富运算灵活,常用的有以下几个:

  (1)算术运算符:+、-、*、/、%(取余)及++(自增)、--(自减)。

  (在这里需要注意的是:“/”运算符,在C语言中两边都是整数的话,运算结果只取整数部分;“%”他的两边都必须是整数才可以运行;“**、--”运用这个运算符时要注意“先用后加(减)、先加(减)后用”的问题)

  (2)赋值运算符:=及复合赋值运算符(+=、-=、*=、/=、%=等)。

  (在这里需要注意的是“=、==”的区别,要明确用法及所用的地方,“=”它的作用是赋值,“==”它的作用是判断相等)

  (3)逗号运算符:,(对于逗号表达式索要注意的是要明确它所用的地方以及在使用时所要注意的细节)。

  了解三种运算符的优先级,掌握三种运算符及相应表达式的应用(详见附录)。

  第三版块:在这一节里,我们实习了C语言的三大结构:

  1、顺序结构:

  2、选择结构:if„„else,switch语句。

  在这里许啊哟我们学习的很多,因为只要是程序,就脱离不了这个三大结构的范畴。在这个学习里我编写了

  (1)、输入某年某月某日,判断这一天是这一年的第几天?。

  (2)、给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

  (3)、某市不同车牌的出租车3公里的起步价和计费分别为:夏利7元,3公里以外,2.1元/公里;富康8元,3公里以外,2.4元/公里;桑塔纳9元,3公里以外,2.7元/公里。编程:从键盘输入乘车的车型及行车公里数,输出应付工资。

  源程序减附录;

  经过这几个程序的练习,让我聊股的掌握了选择语句的用法以及精髓,同是这个用法和技巧已经深深的可在了我的脑海里,还有同过这些个程序的编写,让我对以前有的丝丝而非的地放完全通透理解,获益匪浅。

  循环结构:while、do-while、for

  在循环这一节里,我们主要做了以下程序:

  (1)、求200-300之间所有素数,每5个换行。

  (2)、猜数字游戏。规则为:输入一个0-10之间的数字,有5次猜测机会。如果输入0-4之间的数字,提示“太小了”;如果输入5-7之间的数字,提示“接近了”;如果输入9-15之间的数字,提示“太大了”;如果输入8,提示“correct!”;如果次数超过5次,提示“没有机会了,退出!”。

  (3)、打印输出如下图形:(“◇”菱形)

  (4)、有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

  提示:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。

  (5)、打印输出九九乘法表。

  我以前就对循环这一节里的内容就理解的比较好,现在做这些题很顺利的就做下去了,但在做的同是也会出现以写小的问题,但这个让我也更深一步的理解了循环语句的用法、思路以及其中的精华。

  总的对这一节来说,使自己更神一步的理解了选择、过程中需要注意的一些细节问题。

  第四版块:

  1、一、二维数组的定义、引用及初始化。初始化:

  一维数组:初始化赋值的一般形式为: static 式]={值,值„„值}; 其中static表示是静态存储类型,态存储数组和外部存储数组才可作初始化赋值二维数组:

  a.可以只对部分元素赋初值,未赋初值的元素自动取b.如对全部元素赋初值,则第一维的长度可以不给出。2、一、二维数组的应用。

  在一维数组的应用中,要与循环嵌套使用,用,但是在这里,嵌套还要是循环的嵌套,因为只有这样使用才可以使程序更加简洁、简便。就像第五题:有一个班4个学生,(1)求每一门课程的平均分; (2)求每一个学生的平均分;

  思路:定义一个二维数组,用二重循环输入这个数组,然后进行相加,在求平均直,最后在用二重循环进行输出。

  循环的用法以及在使用类型说明符 数组名[常量表达 C语言规定只有静0值。 门课。编程实现如下功能:

  在这里,进行了求平均值的过二维数组要与也要与循环嵌套使5程。这里进行了二重循环输出。

  第五版块:

  1、函数的定义和调用

  函数可分为库函数和用户定义函数两种。

  (1)库函数

  库函数只不需要用户自己定义的,只需要在用的时候将其调用出来用就可以了,非常方便,并且C语言有这丰富的函数库。

  (2)用户定义函数

  用户自己定义的函数,是属于一个自定义范畴,自己定义的函数不仅要在程序中定义函数本身, 而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。

  2、函数参数和函数值

  (1)无 参函数

  函数定义、函数说明及函数调用中均不带参数。 主调函数和被调函数之间不进行参数传送。 此类函数通常用来完成一组指定的功能,可以返回或不返回函数值。

  (2)有参函数

  也称 为带参函数。在函数定义及函数说明时都有参数, 称为形式参数(简称为形参)。在函数调用时也必须给出参数, 称为实际参数(简称为实参)。 进行函数调用时,主调函数将把实参的值传送给形参,供被调函数使用。

  (1)有返回值函数

  此类函数被调用执行完后将向调用者返回一个执行结果, 称为函数返回值。由用户定义的这种要返回函数值的函数,必须在函数定义和函数说明中明确返回值的类型。

  (2)无返回值函数

  此类函数用于完成某项特定的处理任务, 执行完成后不向调用者返回函数值。这类函数类似于其它语言的过程。 由于函数无须返回值,用户在定义此类函数时可指定它的返回为“空类型”, 空类 型符的类型说明为“void”。

  2、函数的嵌套调用和递归调用

  C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。 但是C语言允许在一个函数的定义中出现对另一个函数的调用。 这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。

  这以小节内容经过几个练习题的联系,让我掌握到了其中的主要部分,对此也比较的明确。

  4、局部变量和全局变量及变量的存储类别

  局部变量:局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。

  全局变量:全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。 但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。

  在C语言中,对变量的存储类型说明有以下四种:auto 自动变量 register 寄存器变量 extern 外部变量 static 静态变量

  在局部变量中所定义的变量,只能在该函数中使用,在函数编辑时,预处理命令下定义的变量属于全局变量,在每个函数中都可以使用,传递参数时,不用传递全局变量。

  在这里,我主要说的是第二个练习题,它的思想是一个加密算法。思路是:现编写一个主程序,实现函数调用,在子函数中实现加密算法并且输出。是将接收的值设置为一个全局变量。就像下面的这个例子:在这里,将所输入的值进行分解成个、十、百、千位,分别进行加密算法。

  加上与第四位对调,第三位与第二位对调。在最后输出结果。 第六版块:

  1、指针、指针变量的概念

  指针的基本概念 在计算机中,所有的数据都是存放在存储器中的。存储器中的一个字节称为一个内存单元, 不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,绍。为了正确地访问这些内存单元, 必须为每个内存单元编上号。存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。 并且在使用函数在输入

  除以8以后的余数,在将第一位 一般把 在第二章中已有详细的介 根据一个内

  既然在这里进行加密算法,每位上的数6

  根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。“指针变量”是指取值为地址的变量

  2、数组的指针

  一个数组是由连续的一块内存单元组成的。 数组名就是这块连续内存单元的首地址。一个数组也是由各个数组元素(下标变量) 组成的。每个数组元素按其类型不同占有几个连续的内存单元。 一个数组元素的首地址也是指它所占有的几个内存单元的首地址。 一个指针变量既可以指向一个数组,也可以指向一个数组元素, 可把数组名或第一个元素的地址赋予它。如要使指针变量指向第i个元素可以把i元素的首地址赋予它或把数组名加3、指向字符串的指针 返回指针的函数(1)、 字符串指针变量本身是一个变量,串本身是存放在以该首地址为首的一块连续的内存空间中并以‘结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。(2)、 对字符数组作初始化赋值,必须采用外部类型或静态类型,串指针变量则无此限制;

  (3)、对字符串指针方式 char *ps="C Language";ps="C Language";而对数组方式:static char st[]={"C Language"}char st[20]; st={"C Language"};而只能对字符数组的各元素逐个赋值。3、指针数组及指向指针的指针

  指针数组的说明与使用一个数组的元素值为指针则是指针数组。是一组有序的指针的集合。 指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。

  指针数组说明的一般形式为: 类型说明符在指针这一小节,主要是用指针实现:输入数对换,把最大的数与最后一个数对换。写3个函数:输入个数。

  在这里进行函数的调用,一个输入函数,一个操作函数,一个输出函数。

  i赋予它。

  而字符\0’作为串的

  而对字符可以写为: char *ps; 不能写为:

  指针数组*数组名[数组长度]

  10个整数,将其中最小的数与第一个

  10个数;进行处理;输出10

  用于存放字符串的首地址。在这里用数组实现了输入。

  在这里用指针实现了将最小的数与第一个数对换,

  把最大的数与最后一个数对换。

  在最后进行输出。 第七版块:

  实训七属于一个综合类型的题目,他要求的比较高,必须在自己王权理解通透了课本知识以后才有可能理解这道题,并且进行修改完善。主要这道题本身是在VC环境下运行的,将其移植到Turbo C环境下运行,这其中牵扯到一些语法不同,在Turbo C中不可以运行,要进行慢慢调试。经过不懈的努力、修改,终于将其成功的在Turbo C环境下可以正常运行了。(详见附录)

  五、结论 收获

  我的收获:在本次实习中,我学到了很多实际有用的东西,而且基本上都是在课本上学不到的,并且也在实习中梳理了自己对C语言这门课程所学的所有内容,让自己对C这门课程有了更进一步的认识,有了一个良好的基础,为自己的以后打下了坚实基础。从开头到现在,所有的内容实习完了,上机实验是学习程序设计语言必不可少的实践环节,在 C语言灵活、简洁中,更需要通过编程的实践来真正掌握它。

  历时4天的《C语言程序设计》已经结束了,在这几天编程的过程中感触颇多,实训编程的同时暴露出了许多我自身存在的问题,同时也对自身有了很大的提高。

  首先,对我以前做题做事非常马虎的毛病有了很大的改进,通过在这几天编程的过程中的锻炼,我现在做题比以前仔细多了,会小心翼翼地去看每一个地方,会仔细地检查程序的每一个字母、标点,以及每个可能出错的地方,更会特别仔细,生怕自己一不小心搞错了,而导致整个程序都无法运行。

  其次,在编程的过程当中弥补了我许多知识上的缺陷,弄清楚了我不懂的地方和似是而非的地方,使我及时补上了欠缺,为自己以后的人生道路打下了良好基础,同时也让我对每一件事都有了一个好的心态去对待它,更让自己在编写程序的过程中每时每刻都处于充足的状态。

  再次,通过几天综合实训编程使我的知识形成了一个完整的框架结构,而不再是零散的知识个体,使我在使用时更加的方便,更加灵活,以前有好多题目要写十行八行的,还有些地方弄得不是太懂,现在只需要五六行就可以搞定,而且还对于思路特别清晰、明确。

  第四,在实习结束后,我对做完的习题检查比再是一切的走马观花,而是仔细核对、认真检查,和以前相比明显改善了好多,以前自己对于检查程序总是没有耐心,不好好检查,有问题总是找老师,相对于实习之后来说,有了很大的改善,自己不但可以坐下来耐心检查,还能够自己将程序调试成功,这对于现在的我来说是一个明显的进步。

  第五,通过实习改变了我做题时心烦气燥的习惯,现在做题可以平和静气的完成。

  第六,通过实习我的自制能力更强了,基本完全可以控制自己,避免外界的干扰,安心地完成自己的工作。

  第七,在学习过程中,由于天气炎热,心里烦躁,同时也是每天都盯着频幕看,脑袋都看大了,但是我却一直坚持了下来,这对于我来说,也是一个非常好的习惯。这同时也是我的一个收获。

  第八,实训过程中,充分发挥团队协作精神,共同进步,帮助同学顺利完成实训课程,有困难一起解决,同时也使我在他们身上学到了很多东西。

  总之,通过实习使我自身的知识体系得到巩固、提高以及使团队工作的能力得到锻炼。

  不足

  我的不足:

  首先,我的第一个,同时也是一个最大的缺点,自己对于理论知识掌握的还不是很通透,理解的不够彻底,对于一些问题似似而非,给自己编写程序的过程中带来了很大的麻烦。

  其次,我不能够精心的去完成每一个程序,对于每个程序而言,都是马马虎虎,只要运行结果是对的,那就可以了。虽然我自己也知道这样是不好的,但是自己就是不愿意去改,在经过实习之后虽然有所改善,但在我看来,改进的不是很大。

  第三,自己做题时还有些马虎,一些小的细节在编写程序过程中不注意,只有在编译连接是才可以发现、对其进行修改,对于一些小程序还不能实现一次就可以完成编译连接。

  第四,做题时自己不能心平气和的去做。

  第五,自己的子宅里不够强,不能持之以恒的坐在自己的座位上编写程序,

  歇一会就要起来转转。

  六、致谢

  在此,我仅代表我自己,对老师您致以崇高的敬意和深深的感谢,没有您,就没有我那么多的收获,您不辞辛苦,在这炎热天气里,放弃您的休息时间来为我们辅导,在辅导过程中,您更是尽心尽力,从来没有少过一节课,更没有过迟到早退,对我们是全程陪同,在我们实习中随时出现问题,随时解决。只要发现问题,您从来没有说是不管过,从来没有烦躁过,对我们提出的问题,也是耐心解决,一边不懂,接着再讲一边,脸庞流下的汗水,您却从来没有在意过。对我们泥更是不计报酬的为我们服务,让我们有一个好的学习环境,不用为自己遇到问题而烦恼,在这里我想对您说一声:老师,您辛苦了!请接受您的学子的深深谢意与感激。

  在这里,也对学校表示由衷的谢意,感谢学校为我们提供了良好的实习环境,让我们在这炎热的天气里,能够舒爽的坐在教室里实习,而不用操心任何问题,在这里,对我们学校表示谢意。

  C语言见习报告三:

  1.课程设计目的

  了解基于C语言的软件开发基本过程与方法,熟悉结构化程序设计的基本方法,了解计算机工作模式,掌握开发一个小型实用系统的基本方法,学会调试一个较长程序的基本方法,养成良好的程序设计习惯和严谨的工作态度,初步获得应用编写C语言程序来解决实际问题的能力。

  2.问题需求分析

  根据题目要求,由于要录入、读取、保存学生成绩信息,因而要实现文件的输入和输出功能;要求用户可以查询各个学生的成绩,并且可以添加学生成绩信息等,因而要提供查找和添加功能;另外,还应提供键盘式选择菜单以实现功能选择。

  3.系统设计

  3.1数据结构

  由于该系统涉及多个学生的成绩存储,因此,定义一个数据结构,用于存储这些信息。现仅对学生英语成绩、数学成绩、C语言成绩进行统计管理。 建立以下数据结构:

  typedef struct student

  {

  int no; //存储学生学号 char name[MAX_NAME]; //存储学生姓名 double english; //存储学生英语成绩 double math; //存储学生数学成绩 double Programming; //存储学生C语言成绩 double mark_ave; //平均成绩 double mark_tot; //总成绩

  } STUDENT;

  3.2总体软件框架

  3.3程序模块设计

  将学生成绩管理系统划分为以下几个模块:

  1、显示菜单模块:用void paint()来实现

  2、输入初始的学生信息:输入信息包括学生的姓名、学号以及学生的成绩等相关信息;用函数void input(STUDENT *data, int *len)来实现此操作。

  3、成绩输出模块:输出学生的信息以及成绩,用函数void output(STUDENT *data, int len)来实现:通过学生的姓名来查看学生的相关成绩。

  4、排序模块:用函数void sort(STUDENT *data, int len)来实现

  5、成绩查询模块:用void find(STUDENT *data, int len) 来实现,找到就输出此学生全部信息。

  6、插入模块:用函数void insert(STUDENT *data, int *len)来实现,插入到合适的位置。

  7、保存文件:用函数void save(STUDENT *data, int len)来实现,将信息保存到文件中,再关闭文件。

  8、主函数:使用switch条件语句调用主菜单函数,选择菜单中要选择对象来执行不同的模块。

  4.编程实现

  4.1

  4.2将输入的所有学生成绩输出

  4.3成绩排序模块【流程图】

  4.4成绩查询模块:【流程图】

  4.5成绩插入模块

  4.6成绩保存模块

  将所有学生的成绩信息保存到成绩统计表.txt中

  4.7主函数【流程图】

  5.系统测试

  运行开始:

  选择1输入成绩:

  选择2输出成绩:

  选择3按平均分排序:

  选择4查找(输入学号1):

  选择5插入新数据:

  选择6保存:

  选择0退出

  6.实习总结

  课程设计是培养学生综合运用所学知识 ,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C语言又是最常见,功能最强大的一种高级语言,因此做好C语言课程设计是十分必要的。 回顾起此次课程设计,至今我们仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在这几天里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到许多问题,可以说得是困难重重。这毕竟是第一次做,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固。通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。 通过学习《C语言课程设计》使我了解到C语言是一门实践性很强的课程,以及C语言的基本语法规则.程序设计.以及解题的全过程,加深对C语言的了解,得到程序设计的基本方法和技巧的训练,从而更加深一步的对知识的了解,真正能使C语言这个强有力的编程工具去解决实际问题。

  7.附:关键源程序

  #include

  #include

  #include

  #define MAXN 35

  #define MAX_NAME 256

  typedef struct student //学生信息

  {

  int no;

  char name[MAX_NAME];

  double english;

  double math;

  double Programming;

  double mark_ave;

  double mark_tot;

  } STUDENT;

  /*---------------显示信息子程序------------*/

  void paint()

  {

  int i;

  system("cls");

  printf("%55s\n", "中国地质大学(武汉)学生成绩管理系统\n");

  for (i=0; i<80;i++)

  putchar('=');

  putchar('\n');

  printf(" 1 输入信息 2 输出信息\n");

  printf(" 3 按平均分排序 4 按学号查找\n");

  printf(" 5 插入 6 保存到文件\n");

  printf(" 0 退出\n");

  for (i=0;i<=79;i++)

  putchar('=');

  putchar('\n');

  printf("%s\n", "请输入各操作对应的序号:");

  }

  /*-----------输入信息子程序---------*/

  void input(STUDENT *data, int *len)

  {

  int no;

  putchar('\n');

  printf("%s\n", "请输入新的记录,如果需要退出当前菜单请输入-1.");

  printf("%s\n", "格式:\n");

  printf("%s\n", "学号 姓名 英语 数学 C语言");

  putchar('\n');

  scanf("%d", &no);

  while(no != -1)

  {

  data[*len].no = no;

  scanf("%s %lf %lf %lf", data[*len].name, &data[*len].english, &data[*len].math,&data[*len].Programming);

  data[*len].mark_ave=(data[*len].english+data[*len].math+data[*len].Programming)/3.0;

  data[*len].mark_tot=data[*len].english+data[*len].math+data[*len].Programming;

  (*len)++;

  scanf("%d", &no);

  }

  }

  /*---------------输出信息子程序---------------*/

  void output(STUDENT *data, int len)

  {

  int i;

  system("cls");

  printf("%8s", "学号");

  printf("%8s", "姓名");

  printf("%8s", "英语");

  printf("%8s", "数学");

  printf("%10s", "C语言");

  printf("%12s", "平均分");

  printf("%10s", "总分");

  putchar('\n');

  for (i =0; i < 80; i++)

  putchar('=');

  putchar('\n');

  for (i = 0; i< len; i++)

  {

  printf("%8d", data[i].no);

  printf("%8s", data[i].name);

  printf("%8.1lf", data[i].english);

  printf("%8.1lf", data[i].math);

  printf("%10.1lf", data[i].Programming);

  printf("%12.1lf", data[i].mark_ave);

  printf("%10.1lf", data[i].mark_tot);

  putchar('\n');

  }

  for (i =0; i < 80; i++)

  putchar('=');

  putchar('\n');

  printf("按回车键继续.");

  getchar(); /*存储enter*/ getchar(); /*存储输入内容*/ }

  /*--------------排序子程序------------*/

  void sort(STUDENT *data, int len)

  {

  int i,j,k;

  STUDENT temp;

  for (i=0; i

  {

  for (k=i, j=i+1; j

  if (data[k].mark_ave > data[j].mark_ave) k=j; if (k != i)

  {

  temp = data[i];

  data[i] = data[k];

www.fz173.com_c语言flag的用法。   data[k] = temp;

  }

  }

  printf("%s\n", "下面显示排序结果,如果需要退出当前菜单请输入 -1."); for(i=0;i

  {

  printf("%8d", data[i].no);

  printf("%8s", data[i].name);

  printf("%8.1lf", data[i].english);

  printf("%8.1lf", data[i].math);

  printf("%10.1lf", data[i].Programming);

  printf("%12.1lf", data[i].mark_ave);

  printf("%10.1lf", data[i].mark_tot);

  putchar('\n');

  }

  int no=1;

  while(no!=-1)

  {

  scanf("%d",&no);

  }

  }

  /*--------------------查找子程序-----------------------*/

  void find(STUDENT *data, int len)

  {

  int find_no, result;

  int i;

  int index=1;

  while(index==1)

  {

  result=0;

  printf("%s\n", "请输入需要查找的学生的学号,退出当前菜单请输入 -1.");

  scanf("%d", &find_no);

  if (find_no == -1) return; /*exit the fine sub program*/ while( data[result].no != find_no && result < len) result ++; if (result >= len )

  {

  printf("%s\n", "未查询到相关信息");

  index=1;

  continue;

  }

  else

  {

  system("cls");

  printf("%s\n", "查询信息如下:");

  for (i =0; i < 80; i++)

  putchar('=');

  putchar('\n');

  printf("%8s", "学号");

  printf("%8s", "姓名");

  printf("%8s", "英语");

  printf("%8s", "数学");

  printf("%10s", "C语言");

  printf("%12s", "平均分");

  printf("%10s", "总分");

  putchar('\n');

  printf("%8d", data[result].no);

  printf("%8s", data[result].name);

  printf("%8.1lf", data[result].english);

  printf("%8.1lf", data[result].math);

  printf("%10.1lf", data[result].Programming);

  printf("%12.1lf", data[result].mark_ave);

  printf("%10.1lf", data[result].mark_tot);

  putchar('\n');

  for (i =0; i < 80; i++)

  putchar('=');

  putchar('\n');

  index=1;

  continue;

  }

  index=0;

  }

  }

  /*-----------------插入子程序-------------*/

  void insert(STUDENT *data, int *len)

  {

  int no, pos;

  double english, math, Programming, mark_ave, mark_tot;

  int i;

  char name[MAX_NAME];

  while(1)

  {

  printf("%s\n", "输入新的记录,退出当前菜单请输入-1."); printf("%s\n", "格式:");

  printf("%s\n", " 学号 姓名 英语 数学 C语言"); scanf("%d", &no);

  if (no == -1) return; /*exit*/ data[*len].no = no;

  scanf("%s %lf %lf %lf", name, &english, &math, &Programming);

  mark_ave=(english+math+Programming)/3.0;

  mark_tot=english+math+Programming;

  pos = 0;

  while ((data[pos].mark_ave < mark_ave) && (pos < *len) ) pos ++;

  for (i = *len-1; i >= pos; i--)

  data[i+1] = data[i];

  data[pos].no = no;

  strcpy(data[pos].name, name);

  data[pos].english = english;

  data[pos].math = math;

  data[pos].Programming = Programming;

  data[pos].mark_ave = mark_ave;

  data[pos].mark_tot = mark_tot;

  (*len)++;

  }

  }

  void save(STUDENT *data, int len)//将数据保存到文件

  {

  int i;

  FILE *fp;

  fp=fopen("成绩统计表.txt","w");

  fprintf(fp,"%8s", "学号");

  fprintf(fp,"%8s", "姓名");

  fprintf(fp,"%8s", "英语");

  fprintf(fp,"%8s", "数学");

  fprintf(fp,"%10s", "C语言");

  fprintf(fp,"%12s", "平均分");

  fprintf(fp,"%10s\n", "总分");

  fprintf(fp,"========================================================================\n");

  putchar('\n');

  for (i = 0; i< len; i++)

  {

  fprintf(fp,"%8d", data[i].no);

  fprintf(fp,"%8s", data[i].name);

  fprintf(fp,"%8.1lf", data[i].english);

  fprintf(fp,"%8.1lf", data[i].math);

  fprintf(fp,"%10.1lf", data[i].Programming);

  fprintf(fp,"%12.1lf", data[i].mark_ave);

  fprintf(fp,"%10.1lf\n", data[i].mark_tot);

  }

  fprintf(fp,"========================================================================\n");

  fclose(fp);

  printf("文件已保存到\"成绩统计表.txt\"");

  getchar();

  getchar();

  }

  /*-----------主程序--------------*/

  void main()

  {

  STUDENT data[MAXN];

  int len = 0;

  char sele;

  paint();

  scanf("%c", &sele);

  while (sele != '0')

  {

  switch(sele)

  {

  case '1':

  input(data, &len);

  break;

  case '2':

  output(data, len);

  break;

  case '3':

  sort(data, len);

  break;

  case '4':

  find(data, len);

  break;

  case '5':

  insert(data, &len);

  break;

  case '6':

  save(data, len);

  break;

  default:

  if (sele != '\n') printf("%s\n", "

  break;

  }

  if (sele != '\n') paint();

  scanf("%c", &sele);

  } 输入错误!");

  }

【五】:浅谈C语言中循环结构的教学方法

摘  要  循环结构是结构化程序设计中的三种基本结构之一,也是程序设计的基础。但是,对于初学者来说,循环结构与人类日常的思维习惯不同,较难掌握。本文用几个例子阐述了在《C语言程序设计》课程中循环结构的教学方法,这些方法在日常授课中取得了较好的效果。      关键词  C语言;结构化程序设计;循环结构;效率  

【六】:1  引言

     顺序、分支、循环是结构化程序设计的三种基本结构,所以在高级语言程序设计课程中,掌握这三种结构是学好程序设计的基础。而循环结构是这三者中最复杂的一种结构,几乎所有的程序都离不开循环结构。在C语言中,循环结构主要是由for和while、do-while语句实现的,其中for语句的应用更为普遍一些。for语句的用法对于有程序设计经验的学生来说轻而易举,但是对于那些没有经验的初学者来说,难度却不小。本文从初学者的角度,阐述了C语言中循环结构几种典型应用的实现方法。

【七】:2  用循环结构输出几何图形

     输出简单的几何图形(如图1),是循环结构的典型应用之一。对于这一类型的题目,初学者往往直接采用一条或若干条输出语句printf完成,这样虽然可以完成题目要求,但是很显然缺乏灵活性,不符合程序设计的思想。按照正常的程序设计思想,应该先分析图形的构成,找出其中的规律:如图1(a)中的实心三角形,每一行由若干个空格、星号和一个回车换行符构成,将行号、空格数和星号数分别设为i、m和n,则可以形成下表:

 

表1  实心三角形的构成表

行号i 空格数m 星号数n
1 4 1
2 3 3
3 2 5
4 1 7
5 0 9
     分析表1,可以得出行号i与空格数m、星号数n如下的数学关系: m=5-i,n=2×i-1      则实心三角形的构成规律可以描述为:第i行由(5-i)个空格和(2×i-1)个星号和一个回车符构成。把行号i作为for语句的循环变量,输出图形程序的主要部分见程序段1。 采用上面的方法,可以使学生很容易编写出类似的程序,其中的关键在于让学生找出图形中行号与每一行的空格数以及星号数的关系(对于图1(b)、(c)需要把图形分成几个部分,再分析其中的构成规律),这需要学生数学方面的知识,非编程本身的范畴了。

for(i=1;i<=5;i++) { /*输出(5-i)个空格;*/ for(m=1;m<=5-i;m++)    printf(“ ”);   /*输出(2*i-1)个星号;*/ for(n=1;n<=2*i-1;n++)    printf(“*”);   /*输出回车符;*/ printf(“\n”); } 程序段1 实心三角形的主要程序

 3  数组中循环结构的应用

     在C语言中,for语句经常与数组相结合,用于实现数组元素的赋值、输入与输出。对于初学者来说,更习惯于用顺序结构的语句来实现(如图2左)。我们将图2左的几条语句作比较,可以看出在这5条语句中,不同的只有数组下标,那么就可以将这5条语句合并成一条for语句,将数组下标换成for语句的循环变量i,而i的值从0增加到 4。按照for语句的基本语法规则可以很容易的写出图2右的for语句。

同样,对于下面这个输出二维数组元素的例子,也可以用上述办法实现,不过转换过程比上例要复杂一些:经过对比图3左侧方框中顺序结构的12条语句,可以发现也是只有数组下标在变化,但是由于是二维数组,行下标和列下标同时都在变化,很显然不能直接用一条简单的for语句来实现(不是绝对不可以实现,后面将会看到)。但是我们可以把这12条语句细分一下,3条语句为一组,而在同一组中的语句只有列下标在变化,这时可以采用上例中的方法,将列下标都用循环变量j来代替,得到图3右上的形式。再次对比图3右上的4条for语句,不同的是行下标,同样用新的循环变量i来代替,合并后得到图3右下最终二重for循环的语句。

   

     在上例中,常规的思路都采用二重for循环与二维数组相结合来实现对数组元素的访问,实际上也可以使用一重for循环来实现:无论如何变化,我们可以先确定的是,输出语句printf肯定要执行12次,如果用一重for循环,那么循环变量i的值就要从0递增到11。再分析数组行下标m和列下标n与循环变量i之间的关系,很显然:i=m*3+n,按照整数除法的思想,行下标m恰好是循环变量i整除3后的商,而列下标n恰好是循环变量i整除3后的余数,即:

m=i/3,n=i%3 从而可以写出下面的for语句: for(i=0;i<12;i++) printf(“%d”,a[i/3][i%3]);

【八】:4  循环结构中的效率问题

     对于程序设计的初学者来说,往往以完成题目要求的功能为目的,程序的执行效率是最容易忽略的一个问题。在循环结构中,具体表现为循环体的执行次数。例如,一个经典的素数判定问题。在数学中素数如下定义:素数即指那些大于1,且除了1和它本身外,不能被其它任何数整除的数。根据这一定义,初学者很容易编写出如下程序段2的程序:

int isprime(int n) { int i; for(i=2;i<n;i++)     if(n%i==0) return 0; return 1; } 程序段2 判断素数的程序段
      上面的程序,完全可以实现题目要求的功能,初学者往往满足于此。但是当对for循环的执行次数进行分析时,我们发现:当n不是素数时,没有任何问题;而当 n是素数时,循环体就要执行(n-2)次,而实际上是不需要这么多次的。根据数学的知识,可以将次数降为n/2或n的算术平方根,这样可以大大减少循环体的执行次数,提高程序的效率。

程序的执行效率是编程中时刻需要考虑的问题,也是程序设计中的基本要求。这需要许多算法方面的知识,对于初学者来说,要求可能过高,但是我们在讲授过程中要注意向学生灌输这种思想,从学习之初就要打下良好的基础,尤其是类似上面例子中这样显而易见的情况,可以提醒学生在编制完一道程序以后,检验一下,是否还有可优化的地方,这对以后进一步高级编程的学习都是必要的。

【九】:5  结束语

     以上这些,都是本人在授课过程中的一些体会,可能比较肤浅,但是从初学者的角度来看,却是必要的。如何让一名初学者尽快摆脱日常的思维定式,更加透彻地理解和掌握程序设计中的基本思想,领会程序设计的精髓,是高级语言程序设计这门课程在讲授过程中,应该时刻注意的问题。希望本文能在这方面起到一点作用,同时望广大同仁多多指教。

【十】:参考文献

[1] 谭浩强. C 语言程序设计(第二版)[M]. 北京:清华大学出版社,1999 [2] 苏运霖译. 计算机程序设计艺术第1 卷 基本算法[M]. 北京:国防工业出版社,2002

c语言flag的用法由173资源网(www.fz173.com)收集整理,转载请注明出处!原文地址http://www.fz173.com/shuoshuo/4652.html

文章评论
Copyright © 2006 - 2016 www.fz173.com All Rights Reserved
173资源网 版权所有