A. 问两道类似的c语言题目,如何来分析,有点混淆了,请高手指导!谢谢!
考察的是break的用法。break可以跳出一个程序段(用{}括起来的一段代码)或者一层循环(for或者while)。
对于程序1,先对y赋值,再跳出。对于程序2,直接跳出了,对y进行赋值的语句就没有被执行,所以程序1的输出为0,程序2的输出还是-1。
B. 大一C语言题目求解(箱子匹配)
//不用数组,就直接比较。三个数最大比三次。若数据较多可改成链表存储,按照链表来排序
#include<stdio.h>
struct xiangzi{int side1;int side2;int side3;};
struct xiangzi sortNoArray(struct xiangzi xzT){
if(xzT.side1>xzT.side2){
xzT.side1=xzT.side1^xzT.side2;
xzT.side2=xzT.side1^xzT.side2;
xzT.side1=xzT.side1^xzT.side2;
};
if(xzT.side2>xzT.side3){
xzT.side2=xzT.side2^xzT.side3;
xzT.side3=xzT.side2^xzT.side3;
xzT.side2=xzT.side2^xzT.side3;
};
if(xzT.side1>xzT.side2){
xzT.side1=xzT.side1^xzT.side2;
xzT.side2=xzT.side1^xzT.side2;
xzT.side1=xzT.side1^xzT.side2;
};
return xzT;
}
int main() {
unsigned int T;
scanf("%d",&T);
while(T--){
struct xiangzi xzA,xzB;
scanf("%d%d%d",&xzA.side1, &xzA.side2,&xzA.side3);
xzA=sortNoArray(xzA);
scanf("%d%d%d",&xzB.side1, &xzB.side2,&xzB.side3);
xzB=sortNoArray(xzB);
if(xzA.side1<=xzB.side1&&xzA.side2<=xzB.side2&&xzA.side3<=xzB.side3)
printf("yes
");
else printf("no
");
}
return 0;
}
C. 急!!急!!急!!数据结构(C语言版)程序设计题: 使用KMP算法实现一个模式匹配。
#include <cstring>
#include <iostream>
using namespace std;
//修正后的求next数组各值的函数代码
void get_nextval(char const* ptrn, int plen, int* nextval)
{
int i = 0; //i是从0开始的
nextval[i] = -1;
int j = -1;
while( i < plen-1 )
{
if( j == -1 || ptrn[i] == ptrn[j] ) //循环的if部分
{
++i;
++j;
if( ptrn[i] != ptrn[j] ) //++i,++j之后,再次判断ptrn[i]与ptrn[j]的关系
nextval[i] = j;
else
nextval[i] = nextval[j];
}
else //循环的else部分
j = nextval[j];
}
}
void print_progress(char const* src, int src_index, char const* pstr, int pstr_index)
{
cout<<src_index<<"\t"<<src<<endl;
cout<<pstr_index<<"\t";
for( int i = 0; i < src_index-pstr_index; ++i )
cout<<" ";
cout<<pstr<<endl;
cout<<endl;
}
//int kmp_seach(char const*, int, char const*, int, int const*, int pos) KMP模式匹配函数
//输入:src, slen主串
//输入:patn, plen模式串
//输入:nextval KMP算法中的next函数值数组
int kmp_search(char const* src, int slen, char const* patn, int plen, int const* nextval, int pos)
{
int i = pos;
int j = 0;
while ( i < slen && j < plen )
{
if( j == -1 || src[i] == patn[j] )
{
++i;
++j;
}
else
{
j = nextval[j];
//当匹配失败的时候直接用p[j_next]与s[i]比较,
//下面阐述怎么求这个值,即匹配失效后下一次匹配的位置
}
}
if( j >= plen )
return i-plen;
else
return -1;
}
int main()
{
std::string src = "";
std::string prn = "abac";
int* nextval = new int[prn.size()];
//int* next = new int[prn.size()];
get_nextval(prn.data(), prn.size(), nextval);
//get_next(prn.data(), prn.size(), next);
for( int i = 0; i < prn.size(); ++i )
cout<<nextval[i]<<"\t";
cout<<endl;
cout<<"result sub str: "<<src.substr( kmp_search(src.data(), src.size(), prn.data(), prn.size(), nextval, 0) )<<endl;
system("pause");
delete[] nextval;
return 0;
}
望楼主采纳!
D. C语言题目 输入密码看是否匹配
姓名部分较简单,你可以自己写。
口令部分写好了。
密码输入:允许回退键更正输入,回车结束输入
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
main()
{
char p[50];
char UserName[50]="student";
char password[50]="iamtiger";
int i=0;
int n;
printf("Please enter your name:\n");
scanf("%s",UserName);
n=0;
Loop:
i=0;
printf("Please enter your passwd:\n");
fflush(stdin);
while ( i < 50 ){
p[i] = getch();
if (p[i] == '\r') break;
if (p[i] == '\b') { i=i-1; printf("\b \b"); } else {i=i+1;printf("*");};
}
p[i]='\0';
if ( strcmp(password,p)==0) printf("\npasswd is right!\n");
else {
printf("\npassword wrong\n");
n++;
if (n>=3) { printf("Err bye !\n"); return 0;} else goto Loop;
};
return 0;
}
E. c语言数据类型转换规则 类似题目:
表达式的结果double型的,但是由于c是float型,所以表达式的赋值结果还是float型
F. C语言题目
1, printf的格式匹配顺序是从左向右,对应的%x和%o表示以十六进制和八进制格式输出,把91转化成16进制是61,8进制是141;c语言中两个连续的百分号可以看成是一个整体,作用是打印出一个百分号,然后紧跟的一个d当作字符输出,如果d前面再加一个%号,答案就要选D,没有加就选C,第一题就解决了
2,printf(”%d,%0”,(a=a+l,a+b,b),a+'a'-'A',b);根据格式匹配,b不会输出,我们可以看成printf(”%d,%0”,(a=a+l,a+b,b),a+'a'-'A');首先看(a=a+l,a+b,b),这是一个逗号表达式,书上讲到,逗号表达式取最右边表达式的值,因此这个表达式的十进制数就是b,也就是20,这个要记住。然后看a+'a'-'A'这个表达式,由于a='A',所以就是'A'+'a'-'A',所以就是'a'了,a的ASCII码是97,转换成16进制就是141
3,这个其实是考察字符串以'\0'结束的问题,static char x[] ="abcde"; 表示x其实是一个字符串,要求以'\0'结束,它的长度和{'a','b','c','d','e', '\0'}; 是一样的,这下就知道选哪个答案了吧。
5,这道题实际是考察strcat函数的功能。strcat(p1,p2)实际上是把p2追加到p1的后面,所以是abcABC阿
6,这道题目实际上考察指针和数组的区别,记得在《POINTER ON C》的中文版中写道:数组具有确定数量的元素,指针只是一个标量值,只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。注意,这里说的是指针常量,不是指针变量。两外根据左值规定,常量不能做左值。看到这点,你就明白为什么会出错了,因为在6题中的a += 2,这个时候数组名a在表达式中,因此a变成了指针常量,然而a += 2试图修改一个常量的值,肯定出错。
7,看看strlen(strcpy(s1,s2)); 这条语句的功能是先将s2拷贝到s1中,然后计算字符串s1的长度。你既然选对了,我就不多说了,很简单。
9,这道题也没有什么多说的吧,pow(y,fabs(x));pow函数的原型是double pow(double x, double y);表示求x的y次方。fabs表示求一个浮点数的绝对值。实际上pow(y,fabs(x))就是pow(2.0,fabs(3.0)),也就是2.0的3.0次方,8.00000;
10,这道题你没有写清楚吧。估计就是考一个条件表达式。
11,这道题有点意思,如果是考试,我肯定也会做错,主要是设置了一个break语句的陷阱。由于x = 0;所以有限执行case O:switch(y==2)
{ case 1:printf(”*”);break; case 2:printf(”%”);break;} 这个能打印出"*"(原因: y == 2的条件为真),然后执行break语句跳出switch(y==2)这个switch语句,陷阱就在这里,case 0这条语句后面没有出现break语句,所以这个程序又会执行,case 1这个条件,然后又会根据z的值打印出"#"。 因此打印出 *# 。
12,这个不难,d = (a>b>c) ,把这条语句分解,引入一个变量x, 这条语句分解成, x = (a > b ); d = (x > c);由于a > b 成立,因此x = 1; 然而x < c; 所以d = 0;
13,这个选对了就不说了;主要是考察if语句中的条件表达式,语句要以分号结束。scanf语句需要对a加取地址符。
14, 这个对if语句一层一层的看下来就可以了。判断if(x < y) ,成立,判断if( y!=10 ), 也成立,然后判断if(!ok1) (等价于if (ok1 == 0)),由于ok1 = 5;所以表达式为假,执行else if(ok2) (等价于else if( ok2 != 0)),由于ok2 = 0, 所以不成立,继续往下走,就执行a = -1;因此结果就是-1;
终于回答完了!!!!很久没有遇到这么有意思的问题了。
G. C语言类似斐波那契数列的题
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int n,i,x,y;
double s,temp;
s=0;x=2;y=1;
scanf("%d",&n);
for(i=1;i<=n;i++){
s=s+1.0*x/y;
temp=x;//用一个临时变量存放x
x=x+y;//经历了这个过程 x不再是原来的值了 所以你写的y=x就错了
y=temp;
}
printf("%.2lf\n",s);
system("pause");
return 0;
}
H. C语言题目 帮帮忙
1.c
if(i+ +%5= =0)
if(+ +i%8= =0) printf("%d",i);
i++是先操作后自增,所以相当于i%5==0;i=i+1;
++i是先自增再操作,所以相当于i=i+1;i%8==0
所以只有32适合 32 % 8 == 0 32 - 2 % 5 ==0
2.d
int fun (double x[10],int *n)
没什么好介绍的,只要理解数组名可以当成是指向数组开始地址的指针就行了,当然跟真正的指针还有差别,就是它不能做左值
3.b
int k[2][3], *pk[3];
k是个二维整型数组,这个容易理解;pk是个一维整型指针数组,存放的内容是一个整型指针,所以B)pk[0]=&k[1][2]; 是正确的,再看其他三个:
a:A)pk=k; k是个int *[2][3]的指针而pk是int *[3]的指针,类型不匹配
c:C)pk=k[0]; 同上
d:D)pk[1]=k; pk[1]是整型指针,而k是个int *[2][3]的指针,类型不匹配
4.b 这个不用怎么解释了吧,需要注意的是int x[3][2]={0},将数组所有初始化成0,而且scanf("%d",x[i]);x[i]其实相当于&x[i][0];所以x[0][0]:2,x[1][0]:4, x[0][1]没有赋值,所以为初始化值0,所以结果是2 0 4
5.d
a:strcpy(y,x[4]); x[4]其实是并不是指针,而是指针的内容e,这里必须是char *
b:strcpy(+ +y,&x[1]); 数组y不能作为左值,这里++y相当于y=y+1,是不允许的,因为数组y可以看成是常量指针,它的指向的地址是不能修改的
c:strcpy(s=y+5,x); c虽然编译没有错误,但是复制的值不够长了,相当于s=&y[5],这样只是是5-9五个值,但是x有10个值
d:复制长度刚刚好,类型也匹配,所以d是正确的
6.c
只需要理解fseek(fp,-2L,SEEK_END); 是指从文件最后开始,到-2L(L表示-2为long类型)个字符,而c中字符串是以0结尾的,也就是字符实际上是abcd0,所以-2刚好就是指向c(下标0开始)
I. c语言字符串匹配问题
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 10240
#define WORDSIZE 256
int main()
{
int isCaseSensitive , totalInput , totalLength=0, length;
int i = 0 ;
char* line_addr, *lines_ , *line_addr_;
char lines[MAXSIZE];
char word[WORDSIZE];
lines_ = lines;
scanf("%s\n",word);//输入要查找的字符串S
scanf("%d\n",&isCaseSensitive);//是否大小写敏感
scanf("%d\n",&totalInput);//多行文字的行数
for(line_addr=lines;i<totalInput; i++){//输入多行文字
gets(line_addr);
length = strlen(line_addr);
line_addr += length + 1;
totalLength += length + 1;
}
//大小写不敏感,全部当成小写对待
if(!isCaseSensitive){
i = 0;
while(word[i]){
word[i] = tolower(word[i]);
i++;
}
lines_ = (char*)malloc(totalLength);
for(i=0 ; i< totalLength; i++){
lines_[i] = tolower(lines[i]);
}
}
i = 0;
line_addr = lines ;
line_addr_ = lines_;
while(i < totalInput){
if(strstr(line_addr_,word) != NULL){//查找是否包含了字符串S
puts(line_addr);
}
line_addr += strlen(line_addr) + 1;
line_addr_ += strlen(line_addr_) + 1;
i ++ ;
}
return 0;
}
J. c语言的括号匹配问题
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,count;
char ch[10001],ch1[10001];
while(gets(ch)!=NULL)
{
count=-1;
for(i=0;ch[i]!='