for (j?0; j?4; j??)
printf(??5d?, *(*(p?i)?j)); /* 计算变量的指针并输出变量的值 */
free(p); }
其中,语句1的作用是利用malloc()函数动态分配两个用来存储指针的存储单元,并将第一个存储单元的指针赋给变量p,这样p和p?1就分别指向了这两个单元;语句2的作用是给malloc()函数所分配的两个存储单元(分别是p和p?1所指向的存储单元)赋值,赋值后它们分别指向a[0][0]和a[1][0]数组元素。如下图所示:
*a p p+1
a[0][0] a[0][1] a[0][2] a[0][3] *a *(a+1) *(a+1) p malloc()函数分配的2个 a[1][0] a[1][1] a[1][2] a[1][3] 存储指针的存储单元
数组a所分配的存储单元
实验九 结构体、共用体及位运算
1.目的及要求
(1) 掌握结构体、共用体类型变量的定义和使用。 (2) 掌握结构体类型数组的定义及应用。
(3) 掌握位运算、位段的基本概念,学习使用位运算符。 (4) 学习掌握利用位运算来实现对某些位的操作。 2.实验内容
(1) 以下是输出结构体数组各元素值的程序。输出时分别采用了数组下标的访问方式和指针访问方式,上机调试该程序,分析这两种方式的异同。
#include ?stdio.h? void main() {
struct node {
char s[6]; int i; } n[4], *p; int k; p?n;
strcpy(n[0].s, ?one?); n[0].i?1; strcpy(n[1].s, ?two?); n[1].i?2; strcpy(n[2].s, ?three?); n[2].i?3; strcpy(n[3].s, ?four?); n[3].i?4; printf(?\\nOutput 1: \\n?); for (k?0; k?4; k??)
printf(??s_?d?s?, n[k].s, n[k].i, k<3??--??:??); printf(?\\n\\nOutput 2: \\n?);
? 312 ?
for (k?0; k?4; k??, p??)
printf(??s_?d?s?, p-?s, p-?i, k<3??--??:??);
}
(2) 输入并运行例9.3、9.4、9.5和9.6。
(3) 编写习题9.1、9.2、9.3和9.4的程序,并上机调试。 (4) 有程序如下: #include ?stdio.h? void main() {
int x, i, bin[16];
printf(?\\nEnter a number: ?); scanf(??d?, &x); printf(?\\nThe binary is: ?); for (i?0; i?16; i??) {
/* 从右到左将该数的每一位分离出来,并保存到数组bin中 */ bin[i]?(x&&0x0001);
x???1; /* 进行右移位操作 */ }
for (i?15; i??0; i??)
printf(??d?, bin[i]);
}
该程序输入一个十进制整数,通过位操作处理后,输出它对应的二进制补码。 思考:若将上程序中的右移位操作改为左移位操作,该如何编写此程序?请上机完成该程序的编写。
(5) 输入并运行例11.1。
(6) 编写程序,实现将一个十进制整数对应的二进制数的原码输出。
实验十 文 件 操 作
1.目的及要求
(1) 掌握缓冲文件和非缓冲文件系统及文件指针的基本概念。 (2) 掌握文件的打开、关闭、读、写等操作的函数。 (3) 学会使用缓冲文件进行文件操作。 2.实验内容
(1) 下面的程序输入源文件和目标文件的名称,实现对文件的拷贝功能。在横线上填入正确的表达式后上机调试通过。
#include ?stdio.h? void main() {
char sname[20], tname[20], ch; FILE *fp1, *fp2; printf(?\\nenter source: ?);
scanf(??s?, sname);
? 313 ?
printf(?\\nenter target: ?); scanf(??s?, tname);
if ((fp1?fopen(sname, ?rb?))??NULL) {
printf(?source file open error! \\n?); exit(0); }
if ((fp2?fopen(tname, ?wb?))??NULL) { printf(?target file open error! \\n?); exit(0); }
ch?getc(fp1);
while (!feof(fp1)) { fputc(__________);
ch?getc(_____); }
fclose(fp1); fclose(fp2); }
(2) 有程序如下:
#include ?stdio.h?
void main(int argc, char *argv[]) {
FILE *s; char c;
if ((s?fopen(argv[1], ?r?))??NULL) {
printf(?\\ncannot open file! \\n?); exit(0); }
while ((c?getc(s))!?EOF)
putchar(c); fclose(s); }
该程序采用命令行参数形式来运行,它模拟DOS方式下的type命令显示文件内容。请编译该程序后在DOS提示符下运行得到的EXE文件。
(3) 分析总结以上两程序,编写模拟DOS下copy命令的程序(要求用命令行参数形式)。 (4) 下面的这个程序以ASCII和十六制形式显示任意类型文件的内容。每次显示文件的128个字节,并可前后移动。输出形式同DEBUG工具中的D命令相似。当在每个段输入的提示下输入?1时,退出程序。上机调试运行此程序。
#include ?ctype.h? #include ?stdio.h?
unsigned char buffer[128]; /* 定义输出函数 */
? 314 ?
void display(int num) {
int i, j;
for (i?0; i?num/16; i??) {
for (j?0; j?16; j??) /* 十六进制形式输出 */
printf(??3x?, buffer[i*16?j]);
printf(? ?);
for (j?0; j?16; j??) /* ASCII形式输出 */
if (isprint(buffer[i*16?j])) printf(??c?, buffer[i*16?j]); else printf(?.?); printf(?\\n?); } }
void main() {
FILE *fp; char name[20]; int sec, num;
printf(?\\nInput a file name: ?);
scanf(??s?, name); /* 输入要观看的文件名 */ if ((fp?fopen(name, ?rb?))??NULL) {
printf(?\\nconnot open file! ?); exit(0); } for (; ;) {
printf(?\\nEnter ?1 quit: ?); scanf(??d?, &sec); if (sec???1) break;
if (fseek(fp, sec*128, SEEK_SET)) // 移动文件指针到段的启始位置
printf(?\\nSeek error! ?);
num?fread(buffer, 1, 128, fp); // 读文件的内容并返回读到的字符个数 display(num); // 调用函数显示读到内存中的数据 if (num!?128) {
printf(?\\nEnd file! \\n?); getch(); break; } } }
(5) 下面的程序是将屏幕上格式输出的内容同样输出到一个文本文件(名为student.txt)中。试上机调试运行,成功运行后,退到DOS状态下查看是否存在该文本文件,并用type命令显示其内容。
#include ?stdio.h??#include ?conio.h?
? 315 ?
typedef struct {
char name[8]; int age; } STUDENT;
void tofile (STUDENT *stud) {
int i; FILE *fp;
if ((fp?fopen(?student.txt?, ?wt?))??NULL) {
printf(?\\nconnot create file! ?); exit(0); }
for (i?0; i?5; i??) {
fprintf(fp, ?\\nNO.?d student?s message: ?, i?1); fprintf(fp, ?\\nname is: ?s?, stud[i].name); fprintf(fp, ?\\tage is: ?d\\n?, stud[i].age); } fclose(fp); }
void main() {
STUDENT stud[5]; int i; clrscr();
for (i?0; i?5; i??) {
printf(?\\nPlease input NO.?d student?s message: \\n?, i?1); printf(?name is: ?); scanf(??s?, &stud[i].name); printf(?age is: ?); scanf(??d?, &stud[i].age); }
for (i?0; i?5; i??) {
printf(?\\nNO.?d student?s message: ?, i?1); printf(?\\nname is: ?s?, stud[i].name); printf(?\\tage is: ?d\\n?, stud[i].age); }
tofile(stud); }
(6) 输入并运行例14.3、14.6。
? 316 ?