一 知识点
宏定义是指用一个宏名(名字)来代表一个字符串。宏定义的功能是在编译预处理时,对程序中所有出现的"宏名"都用宏定义中的字符串去代换,这称为"宏代换"或"宏展开"。无参宏定义的一般格式:#define 标识符 语言符号字符串,其中:“define”为宏定义命令;“标识符”为所定义的宏名,通常用大写字母表示,以便于与变量区别;“语言符号字符串”可以是常数、表达式、格式串(格式串是用双引号括起来的字符串)等,
宽度和位数
%6.2f表示输出6位宽度,2位小数,所以被截取的小数位:0.006四舍五入,结果为123.46;%3.0f表示输出3位宽度,0位小数
以二进制方式向文件读写一组数据
fread(buffer,size,count,fp)
fwrite(buffer,size,count,fp)
buffer 是一个地址,对fread来说,他是用来存放从文件读入的数据存储区的地址
size表示要读写的字节数
count 要读写多少个数据项
fp:file类型的指针
scanf函数
在scanf()函数的格式字符前可以加入一个正整数指定输入数据所占的宽度,但不可以对实数指定小数位的宽度。
scanf函数有返回值,其值就是本次调用scanf函数时正确读入的数据项个数
scanf函数从输入字符流中按照格式控制指定的格式解析出相应数据,送到指定地址中
在scanf函数中的格式控制字符串不会输出到屏幕上
非空线性结构应满足的2个条件
1 有且只有一个根节点
2 每个节点最多有一个前件,也最多有一个后件
数据库
第一范式
要求数据库表的每一列都是不可分割的基本数据项,即每个属性都是原子的,不可再分,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性
特点 确保表中的字段值都是单一的,不可再分
表中不存在重复列
表中每一行值包含一个实例的信息
第二范式
第二范式是在第一范式的基础上建立起来的,它要求数据库表中的每个非主键属性完全依赖于整个主键,而不是仅仅依赖于主键的一部分
特点 表必须满足1NF
表的非主键列必须完全依赖于主键,而不是部分依赖于主键
消除部分依赖,减少数据冗余和更新异常
第三范式
含义及特点
第三范式是在第二范式的基础上进一步规范化,他要求一个数据库表中不包含已在其他表中已包含的非主关键字信息。即,每个非主属性都不依赖于其他非主属性
表 必须满足2NF
表的非主键列不能依赖于其他非主键列
消除传递依赖,进一步将减少数据冗余
主键和非主键
部分依赖和完全依赖
部分依赖
部分依赖指的是一个非主键属性或属性集合依赖于主键的一部分,而不是整个主键。在关系数据库中,如果一个非主键属性只依赖于主键的某个子集,而不是整个主键,那么就存在部分依赖。这种依赖关系是不理想的,因为它可能导致数据重复和更新异常。例如,在一个学生选课表中,如果主键是学生ID和课程ID的组合,而教师姓名只依赖于课程ID而不依赖于学生ID,那么教师姓名就部分依赖于主键,这可能导致数据重复和更新困难。
完全依赖
完全依赖则是指一个非主键属性或属性集合完全依赖于整个主键。在关系数据库中,如果非主键属性仅由主键的唯一组合决定,且不存在部分依赖的情况,那么就称该属性完全依赖于主键。这种依赖关系有助于确保数据的完整性和一致性。例如,在一个学生信息表中,如果主键是学号,而姓名、年龄等属性都完全依赖于学号,那么这些属性就完全依赖于主键。
fabs函数 double floor(double x) 求x的绝对值
#include <stdio.h>
void fun(char *a,char b)
{ while(*(a++)!='\0');
while(*(a-1)<b) *(a--)=*(a-1);
*(a--)=b;
}
main()
{ char s[8]="pmfc",c;
c=getchar( );
fun(s,c);
puts(s);
}
数据流图(DFD)的作用是( )。
A 描述软件系统的控制流
B 支持软件系统功能建模
C 支持软件系统的面向对象分析
D 描述软件系统的数据结构
解题思路:数据流图是系统逻辑模型的图形表示,从数据传递和加工的角度,来刻画数据流从输入到输出的移动变化过程,它直接支持系统的功能建模。所以本题应选B选项。
二 选择题
#include <stdio.h>
main()
{
char *s="120119110";
int n0,n1,n2,nn,i;
n0=n1=n2=nn=i=0;
do{
switch(s[i++])
{ default : nn++;
case '0' : n0++;
case '1' : n1++;
case '2' : n2++;
}
} while(s[i]);
printf("n0=%d,n1=%d,n2=%d,nn=%d\n",n0,n1,n2,nn);
}
程序的运行结果是A n0=3,n1=8,n2=9,nn=1
B n0=2,n1=5,n2=1,nn=1
C n0=2,n1=7,n2=10,nn=1
D n0=4,n1=8,n2=9,nn=1
解析:
#include <stdio.h>
int disp(char* str)
{
while (*str) putchar(*str++);
return *str;
}
main()
{
printf("%d\n", disp("NAME"));
}
程序运行后的输出结果是 AA NAME0
B NAMEE
C NAME
D NAME\0
以下关于C语言函数参数传递方式的叙述正确的是
A 数据只能从实参单向传递给形参
B 数据可以在实参和形参之间双向传递
C 数据只能从形参单向传递给实参
D C语言的函数参数既可以从实参单向传递给形参,也可以在实参和形参之间双向传递,可视情况选择使用
#include <stdio.h>
void f(int x[], int n)
{
if ( n> 1)
{ f(&x[1], n-1);
printf("%d,", x[0]);
}
else
printf("%d,", x[0]);
}
main()
{
int z[6] = {1,2,3,4,5,6};
f(z,6);
printf("\n");
}
#include <stdio.h>
int *f(int *s)
{ s+=2;
s[1] +=6;
*s=7;
return s;
}
main( )
{ int a[5]={1,2,3,4,5}, *p=a;
p= f(p);
printf("%d,%d,%d,%d", a[0], a[1], *p,p[1]);
}
程序执行后的输出结果是()
<九>
三 填空题 修改 程序设计
使用VC++2010打开考生文件夹下blank1中的解决方案。此解决方案的项目中包含一个源程序文件blank1.c。在此程序中,函数fun的功能是:在带头结点的单向链表中,查找数据域中值为ch的结点。找到后通过函数值返回该结点在链表中所处的顺序号;若不存在值为ch的结点,函数返回0值。
请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
注意:部分源程序在文件blank1.c中。
不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <stdlib.h>
#define N 8
typedef struct list
{ int data;
struct list *next;
} SLIST;
SLIST *creatlist(char *);
void outlist(SLIST *);
int fun( SLIST *h, char ch)
{ SLIST *p; int n=0;
p=h->next;
/**********found**********/
while(p!=NULL)
{ n++;
/**********found**********/
if (p->data==ch) return n;
else p=p->next;
}
return 0;
}
void main()
{ SLIST *head; int k; char ch;
char a[N]={'m','p','g','a','w','x','r','d'};
head=creatlist(a);
outlist(head);
printf("Enter a letter:");
scanf("%c",&ch);
/**********found**********/
k=fun(head,ch);
if (k==0) printf("\nNot found!\n");
else printf("The sequence number is : %d\n",k);
}
SLIST *creatlist(char *a)
{ SLIST *h,*p,*q; int i;
h=p=(SLIST *)malloc(sizeof(SLIST));
for(i=0; i<N; i++)
{ q=(SLIST *)malloc(sizeof(SLIST));
q->data=a[i]; p->next=q; p=q;
}
p->next=0;
return h;
}
void outlist(SLIST *h)
{ SLIST *p;
p=h->next;
if (p==NULL) printf("\nThe list is NULL!\n");
else
{ printf("\nHead");
do
{ printf("->%c",p->data); p=p->next; }
while(p!=NULL);
printf("->End\n");
}
}
使用VC++2010打开考生文件夹下blank1中的解决方案。此解决方案的项目中包含一个源程序文件blank1.c。在此程序中,函数fun的功能是:把形参a所指数组中的偶数按原顺序依次存放到a[0]、a[1]、a[2]…中,把奇数从数组中删除,偶数的个数通过函数值返回。
例如,若a所指数组中的数据最初排列为:9,1,4,2,3,6,5,8,7,删除奇数后a所指数组中的数据为:4,2,6,8,返回值为4。
#include <stdio.h>
#define N 9
int fun(int a[], int n)
{ int i,j;
j = 0;
for (i=0; i<n; i++)
/**********found**********/
if (a[i]%2== 0) {
/**********found**********/
a[j] = a[i]; j++;
}
/**********found**********/
return j;
}
void main()
{ int b[N]={9,1,4,2,3,6,5,8,7}, i, n;
printf("\nThe original data :\n");
for (i=0; i<N; i++) printf("%4d ", b[i]);
printf("\n");
n = fun(b, N);
printf("\nThe number of even :%d\n", n);
printf("\nThe even :\n");
for (i=0; i<n; i++) printf("%4d ", b[i]);
printf("\n");
}
使用VC++2010打开考生文件夹下modi1中的解决方案。此解决方案的项目中包含一个源程序文件modi1.c。在此程序中,函数fun的功能是:按以下递归公式求函数的值。
例如,当给n输入5时,函数值为18;当给n输入3时,函数值为14。
请改正程序中的错误,使它能得出正确的结果
#include <stdio.h>
/************found************/
int fun (int n)
{ int c;
/************found************/
if(n==1)
c = 10 ;
else
c= fun(n-1)+2;
return(c);
}
void main()
{ int n;
printf("Enter n : "); scanf("%d",&n);
printf("The result : %d\n\n", fun(n));
}
使用VC++2010打开考生文件夹下modi1中的解决方案。此解决方案的项目中包含一个源程序文件modi1.c。在此程序中,函数fun的功能是:删除指针p所指字符串中的所有空白字符(包括制表符、回车符及换行符)。
输入字符串时用'#'结束输入。
请改正程序中的错误,使它能输出正确的结果。
#include <string.h>
#include <stdio.h>
#include <ctype.h>
void fun ( char *p)
{ int i,t; char c[80];
/************found************/
for(i = 0,t = 0; p[i] ; i++)
if(!isspace(*(p+i))) c[t++]=p[i];
/************found************/
c[t]='\0';
strcpy(p,c);
}
void main( )
{ char c,s[80];
int i=0;
printf("Input a string:");
c=getchar();
while(c!='#')
{ s[i]=c;i++;c=getchar(); }
s[i]='\0';
fun(s);
puts(s);
}
程序设计题
使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,编写函数fun,其功能是:将ss所指字符串中所有下标为奇数位上的字母转换为大写(若该位置上不是字母,则不转换)。
例如,若输入"abc4EFg",则应输出"aBc4EFg"。
#include <stdio.h>
#include <string.h>
void fun ( char *ss )
{
int i;
for(i=0;ss[i]!='\0';i++)
{
if(i%2==1&&ss[i]>='a'&&ss[i]<='z') //判断i是否为奇数且字符串是否在a<z之间
ss[i]=ss[i]-32;
}
}
void main( )
{ char tt[81] ;
void NONO ( );
printf( "\nPlease enter an string within 80 characters:\n" ); gets( tt );
printf( "\n\nAfter changing, the string\n \"%s\"", tt );
fun( tt );
printf( "\nbecomes\n \"%s\"\n", tt );
NONO ( );
}
void NONO ( )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
char tt[81] ;
int i ;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%s", tt) ;
fun( tt ) ;
fprintf(wf, "%s\n", tt) ;
}
fclose(fp) ;
fclose(wf) ;
}
使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,规定输入的字符串中只包含字母和*号。请编写函数fun,其功能是:使字符串中尾部的*号不多于n个,若多于n个,则删除多余的*号;若少于或等于n个,则不做任何操作,字符串中间和前面的*号不删除。
例如,字符串中的内容为“****A*BC*DEF*G*******”,若n的值为4,删除后,字符串中的内容应为“****A*BC*DEF*G****”;若n的值为7,则字符串中的内容仍为“****A*BC*DEF*G*******”。n的值在主函数中输入。
编写函数时,不得使用C语言提供的字符串函数。
注意:部分源程序在文件prog1.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio.h>
void fun( char *a,int n )
{
{
int i=0,k=0;
char *p, *t;
p=t=a; /*将指针移动到字符串末尾*/
while(*t)
t++;
t--; /*从后往前如果是'*' 则使k++,找到最后一个*所在的位置,并记录'*'的个数*/
while(*t=='*') /*指针t指向前一个,同时标量k增加一*/
{k++;t--;}
if(k>n)
{while(*p&&p<t+n+1)
{ a[i]=*p;//把n个*号和其余字符重新保留
i++;p++;
}
a[i]='\0';
}
}
}
void 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();
}
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) ;
}
使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,函数fun的功能是:将两个两位数的正整数 a、b合并成一个整数放在c中。合并的方式是:将a数的十位和个位数依次放在c数的千位和十位上,b数的十位和个位数依次放在c数的百位和个位上。
例如,当a=45,b=12时,调用该函数后c=4152。
数据文件IN.DAT中的数据不得修改
#include <stdio.h>
void fun(int a, int b, long *c)
{
*c=b%10+(a%10)*10+(b/10)*100+(a/10)*1000;
}
void main()
{ int a,b; long c;
void NONO ( );
printf("Input a, b:"); scanf("%d %d", &a, &b);
fun(a, b, &c);
printf("The result is: %d\n", c);
NONO();
}
void NONO ( )
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *rf, *wf ;
int i, a,b ; long c ;
rf = fopen("in.dat", "r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%d,%d", &a, &b) ;
fun(a, b, &c) ;
fprintf(wf, "a=%d,b=%d,c=%ld\n", a, b, c) ;
}
fclose(rf) ;
fclose(wf) ;
}
第 42 题
使用VC++2010打开考生文件夹下modi1中的解决方案。此解决方案的项目中包含一个源程序文件modi1.c。在此程序中,函数fun的功能是:给一维数组a输入任意4个整数,并按如下的规律输出。例如,输入1、2、3、4,程序运行后输出以下方阵:
void fun(int *a)
{ int I,j,k,m;
printf("Enter 4 number: ");
for(I=0;I<M;I++) scanf("%d",&a[I]);
printf("\n\nThe result :\n\n ");
for(I=M;I>0;I--)
{ k=a[M-1];//K为4
for(j=M-1;j>0;j--)
/*************found**************/
a[j]=a[j-1]; //
a[0]=k;
for(m=0;m<M;m++) printf("%d ",a[m]);
printf("\n ");
}
}
void main()
{ int a[M];
fun(a); printf("\n\n ");
}
<13>
使用VC++2010打开考生文件夹下blank1中的解决方案。此解决方案的项目中包含一个源程序文件blank1.c。在此程序中,函数fun的功能是:计算
直到
。
若x=2.5,函数值为1.917915。
请在程序的下画线处填入正确的内容并把下画线删除,使程序得出正确的结果。
#include <stdio.h>
#include <math.h>
double fun(double x)
{ double f, t; int n;
f = 1.0 + x;
t=x;
n = 1;
do {
n++;
t*=(-1.0)*x/n;
f += t;
}
while(fabs(t)>=1e-6);
return f;
}
void main()
{ double x, y;
x=2.5;
y = fun(x);
printf("\nThe result is :\n");
printf("x=%-12.6f y=%-12.6f\n", x, y);
}
<13> 好难啊 希望考试如果从天明题库找的话别抽到这个题
第 43 题
使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,编写函数fun,其功能是:计算并输出当x<0.97时,如下多项式的值,直到|Sn-S n-1|<0.000001为止。
。例如,若主函数从键盘给x输入0.21后,则输出为S=1.100000。
#include <math.h>
#include <stdio.h>
double fun(double x)
{
double s1=1.0,p=1.0,sum=0.0,s0,t=1.0;
int n=1;
do
{
s0=s1;
sum+=s0;
t*=n;
p*=(0.5-n+1)*x;
s1=p/t;
n++;
}
while(fabs(s1-s0)>=1e-6);
return sum;
}
void main()
{ int i;
double x,s;
FILE *out;
printf("Input x: ");
scanf("%lf",&x);
s=fun(x);
printf("s=%f\n ",s);
/******************************/ /*这里包含输出文件程序*/
out=fopen("out.dat","w");
for(i=20;i<30;i++)
fprintf(out,"%f\n",fun(i/100.0));
fclose(out);
/******************************/
}
使用VC++2010打开考生文件夹下blank1中的解决方案。此解决方案的项目中包含一个源程序文件blank1.c。在此程序中,函数fun的功能是:统计长整数n的各位上出现数字1、2、3的次数,并用外部(全局)变量c1、c2、c3返回主函数。
例如,当n=#include <stdio.h> int c1,c2,c3; void fun(long n) { c1=c2=c3=0; while(n) { switch(n%10) { case 1: c1++;break; case 2: c2++;break; case 3: c3++; } n/=10; } } void main() { long n=123114350L; fun(n); printf("\nThe result: \n"); printf("n=%ld c1=%d c2=%d c3=%d\n",n,c1,c2,c3); }
123114350时,结果应该为:c1=3 c2=1 c3=2。
使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,编写函数fun,其功能是:计算并输出下列多项式的值。
例如,在主函数中从键盘为n输入50后,输出为S=1.718282。
注意:要求n的值在大于1但不大于100之间。
#include <stdio.h>
double fun(int n)
{
double s=0,tmp=1;
int i;
for(i=1;i<=n;i++)
{
tmp=tmp*i;
s+=1.0/tmp;
}
return s;
}
void main()
{ int n; double s;
void NONO( );
printf("\nInput n: "); scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n\n",s);
NONO();
}
void NONO()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf ; int n, i ; double s ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(rf, "%d", &n) ;
s = fun(n) ;
fprintf(wf, "%lf\n", s) ;
}
fclose(rf) ; fclose(wf) ;
}
使用VC++2010打开考生文件夹下blank1中的解决方案。此解决方案的项目中包含一个源程序文件blank1.c。在此程序中,函数fun的功能是:将形参s所指字符串中所有ASCII码值小于97的字符存入形参t所指字符数组中,形成一个新串,并统计出符合条件的字符个数作为函数值返回。
例如,形参s所指的字符串为:Abc@1x56*,程序执行后t所指字符数组中的字符串应为:A@156*。
#include <stdio.h>
int fun(char *s, char *t)
{ int n=0;
while(*s)
{ if(*s < 97) {
/**********found**********/
*(t+n)=*s; n++; }
/**********found**********/
s++ ;
}
*(t+n)=0;
/**********found**********/
return n ;
}
void main()
{ char s[81],t[81]; int n;
printf("\nEnter a string:\n"); gets(s);
n=fun(s,t);
printf("\nThere are %d letter which ASCII code is less than 97: %s\n",n,t);
}
使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,编写函数fun,其功能是:根据以下公式求P的值,结果由函数值带回。m与n为两个正整数且要求m>n。
例如:m=12,n=8时,运行结果为495.000000。
注意:部分源程序在文件prog1.c中。
16
#include <stdio.h>
float fun(int m, int n)
{
float p1=1,p2=1,p3=1;
int i;
for(i=1;i<=m;i++)
p1*=i;
for(i=1;i<=n;i++)
p2*=i;
for(i=1;i<=(m-n);i++)
p3*=i;
return p1/(p2*p3);
}
void main() /* 主函数 */
{ void NONO ();
printf("P=%f\n", fun (12,8));
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *fp, *wf ;
int i, m, n ;
float s;
fp = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(fp, "%d,%d", &m, &n) ;
s = fun(m, n) ;
fprintf(wf, "%f\n", s) ;
}
fclose(fp) ;
fclose(wf) ;
}
17
使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,编写函数fun,它的功能是:求小于形参n同时能被3与7整除的所有自然数之和的平方根,并作为函数值返回。
例如,若n为1000时,程序输出应为:s=153.909064。
注意:部分源程序在文件prog1.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
第 41 题
使用VC++2010打开考生文件夹下blank1中的解决方案。此解决方案的项目中包含一个源程序文件blank1.c。在此程序中,函数fun的功能是:找出形参s所指字符串中出现频率最高的字母(不区分大小写),并统计出其出现的次数。
例如,形参s所指的字符串为:abcAbsmaxless,程序执行后的输出结果为:
letter'a':3times
letter's':3times
#include <stdio.h>
#include <string.h>
#include <ctype.h>
void fun(char *s)
{ int k[26]={0},n,i,max=0; char ch;
while(*s)
{ if( isalpha(*s) ) {
/**********found**********/
ch=tolower(*s);
n=ch-'a';
/**********found**********/
k[n]+=1 ; //把字母出现的个数加到指定的数组中
}
s++;
/**********found**********/
if(max<k[n]) max= k[n] ;
}
printf("\nAfter count :\n");
for(i=0; i<26;i++)
if (k[i]==max) printf("\nletter \'%c\' : %d times\n",i+'a',k[i]);
}
void main()
{ char s[81];
printf("\nEnter a string:\n\n"); gets(s);
fun(s);
}
终于终于做对大题了!!希望考试也能做出来