东北大学--初试

东北大学专业课初试考C语言和数据结构

复试考:软工,网络,java,数据库四门

专业课C语言部分(都是运行过的,应该没问题):

2001

//C语言 四

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define N 30

#define MIN -10000

typedef struct{

int num;

int val;

}max;

int main(){

int m,n;

int a[N][N];

max row[N];//记录各行最大值

printf("输入数组行,列:\n");

scanf("%d%d",&m,&n);

printf("输入数组信息:\n");

for(int i=0;i<m;++i){//输入表信息并记录各行最大值

row[i].val = MIN;//row[i].val = a[i][j]不对

row[i].num = i;

for(int j=0;j<n;++j){

scanf("%d",&a[i][j]);

if(a[i][j]>row[i].val)

row[i].val = a[i][j];

}

}

for(int i=m-1;i>0;--i){//对各行最大值排序

for(int j=0;j<i;++j){

if(row[j].val>row[j+1].val){

int temp = row[j].val;

row[j].val = row[j+1].val;

row[j+1].val = temp;

temp = row[j].num;

row[j].num = row[j+1].num;

row[j+1].num = temp;

}

}

}

for(int i=0;i<m;++i){//按各行最大值升序输出各行

int temp = row[i].num;

for(int j=0;j<n;++j){

printf("%d ",a[temp][j]);

}

printf("\n");

}

return 0;

}

/*

4 5

2 3 6 8 3

4 3 8 9 6

0 1 2 1 3

4 1 1 0 1

*/

 

2007

编程题(四)

#include<stdio.h>

#include<string.h>//strcmp,strcpy

#include<stdlib.h>//exit

#define N 1024

int main(){

FILE *fp;//定义文件指针

char *text[N];

char p[N],q[N];

/*

用fgets(..)读入数据时,先定义一个字符数组或字符指针,如果定义了字符指针 ,那么一定要初始化。

char s[100]; //可以。

    char *s;  //不可以,因为只是声明了一个指针。但并没有为它分配内存缓冲区。

    所以,如果要用指针,则  char *s=(char *)malloc(100*sizeof(char));为其分配内存空间

*/

int num;

int i,j,len;

fp = fopen("dict.txt","r");

if(fp==NULL){

printf("can not open file\n");

exit(0);

}

/*

fgets(...)读入文本行时的两种情况:

          1.如果n大于一行的字符串长度,那么当读到字符串末尾的换行符时,fgets(..)会返回。

  并且在s的最后插入字符串结束标志'\0'。

  ps:在'\0'之前还有一个'\n'。p[strlen(p)-1]='\0';这句话可以把'\n'消去

  2.如果n小于等于一行的字符串的长度,那么读入n-1个字符,

  此时并没有读入\n因为并没有到行尾 ,同样在最后会插入'\0'.

*/

num=0;

while(fgets(p,1024,fp)!=NULL){

/*

如果读入成功,则返回缓冲区的地址。

        如果读入错误或遇到文件结尾(EOF),则返回NULL.

*/

p[strlen(p)-1]='\0';//把'\n'消去

text[num]=(char *)malloc(N*sizeof(char));

strcpy(text[num++],p);

}

printf("%d\n",num);

//scanf("%s",q); 不能用%s,%s输入时遇到空格或回车则结束

gets(q);

i=0;

j=num-1;

while(i<=j){//i<=j,因为i==j时可能是正确结果

printf("%d %d\n",i,j);

if(strcmp(q,text[(i+j)/2])==0){

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

break;/到结果要及时退出,否则会死循环

}

else if(strcmp(q,text[(i+j)/2])>0)

i=(i+j)/2+1;

else

j=(i+j)/2-1;

}

printf("%d %d\n",i,j);

if(i>j)

printf("查找失败\n");

fclose(fp);

return 0;

}

/*

测试数据:(测试数据最后有一个回车!)

book/n./This is a book.

desk/n./This is our desk.

sequence/n./a sequence of.

student/n./I am a student.

we/n./we are the world.

 

*/

编程题(四)副本

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define N 1024

