1.strcpy函数
在C语言中strcpy()函数会将字符串2(包括字符串结束字符/0)的函数覆盖到字符串1,如果字符串1没有足够的空间容纳字符串会导致缓冲溢出的错误
例题:程序设计
规定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:使字符串最前面连续的*号不得多于n个;若多于n个,则删除多余的*号;若少于或等于n个,则什么也不做,字符串中间和尾部的*号不删除。例如,字符串中的内容为:*******A*BC*DEF*G****,若n的值为4,删除后,字符串中的内容应当是:****A*BC*DEF*G****;若n的值为8,则字符串中的内容仍为:*******A*BC*DEF*G****。n的值在主函数中输入。在编写函数时,不得使用C语言提供的字符串函数。注意:部分源程序存在文件progl.c中。请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio.h>
void fun( char *a, int n )
{
/* 以下代码仅供参考 */
int i=0,j,k=0;
while(a[k]=='*') k++; /* k为统计*字符个数 */
if(k>n)
{
i=n;j=k;
/* 以下完成将下标为k至串尾的字符前移k-n个位置 */
}
}
main()
{ char s[81]; int n;void NONO ();
printf("Enter a string:\n");gets(s);
printf("Enter n : ");scanf("%d",&n);
fun( s,n );
printf("The string after deleted:\n");puts(s);
NONO();
getchar();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i, n ; char s[81] ;
in = fopen("..\\..\\in.dat","r") ;
out = fopen("..\\..\\out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%s", s) ;
fscanf(in, "%d", &n) ;
fun(s,n) ;
fprintf(out, "%s\n", s) ;
}
fclose(in) ;
fclose(out) ;
}
答案
#include <stdio.h>
void fun( char *a, int n )
{
/* 以下代码仅供参考 */
int i=0,j,k=0;
while(a[k]=='*') k++; /* k为统计*字符个数 */
if(k>n)
{
i=n;j=k;
/* 以下完成将下标为k至串尾的字符前移k-n个位置 */
strcpy(&a[0],&a[k-n]);
}
}
main()
{ char s[81]; int n;void NONO ();
printf("Enter a string:\n");gets(s);
printf("Enter n : ");scanf("%d",&n);
fun( s,n );
printf("The string after deleted:\n");puts(s);
NONO();
getchar();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i, n ; char s[81] ;
in = fopen("..\\..\\in.dat","r") ;
out = fopen("..\\..\\out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%s", s) ;
fscanf(in, "%d", &n) ;
fun(s,n) ;
fprintf(out, "%s\n", s) ;
}
fclose(in) ;
fclose(out) ;
}
2.结构图的深度、宽度、最大扇入数、最大扇出数
-
深度指的是结构图自顶向下计算的层数,也就是模块的层数。它反映了系统的层次结构,深度较小的结构通常意味着系统较为简单,易于理解和维护。
-
宽度指的是一层中最大的模块个数,也就是同一层中模块的总个数的最大值。宽度较大的结构可能意味着系统功能较为分散,需要更好的协调和管理。
-
最大扇入数是指一个模块直接上属模块的个数,即调用某个模块的模块个数,也就是模块头顶上的连接数。它反映了模块之间的依赖关系,较大的扇入数可能意味着该模块依赖于较多的其他模块,增加了系统的复杂性。(最多引入的线)
-
最大扇出数则指一个模块直接下属模块的个数,也就是一个模块输出线条的最大数目。它表示一个模块对其他模块的控制或影响程度,扇出数较大的模块可能是系统的关键部分,对系统的运行有着重要的影响。(最多引出的线)
例题
某系统结构图如下所示,他的深度、宽度、最大扇出数、最大扇入数分别是多少
深度为3
宽度为3
最大扇出数为(某系统)
最大扇入数为3(功能n.1)
3.malloc函数
~是C语言中用于动态分配内存的函数。他的主要功能是提供指定的字节数分配内存,并返回指向该内存块的指针
在使用malloc函数之前一定要计算字节数,malloc开辟的是用户所需求的字节数大小的空间,在开辟一段空间之后,系统会在这段空间之前做一个标记(0或1),如果标记为1则表明此空间正在被使用
malloc函数返回的是一个无类型指针,必须在前面加上指针类型强制转换才可以使用
指针自身=(指针类型*)malloc(sizeof(指针类型)*内存空间)
4.front和rear
front(队头指针)
rear(队尾指针)
当对头和队尾指针指向同一个元素的时候,队列为空或者队列为满
例题:
循环队列的存储空间为Q(1:100),初始状态为front=rear=100。经过一系列正常的入队与退队操作后,front=rear=99,则循环队列中的元素个数为()。
A.0或100
B.1
C.2
D.99
答案A
5.数据库系统的基本特点
数据库技术是在文件系统基础上发展产生的,两者都是以数据文件的形式组织数据,但是数据库系统在文件系统之上加入了DAMS(数据库管理系统)对数据库进行管理,从而使得数据库系统具有一下特点:
数据的继承性;数据的高共享性和低冗余性;数据独立性;数据统一管理与控制
例题
下列叙述中正确的是()。
A.数据库系统可以减少数据冗余和增强数据独立性,而文件系统不能
B.数据库系统能够管理各种类型的文件,而文件系统只能管理程序文件
C.数据库系统可以管理庞大的数据量,而文件系统管理的数据量较少
D.以上选项都不正确
选择A
6.在关系数据库设计中,关系模式设计属于逻辑设计
数据库的逻辑设计主要工作是将E-R图装换成RDBMS中的关系模式。所以关系模式属于逻辑设计
在关系数据库设计中,关系模式设计属于()。
A.需求分析
B.概念设计
C.物理设计
D.逻辑设计
选择D
7.
在关系数据库中,投影(Projection)和选择(Selection)是两种基本的关系代数操作,用于从已有的关系(表)中获取信息。
-
投影(Projection)操作:
- 投影操作使用符号 π 表示。
- 它的作用是从关系中选择出某些列(属性),生成一个新的关系,这个新关系只包含这些选定的列。
- 投影操作可以去掉重复的行,因为关系中的每个元组(行)都是唯一的。
-
选择(Selection)操作:
- 选择操作使用符号 σ 表示。
- 它的作用是从关系中选择出满足特定条件的行(元组)。
- 选择操作不会改变原有行的顺序,也不会去掉重复的行。
-
连接(Join)操作:
符号:⨝
功能:基于共同属性将两个关系结合起来。通常分为内连接(Natural Join, θ-Join)和外连接(Outer Join)
内连接(Inner Join):
内连接返回两个表中匹配连接条件的行。只有当两个表中都有匹配的行时,结果表中才会包含这些行。内连接是最常用的连接类型。
外连接(Outer Join):
外连接返回至少一个表中满足连接条件的所有行,即使另一个表中没有匹配的行。外连接分为左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join)。
左外连接返回左表的所有行,即使右表中没有匹配的行;右外连接则相反;全外连接返回两个表中的所有行。
逻辑或(OR):
符号:∨ 或者 ||
功能:当两个条件中的至少一个为真时,结果为真。
逻辑与(AND)
符号:^
功能:当两个条件中都为真,结果为真
逻辑非(NOT):
符号:¬
功能:反转条件的真值,如果条件为真,则结果为假;如果条件为假,则结果为真。
逻辑异或(XOR):
符号:⊕
功能:当两个条件中的一个为真,另一个为假时,结果为真;如果两个条件都为真或都为假,结果为假。
例题
表示学生选修课程的关系模式是SC(S#,C#,G),其中S#为学号,C#为课程号,G为成绩,检索选修了课程号为2的课且成绩不及格的学生学号的表达式是()。
A.σc#=2^G<60(SC)
B.σG<60(SC)
Cσs#(σc#=2^G<60(SC)
D.πs#(σc#=2(SC))
答案:由题可知显示符合条件的学生学号(S#),首先用到投影操作排除D,其次是两边条件都为真,逻辑与^所以选择C
答案:本题检索的是病人姓名Pn,故B、D选项错误。检索在1号医生处就诊的男性病人姓名,选项C中未筛选病人性别,故选项C错误。所以本题答案为A。
8.结构体的应用
在C语言中使用struct关键字定义结构体,并指定结构体的名称和成员变量
使用“.”运算符用来访问结构体变量
例题
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
struct stu
{
char *name,gender;
int score;
}
main()
{
stu a={NULL,'m',290} ,b;
a.name=(char *)malloc(10) ;
strcpy (a.name,"Zhao"); //strcpy复制字符串函数,将字符串"zhao"复制给a.name
b=a;
b.gender='f';
b.score=350;
printf("%s,%c, %d,", a.name, a. gender, a.score);
printf("%s,%c, %d\n", b.name, b.gender, b.score) ;
}
这段程序的运行结果是什么?
答案:Zhao,m,290,Zhao,f,250
9.malloc函数
这个函数向内存申请一个连续可用的空间,并返回指向这块空间的指针。
如果开辟成功,则返回一个指向开辟好空间的指针。
如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
返回值的类型是void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由使用者自己决定。
如果size为0,malloc的行为是标准还是未定义的,由编译器决定。
malloc申请的空间,当程序退出时,要还给操作系统,当程序不退出,动态申请的内存,不会主动释放,需要用free函数来释放。
malloc申请到空间后,直接返回这个空间的首地址,不会初始化空间的内容
malloc开辟的空间具有独立性,如果给一个变量使用malloc开辟空间后,赋值不会影响到这个变量之前的值
例题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct stu //typedef可以为已知关键字、未知数据类型、函数指针取别名
{
char *name,gender;
int score;
}STU;//别名
void f(char*p)
{
p=(char*)malloc(10);
strcpy(p,"Qian");
}
main()
{
STU a={NULL,'m",290},b;
a.name=(char*)malloc(10);
strcpy ( a.name,"Zhao");
b=a;
f(b.name);
b.gender= 'f'; b.score = 350;
printf("%s,%c, %d,",a. name,a.gender,a.score);
printf("%s,%c,%d\n",b.name,b.gender,b.score) ;
}
程序结果?
Zhao,m,290,Zhao,f,350
10.
在C语言中并不存在平方运算符
"^"是异或运算符。“安慰异或”运算的规则是两个运算数中相对应的二进制位上,如果相同位0,不同为1
在C语言中使用pow()函数进行计算任意次方,pow(x,2)==x^2
使用sqrt进行开方运算sqrt(4)=2
#include<stdio.h>
main()
{
int c;
c=10^5;
printf("%d\n",c);
}
输出结果?
15
11. 文件操作
(1)file是一个系统定义的结构体类型。通过使用 FILE
类型的指针,程序可以对文件进行打开、读取、写入和关闭等操作。
FILE *fp = fopen("example.txt", "r");
(2)fopen函数用于打开文件并返回一个指向给文件的指针,以便后续对该文件进行读写操作
fopen(文件名称,文件打开格式)
- 如果文件位于当前目录下,并且你知道它的扩展名是.txt,你可以这样写:
fopen("example", "r");
- 如果文件不在当前目录下,你需要提供完整的路径和扩展名:
fopen("/path/to/file/data.txt", "r");
常见的文件打开方式包括:
r:只读方式(文件必须存在)
w:写入方式(文件存在清空之前的内容,不存在新建一个)
a:追加方式(文件存在在尾部追加,不存在新建文件)
r+:读写方式(文件必须存在)
w+:读写方式(存在清空文件内容,不存在新建文件)
a+:读写方式(文件存在在末尾追加,不存在新建文件)
文件成功打开返回一个指向file类型的指针,以便后续操作
(3)fseek函数
用于移动文件指针到指定位置,主要用于改写文件内部的位置
fseek(指向文件流的指针,偏移量,偏移位置)
偏移位置: SEEK_SET:文件头开始偏移
SEEK_CUR:当前位置开始偏移
SEEK_END:文件尾开始偏移
int fseek(FILE *stream(指针), long offset(偏移量),int whence(基准位置));
- 如果偏移量超出文件范围,例如正向偏移超过文件末尾或反向偏移超过文件开始位置,函数仍然会返回0,但不会改变文件指针的实际位置。
- 成功调用fseek函数时返回值为0;如果失败则返回非零值,并可能设置错误指示符。
(4)fscanf函数
fscanf(FILE *stream,const char *format,……)
stream为要读取文件的指针,format指定数据格式,省略号表示一系列变量
(5)rewind函数
该函数接受一个参数stream
,即指向已打开文件的指针。调用此函数后,文件指针会从当前位置移动到文件的开头,并清除与文件流相关的错误和eof标志。
(6)fprint函数
fprintf(FILE *stream,const char *format,……);
stream指向要写入数据的流
format:格式控制字符串
……:后续的可变参数
(7)fcolse函数
fclose(FILE *stream)
stream指向要关闭的流
成功关闭返回值为0;如果失败,则返回 EOF(-1)
例题
#include<stdio.h>
main()
{
FILE*fp;
int i,a[6]={1,2,3,4,5,6},k;
fp = fopen("data.dat","w+");
for (i=0; i<6; i++)
{
fseek(fp,OL, 0);fprintf(fp,"%d\n", a[i]);
}
rewind(fp);
fscanf(fp,"%d",&k);
fclose(fp);
printf("%d\n", k);
}
输出结果:
答案:6
12.在C语言中首先执行的一定是main()函数
13.一维数组的名字就是首元素的地址
#include<stdio.h>
int main()
{
char S[]="abcdefg"
char* p = s;
printf ("%s\n",p+1);
return 0;
}
输出bcdefg
如果是printf(“%s\n”,p)则输出abcdefg
14指针
例题1
#include<stdio.h>
int main()
{
char S[]="abcdefg"
char* p = s;
char* q = s[6]
printf ("%s\n",q-p);
return 0;
}
/*a b c d e f g
0 1 2 3 4 5 6
q-p==6-0
输出6*/
例题2
#include<stdio.h>
int main()
{
char S[]="abcdefg"
char* p = s;
//s++;和p++的区别
return 0;
}
s++是错误的,因为s是常量不能进行运算
例题3
#include<stdio.h>
int main()
{
char S[]="abcdefg"
char* p = "abcdefg"
printf("%s\n",s[]);
printf("%s\n",p);
return 0;
}
输出都会输出abcdefg,它们的区别在于s指向的是整个数组;而p存放的是整个数组的地址(是一个字符串常量)
例题4
#include<stdio.h>
void fun (char p[])//在这里p[]和*p是完全相同的,且p[]可以进行p++运算,因为他作为一个形参就不是数组名了
{
p++;
*p='w';
}
int main()
{
char s[] ="asdf"
fun(s) ;
printf("%s\n",s) ;
}
无论是什么类型的指针都占据4个字节
例题5
#include<stdio.h>
void fun (char p[])
{
printf("%d\n",sizeof(p[])/sizeof(p[0]))
}
int main()
{
char s[] ="asdf"
fun(s) ;
}
输出结果是4,因为sizeof(p[])的值为4
15.二级指针
二级指针用于存放一级指针的地址
16.EOF标志
EOF作为文件结束的标志,但是文件必须是文本文件。EOF的值是1
17.结构体变量成员的引用
如果已经定义了一个结构体变量和基类型是同一种结构类型的指针变量,并且可以让该指针指向同类型的变量可以:结构体变量.成员名 指针变量名->成员名 (*指针变量名).成员名
以上三种来引用结构体变量中的成员
例题
设有以下程序段
struct person
{
har name[10];
char sex;
float weight;
}
zhangsan,*ptr;
ptr=&zhangsan;
若要从键盘读入姓名给结构体变量zhangsan的name成员,输入项错误的是()
A. scanf("%s", zhangsan->name);
B. scanf("%s",zhangsan. name);
C. scanf("%s", ptr->name);)
D.scanf("%s",(*ptr). name);
选择A
18.一条C语言语句可能会被转换成0条、1条或多条
19.编译器会忽略多余的分号
#include<stdio.h>
main()
int a = 0, b = 0, c = 0, d;
c = (a += b,, b += a); //第四行
d = c;; //第五行
; //第六行
;printf("%d,%d,%d\n", a, b, c); //第七行
return 0;
}
编译时出现错误的是第几行?
答案:4
标签:文件,计算机,int,函数,疑难,char,printf,C语言,指针 From: https://blog.csdn.net/2302_76586717/article/details/141942392