中山大学计算机历年复试面试考研试题合集(4)

本站小编 免费考研网/2019-12-09


      puts   (substr);
      n=findStr(str,substr);
      printf   ( "Substr   counted   is   %d ",   n);
      getch();
}
int   findStr(char   *str,   char   *substr)
{
      int   n=0,i=0,j=0;
      while   (*(str+i)!= '\0 ')
      {
            if   (*(str+i)==*(substr+j))   {i++;   j++;}
          
 else     {i=i-j+1;   j=0;}  
            if   (*(substr+j)== '\0 ')   {n++;   j=0;}
      }      
      return   n;
}
串的模式匹配问题
int findStr(char *str,char *substr)
  { int  n;
    char  *p , *r;
    n=0;
    while ( *str )
   {  p=str;
      r=substr;
      while(*r)
      if(*r==*p) {  r++;  p++;  }
      else  break;
      if(*r=='\0')
      n++;
      str++;   }
   return  n;
采用顺序存储结构存储串,编写一个函数计算一个子串在一个字符串中出现的次数,如果该子串不出现则为0。(要求使用KMP算法)      
最佳答案 #include <string.h>
/*在此定义一个int型数组next[],next[j]对应于当子串在位置j比较失败时的下一次匹配时子串的开始位置,由子串决定。*/
int StrIndex(char *S,char *T)
{int i,j;
i=0;
j=0;
int Slen=strlen(S);
int Tlen=strlen(T);
while((j<=(Tlen-1))&&((Slen-1-i+1)>=(Tlen-1-j+1)))
{if(S[i]==T[j]) {i++;
j++;}
else {
j=next[j];
if(j==-1){i++;j++;}
}
}
if(j>(Tlen-1)) return (i-j+1);
else return 0;
}
如:
S="a b a b c a b a a b c a a b a a b a b c a a b"
T="a b a a b a b c"
定义
int next[8]={-1,0,0,1,0,0,3,2};
 typedef char DataType; //假设结点的数据域类型为字符
typedef struct node{ //结点类型定义
DataType data; //结点的数据域
struct node *next;//结点的指针域
}ListNode
typedef ListNode *LinkList;
ListNode *p;
LinkList head;
注意:
①*LinkList和ListNode是不同名字的同一个指针类型(命名的不同是为了概念上更明确)
②*LinkList类型的指针变量head表示它是单链表的头指针
③ListNode类型的指针变量p表示它是指向某一结点的指针
6、指针变量和结点变量
┌────┬────────────┬─────────────┐
│ │ 指针变量 │ 结点变量 │
├────┼────────────┼─────────────┤
│ 定义 │在变量说明部分显式定义 │在程序执行时,通过标准 │
│ │ │函数malloc生成 │
├────┼────────────┼─────────────┤
│ 取值 │ 非空时,存放某类型结点 │实际存放结点各域内容 │
│ │的地址 │ │
├────┼────────────┼─────────────┤
│操作方式│ 通过指针变量名访问 │ 通过指针生成、访问和释放 │
└────┴────────────┴─────────────┘
①生成结点变量的标准函数
p=( ListNode *)malloc(sizeof(ListNode));
//函数malloc分配一个类型为ListNode的结点变量的空间,并将其首地址放入指针变量p中
②释放结点变量空间的标准函数
free(p);//释放p所指的结点变量空间
③结点分量的访问
利用结点变量的名字*p访问结点分量
方法一:(*p).data和(*p).next
方法二:p-﹥data和p-﹥next
④指针变量p和结点变量*p的关系
指针变量p的值——结点地址
结点变量*p的值——结点内容
(*p).data的值——p指针所指结点的data域的值
(*p).next的值——*p后继结点的地址
*((*p).next)——*p后继结点
注意:
① 若指针变量p的值为空(NULL),则它不指向任何结点。此时,若通过*p来访问结点就意味着访问一个不存在的变量,从而引起程序的错误。
② 有关指针类型的意义和说明方式的详细解释
可见,在链表中插入结点只需要修改指针。但同时,若要在第 i 个结点之前插入元素,修改的是第 i-1 个结点的指针。
因此,在单链表中第 i 个结点之前进行插入的基本操作为:
找到线性表中第i-1个结点,然后修改其指向后继的指针。
#include<stdio.h>
#include<string.h>
int Palindrome(char * s1)//判断是否是回文
{
 char str[50];
        int k,i,j;
 k=strlen(s1);
 for(i=k-1,j=0;i>=0;i--,j++)
 {
  str[j]=s1[i];
 }
 str[j]='\0';
 if(strcmp(s1,str)==0)
  return 1;
 else
  return 0;
}
void main()
{
 char s[50];
 printf("请输入一个字符串:\n");
  scanf("%s",s);
 int flag=Palindrome(s);
 if(flag==1)
  printf("字符串%s是回文\n",s);
 else
  printf("字符串%s不是回文\n",s);
}
测试:
请输入一个字符串:
jkasjdkf
字符串jkasjdkf不是回文
Press any key to continue
请输入一个字符串:
aabaa
字符串aabaa是回文
Press any key to continue
编写一个程序,将用户输入的一个字符串转换成一个整数
#include "stdio.h"

int cti(char s[])
{
int i,sign,n;
for(i=0;s[i]==' '||s[i]=='\n'||s[i]=='\t';i++){printf("ok");};//跳过前面空格
sign=1;
if(s[i]=='+'||s[i]=='-')
sign=(s[i++]=='+')?1:-1;
for(n=0;s[i]>='0'&&s[i]<='9';i++)
n=10*n+s[i]-'0';
return(sign*n);}
main()
{   char s[50];
    int n;
    scanf("%s",s);
    n=cti(s);
    printf("对应的整数:%d\n\n",n);
    getch();
}
题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。
1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
2.程序源代码:
main()
{
int i,j,k,n;
printf("'water flower'number is:");
for(n=100;n<1000;n++)
{
i=n/100;/*分解出百位*/
j=n/10%10;/*分解出十位*/
k=n%10;/*分解出个位*/
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
{
printf("%-5d",n);
}
}
printf("\n");
}
c语言,输入一个字符串,将该字符串中从第m个字符开始的全部字符复制到另一个字符串,m由用户输入……
悬赏分:10 | 解决时间:2010-10-5 20:22 | 提问者:349633487  输入一个字符串,将该字符串中从第m个字符开始的全部字符复制到另一个字符串,m由用户输入,值小于字符串的长度,要求编写一个函数mcopy(char *s,int m)来完成
#include<stdio.h>
#include<string.h>  //支持strlen()的应用
#include<stdlib.h>  //支持exit(1)
char *mcopy(char*s ,int m);   //函数的定义
void main(void)
{
 char str1[100];
 char *str2;
 int m;
 printf("请输入你要输入的字符串\n");
 gets(str1);
 printf("请输入你要开始复制字符的位置m\n");
 scanf("%d",&m);
 if(m>=strlen(str1))    //若输入m值过大,结束程序
 {
  printf("输入值超出字符串长度...\n");
  exit(1);
 }
 str2=mcopy(str1,m);  //程序的调用
 for(int j=0;j<strlen(str2);j++) //把数组进行输出
  printf("字符串第%d个元素是%c\n",m++,str2[j]);   //字符的输出
}
char *mcopy(char*s ,int m)
{
 static char array[100];
 int count=0;
 for(int i=m-1;i<strlen(s);i++)
 {
  array[count]=s[i];
  count++;
 }
 return array;
}
一.   笔试 计算机。。
挺简单的。。  具体的忘记了。 。  有
1.关系的题目  还叫画 关系矩阵、
2.图的题目    画 邻接矩阵,可达矩阵, 画哈试图
3.图的证明题  好像是证明一个有 n-1 条边的简单图必定有一个点的度《=1
二。笔试C。
1.写程序。。   将一个 数字字串 如“123” 转换成相应的 数字  123
2. 两个读程序题, 写出结果
3.一个填空题  :
1
6   7
11 12 13
16 17 18 19
21 22 23 24
用一个一唯数组存储这组数据, 并用另一个指针(注,指针是2唯的好像。) 将他们这么打印出来。。
这题也不难。 可能我描述不好。 呵呵。
4.还有一题改错。是关于循环 以及循环中的判断的。  认真点就能检查出来。“物联网概念”是在“互联网概念”的基础上,将其用户端延伸和扩展到任何物品与物品之间,进行信息交换和通信的一种网络概念。
网格计算(grid conputing)
7. 迷宫问题
给一个20×20的迷宫、起点坐标和终点坐标,问从起点是否能到达终点。
输入数据:’.’表示空格;’X’表示墙。
程序如下:
#include <stdio.h>
#include <math.h>
void search(int,int);
int canplace(int,int);

void readdata();           //读入数据
void printresult();        //打印结果
int a[20][20];             //a数组存放迷宫
int s,t;
int main()
{
 int row, col;
 readdata();
 row=s/20;
 col=s%20;
 search(row,col);        //递归搜索
 printresult();
}
void search(int row, int col)
{
 int r,c;
 a[row][col]=1;
 r=row;                  //左
 c=col-1;
 if(canplace(r,c))        //判断(r,c)位置是否已经走过
  search(r,c);        //递归搜索(r,c)
 r=row+1;                //下
 c=col;
 if(canplace(r,c))        //判断(r,c)位置是否已经走过
  search(r,c);        //递归搜索(r,c)
 r=row;                  //右
 c=col+1;
 if(canplace(r,c))        //判断(r,c)位置是否已经走过
  search(r,c);        //递归搜索(r,c)
 r=row-1;                //上
 c=col;
 if(canplace(r,c))        //判断(r,c)位置是否已经走过
  search(r,c);        //递归搜索(r,c)
}
void printresult()
{
 int i,j;
 for(i=0;i<20;i++)
 {
 
for(j=0;j<20;j++)
   printf("%3d",a[i][j]);
  printf("\n");
 }
}
void readdata()
{
 int i,j;
 for(i=0;i<20;i++)
 {
  for(j=0;j<20;j++)
   scanf("%d",&a[i][j]);
 }
}
int canplace(int row, int col)
{
 if(row>=0&&row<20&&col>=0&&col<20&&a[row][col]==0)
  return 1;
 else
  return 0;
}
char *strRepl(char *s, char *s1, char *s2)                                                                                                
{                                                                                                                                         
char *p,*sp,*dp,*pos;                                                                                                                   
int len,cnt;                                                                                                                            
for (pos=s;;) {                                                                                                                         
    if ((p = strstr(pos, s1)) == NULL) {                                                                                                  
        return s;                                                                                                                         
    }                                                                                                                                     
                                                                                                                                          
    len = strlen(s2) - strlen(s1);                                                                                                        

相关话题/