int main(){

FILE *fp;

char *text[N];

int num = 0;

char p[N],q[N];

fp = fopen("dict.txt","r");//"r"

if(fp==NULL){

printf("can not open file\n");

exit(0);

}

while(fgets(p,N,fp)!=NULL){

p[strlen(p)-1] = '\0';//当N大于一行的长度时会多读一个'\n',所以要消掉

text[num] = (char *)malloc(N*sizeof(char));//给指针分配空间

strcpy(text[num++],p);

}

for(int i=0;i<num;++i){

printf("%s\n",text[i]);

}

gets(q);//输入要查找的单词

int i=0,j=num-1;

while(i<=j){

if(strncmp(q,text[(i+j)/2],strlen(q))==0){

printf("对应词条为:%s\n",text[(i+j)/2]);

break;

}

else if(strncmp(q,text[(i+j)/2],strlen(q))>0)

i=(i+j)/2+1;

else

j=(i+j)/2-1;

}

if(i>j)

printf("查找失败\n");

fclose(fp);

return 0;

}

 

编程题(五)

#include<stdio.h>

#include<math.h>

#include<stdlib.h>

typedef struct Lnode{

int num;

struct Lnode *next;

}Lnode;

int main(){

int n;

Lnode *L;

Lnode *p,*q;

L=(Lnode *)malloc(sizeof(Lnode));

L->next=NULL;

q=L;

scanf("%d",&n);

for(int i=1;i<=n;i++){//创建链表,给每个结点编号

p=(Lnode *)malloc(sizeof(Lnode));

p->num=i;

p->next=NULL;

q->next=p;

q=q->next;

}

/*

p=L->next;

while(p!=NULL){

printf("%d\n",p->num);

p=p->next;

}

*/

int i=0,temp=0;

while(L->next!=NULL){//判断圈子里是否还有人

p=L;//p指向待删除结点的前驱

while(p->next!=NULL){//圈子有人的时候开始数数,并且数到此轮最后一个人

i++;

if(i==pow(2,temp)){

printf("%d %d\n",temp,p->next->num);

temp++;

q=p->next;//退出圈子,删除结点

p->next=q->next;

free(q);

}

else//下一个人数数

p=p->next;

}

}

return 0;

}

 

2011

//C语言基础(1)

#include<stdio.h>

struct num{

int x;

int y;

}a[]={{2,32},{8,16},{4,48}};

int main(){

struct num *p=a+1;//p指向{8,16}

int x;

x=p->y/a[0].x*++p->x;//16/2*9=72

/*

优先级:第一级:(),[],->,. 左结合

第二级:++,--,*,&  右结合

第三级:+,-,*,/

*/

printf("%d\n",x);

return 0;

}

 

//编程题(1)

#include<stdio.h>

#include<stdlib.h>

int main(){

FILE *fp;

char buf;

int count=0;

fp=fopen("data.txt","r");

if(fp==NULL){

printf("can not open file\n");

exit(0);

}

//不能用fgets(),因为fgets是按行读

//可以用fgetc,返回值:返回所得到的字符;若读入错误,返回EOF。

while(fscanf(fp,"%c",&buf)>0){//fscanf返回的是实际读取的数据个数,出错或者到结尾返回EOF。PS:EOF的值是-1

count++;

printf("%c",buf);

if(buf=='\n'){

count = 0;

continue;

}

if(count%30==0)

printf("\n");

}

fclose(fp);

return 0;

}

 

//编程题(2)

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

//将串str1中i个字符到第j个字符之间的字符替换成串str2

char *stuff(char *str1,char *str2,int i,int j){

static char buf[100];//设置为static变量!!!

char *p,*q;

q = buf;

p = str1;

while(p!=(str1+i)){//把str1前i个字符赋值给buf,p!=(p+i)不对

*q = *p;

p++;

q++;

}

 

p = str2;

while(*p!='\0'){//把str2赋值给buf

*q = *p;

++p;

++q;

}

p = str1+j-1;

while(*p!='\0'){//把str1第j个字符开始的剩余串赋值给buf

*q = *p;

++p;

++q;

}

*q = '\0';//字符串结束标志

return buf;

}

int main(){

char s1[100],s2[100];

int i,j;

gets(s1);

gets(s2);

scanf("%d%d",&i,&j);

char *s3=stuff(s1,s2,i,j);

puts(s3);

return 0;

}

 

//鞍点

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define N 100

#define MIN -10000000

int main(){

int a[N][N];

int row[N],col[N];

int m,n;

scanf("%d%d",&m,&n);

for(int i=0;i<m;++i){//输入m行n列的矩阵

for(int j=0;j<n;++j){

scanf("%d",&a[i][j]);

}

}

int h=0;

int max,min;

for(int i=0;i<m;++i){

row[h] = i;//记录行号

max = MIN;

for(int j=0;j<n;++j){//找行最大

if(max<a[i][j]){

max = a[i][j];

col[h] = j;//记录列号

}

}

int flag = 1;

for(int k=0;k<m;++k){//判断行最大是不是列最小

if(max>a[k][col[h]]){

flag = 0;

}

}

if(flag)

++h;

}

if(h==0)

printf("没有鞍点\n");

else{

printf("鞍点:\n");

for(int i=0;i<h;++i){//输出鞍点

printf("%d %d\n",row[i],col[i]);

}

}

return 0;

}

 

2013

//编程题 1

#include<stdio.h>

long f(int n,int m){

if(m==0||m>n)

return 0;

if(m==1||m==n)

return 1;

if(n>m&&m>0)

return m*f(n-1,m)+f(n-1,m-1);

}

int main(){

int a,b;

scanf("%d%d",&a,&b);

printf("%ld\n",f(a,b));

return 0;

}

 

//九宫格

#include<stdio.h>

int main(){

int a[3][3];

for(int i=0;i<3;++i){

for(int j=0;j<3;++j){

scanf("%d",&a[i][j]);

}

}

int flag=1;

for(int i=0;i<8;++i){//判断是否有重复数字

int temp=*(*a+i);

for(int j=i+1;j<9;++j){

if(temp == *(*a+j)){

flag = 0;

break;

}

}

}

int sum=a[0][0]+a[0][1]+a[0][2];

if((a[1][0]+a[1][1]+a[1][2])!=sum||(a[2][0]+a[2][1]+a[2][2])!=sum)//判断各行

flag = 0;

if((a[0][0]+a[1][0]+a[2][0])!=sum||(a[0][1]+a[1][1]+a[2][1])!=sum||(a[0][2]+a[1][2]+a[2][2])!=sum)//判断各列

flag = 0;

if((a[0][0]+a[1][1]+a[2][2])!=sum||(a[0][2]+a[1][1]+a[2][0])!=sum)//判断对角线

flag = 0;

if(flag)

printf("满足要求\n");

else

printf("不满足要求\n");

return 0;

}

 

//编程 3

//读取file1中的单词到指针数组,冒泡排序,再逐个插入到file2

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#define N 100

int main(){

FILE *fpin,*fpout;//定义文件指针

char *dict[N];

fpin = fopen("file1.txt","r");//"r",必须是双引号

if(fpin==NULL){

printf("can not open file\n");

exit(0);

}

int k=0;

dict[k] = (char *)malloc(N*sizeof(char));

while(fscanf(fpin,"%s",dict[k])>0){//fscanf返回的是实际读取的数据个数,出错或者到结尾返回EOF。

++k;

dict[k] = (char *)malloc(N*sizeof(char));

}

fclose(fpin);

for(int i=k-1;i>0;--i){//冒泡排序

for(int j=0;j<i;++j){

if(strcmp(dict[j],dict[j+1])>0){

char *temp = dict[j];

dict[j] = dict[j+1];

dict[j+1] = temp;

}

}

}

fpout = fopen("file2.txt","w");

if(fpout==NULL){

printf("can not open file\n");

exit(0);

}

for(int i=0;i<k;++i)

fprintf(fpout,"%s ",dict[i]);

fclose(fpout);

return 0;

}

 

2014

//韩信点兵

#include<stdio.h>

int main(){

int i=10;

while(1){

if(i%5==1&&i%6==5&&i%7==4&&i%11==10){

printf("%d\n",i);

break;

}

++i;

}

return 0;

}

 

//C语言 2

#include<stdio.h>

int main(){

char str[100];

char *p;

int m=0,n=0;

gets(str);

p=str;

while(*p!='\0'){

if(*p>='a'&&*p<='z')

++m;

if(*p>='A'&&*p<='Z')

++n;

++p;

}

printf("小写字母个数:%d,大写字母个数:%d\n",m,n);

--p;

while(p!=str){

if(*p>='A'&&*p<='Z')

printf("%c ",*p);

--p;

}

if(*p>='A'&&*p<='Z')//判断第一个字符是否大写

printf("%c \n",*p);

return 0;

}

 

//鞍点

#include<stdio.h>

#define N 10

int main(){

int a[N][N];

int row[N],col[N];

int m,n;

scanf("%d%d",&m,&n);

for(int i=0;i<m;++i){

for(int j=0;j<n;++j){

scanf("%d",&a[i][j]);

}

}

int h=0;

for(int i=0;i<m;++i){

row[h]=i;

int max=0;

for(int j=0;j<n;++j){//找到每行最大值

if(max<a[i][j]){

max = a[i][j];

col[h] = j;

}

}

//printf("max:%d\n",max);

int flag = 1;

for(int k=0;k<m;++k){//判断是不是列最小

if(max>a[k][col[h]])

flag=0;

}

if(flag)//如果是鞍点,则记录

++h;

}

if(h==0)

printf("不存在鞍点\n");

else{

printf("共有%d个鞍点:\n",h);

for(int i=0;i<h;i++)

printf("a[%d][%d]\n",row[i],col[i]);

}  

return 0;

}

/*

3 3

1 2 3

2 3 4

1 2 5

*/

 

2015

//2015 3

#include<stdio.h>

void copy(char *s1,char *s2,int k){

int i=k-1,j=0;

while(*(s1+i)!='\0'){

*(s2+j)=*(s1+i);

++i;

++j;

}

*(s2+j)='\0';//别忘了这一句,‘\0’是字符串结束的标志

}

int main(){

char s1[100],s2[100];

int k;

gets(s1);//不能用%s

scanf("%d",&k);

copy(s1,s2,k);

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

return 0;

}

 

2016

//2016编程第一题

#include<stdio.h>

int main(){

int n;

int sum=0,k=0;

scanf("%d",&n);

for(int i=1;i<=n;i++){

int temp=1;

for(int j=1;j<=i;j++){

k++;

temp*=k;

}

sum+=temp;

}

printf("前%d项之和:%d\n",n,sum);

return 0;

}

 

//2016编程第三题

#include<stdio.h>

int search_ch(char s[],char ch){

int i=0;

while(s[i]!='\0'){

if(s[i]==ch)

return i+1;

++i;

}

return 0;

}

int main(){

char str[100];

char target;

int location;

//scanf("%s",str);//%s遇到空格或换行符则结束

gets(str);

scanf("%c",&target);

location = search_ch(str,target);

if(location==0)

printf("字符串%s不含字符:%c\n",str,target);

else

printf("%c在%s中首次出现的位置是:%d",target,str,location);

return 0;

}

 

C语言练习

//最大公约数,最小公倍数

#include<stdio.h>

int gcd(int a,int b){

int temp;

if(a<b){

temp = a;

a = b;

b = temp;

}

if(a%b==0)

return b;

else

return gcd(b,a%b);

}

int main(){

int a,b,c;

scanf("%d%d",&a,&b);

c=gcd(a,b);

printf("%d和%d的最大公约数:%d\n",a,b,c);

printf("%d和%d的最大公约数:%d\n",a,b,a*b/c);

return 0;

}

 

//斐波那契数列

#include<stdio.h>

// f[0]=1,f[1]=1,f[n]=f[n-1]+f[n-2]

void fab(int *f,int i){//f[]仅仅是数组的copy

if(i==11)

return ;

else{

//*(f+i)=f[i-1]+f[i-2];

f[i]=f[i-1]+f[i-2];

fab(f,i+1);

}

}

int main(){

int f[100];

int n;

f[0]=0;

f[1]=1;

fab(f,2);

scanf("%d",&n);

printf("%d\n",f[n]);

return 0;

}

 

//今天是今年的第几天

//能被4整除但不能被100整除,或能被400整除的年份即为闰年

#include<stdio.h>

int main(){

int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int year,month,day;

int sum=0;//记录总天数

scanf("%d%d%d",&year,&month,&day);

for(int i=1;i<month;i++){//把month前的月份的天数都加到sum

sum+=a[i];

}

sum+=day;//把month月的天加到sum

if((year%4==0&&year%100!=0)||year%400==0)//如果是闰年,多加一天

++sum;

printf("%d\n",sum);

return 0;

}

 

//实现strcmp()函数

#include<stdio.h>

#include<string.h>

int strcmp1(char *s1,char *s2){

int len1=strlen(s1);

int len2=strlen(s2);

int len=len1<len2?len1:len2;

int i=0;

while(i<=len){//'\0'小于除了自身外的任意字母

if(*(s1+i)>*(s2+i))

return 1;

if(*(s1+i)<*(s2+i))

return -1;

++i;

}

return 0;

}

int main(){

char s1[100],s2[100];

gets(s1);

gets(s2);

printf("%d\n",strcmp1(s1,s2));

return 0;

}

 

//打印杨辉三角

/*

a[0][0]=1

a[1][0]=1 a[1][1]=1

a[2][0]=1 a[2][1]=a[1][0]+a[1][1] a[2][2]=1

1

1 1

1 2 1

1 3 3 1

*/

#include<stdio.h>

#include<string.h>

int main(){

int a[100][100];

a[0][0]=1;

for(int i=1;i<=9;i++){

for(int j=0;j<=i;j++){

if(j==0||j==i)

a[i][j]=1;

else

a[i][j]=a[i-1][j-1]+a[i-1][j];

}

}

for(int i=0;i<=9;i++){

for(int j=0;j<=i;j++){

printf("%d ",a[i][j]);

}

printf("\n");

}

return 0;

}

 

//冒泡排序

#include<stdio.h>

#include<string.h>

int main(){

int a[100];

int n;

scanf("%d",&n);

for(int i=0;i<n;++i)

scanf("%d",&a[i]);

//冒泡排序

for(int i=n-1;i>0;--i){//比较n-1轮

for(int j=0;j<i;j++){//每次把所剩数据的最大值排到最后

if(a[j]>a[j+1]){

int temp = a[j];

a[j] = a[j+1];

a[j+1] = temp;

}

}

}

for(int i=0;i<n;++i)

printf("%d ",a[i]);

printf("\n");

return 0;

}

 

//找出1000以内所有完数

//完数:它所有的真因子(即除了自身以外的约数)的和恰好等于它本身。

#include<stdio.h>

int main(){

for(int i=1;i<=1000;++i){

int sum=0;

for(int j=1;j<=i/2;++j){

if(i%j==0)

sum+=j;

}

if(sum==i)

printf("%d ",i);

}

return 0;

}

 

//统计单词

#include<stdio.h>

int main(){

char str[100];

gets(str);

int i=0;

int count=0;

//第一个单词之前没有空格,单词与单词之间可以有多个空格

while(str[i]!='\0'){

while((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z'))

++i;

while(str[i]==' ')

++i;

++count;

}

printf("单词个数:%d\n",count);

return 0;

}

 

//鞍点

#include<stdio.h>

#define N 10

int main(){

int a[N][N];

int row[N],col[N];

int m,n;

scanf("%d%d",&m,&n);

for(int i=0;i<m;++i){

for(int j=0;j<n;++j){

scanf("%d",&a[i][j]);

}

}

int h=0;

for(int i=0;i<m;++i){

row[h]=i;

int max=0;

for(int j=0;j<n;++j){//找到每行最大值

if(max<a[i][j]){

max = a[i][j];

col[h] = j;

}

}

//printf("max:%d\n",max);

int flag = 1;

for(int k=0;k<m;++k){//判断是不是列最小

if(max>a[k][col[h]])

flag=0;

}

if(flag)//如果是鞍点,则记录

++h;

}

if(h==0)

printf("不存在鞍点\n");

else{

printf("共有%d个鞍点:\n",h);

for(int i=0;i<h;i++)

printf("a[%d][%d]\n",row[i],col[i]);

}  

return 0;

}

/*

3 3

1 2 3

2 3 4

1 2 5

*/


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值