SLIDE1

Showing posts with label bai tap c. Show all posts
Showing posts with label bai tap c. Show all posts

Sunday, October 4, 2015

[c/c++] tìm từ dài nhất trong chuỗi

//code c tìm từ dài nhất trong 1 chuỗi ký tự nhập vào

#include"stdio.h"
#include"conio.h"
#include"string.h"
char *max(char *s)    
{
   char c[100], a[100];
   int i, j, k, max = 0;
   i = 0;  
   while (s[i]!='\o')//s[i] không phải là kí tự cuối cùng
   {
       j = 0; 
       if (s[i] != ' ')//nếu ký tự đang xét khác kí tự trắng
   { 
   while (s[i] != '\o')   //lặp với số lần không biết trước nên dùng while
   {//khi kí tự còn khác kí tự trắng
       if (s[i] == ' ') break;   //điều kiền để kết thúc vòng lặp while là gặp kí tự trắng
       c[j] = s[i];//dùng mảng chuổi c để lưu các kí tự thỏa và tăng i,j lên 1 đơn vị
       j++; i++;//trong vòng lặp đã có lệnh i++; rồi nên khi copy xong không cần dùng lệnh i++;
       //để thực hiện vòng lặp nữa
   } 
   c[j] = '\o';           //kí tự cuối cùng phải là kí tự kết thúc để chuổi có nghĩa
   if (max < strlen(c))  //nếu nó là chuổi dài hơn chuỗi max thì gán giá trị cho max
   {//copy chuỗi vào chuỗi a để lưu
       max = strlen(c);
       gets_s(a, c);
   }
}
else i++;  //nếu ban đầu nó là kí tự trắng thì tăng i để tiếp tục lặp
}    
   return a;
}
void main()
{
   char s[255];
   printf("nhap chuoi: "); fflush(stdin); gets_s(s);
   printf("tu dai nhat: %s\n", max(s));
}

Tuesday, June 16, 2015

Viết chương trình nhập số thực a từ bàn phím và tìm số tự nhiên n nhỏ nhất sao cho: 1 + 1/2 + 1/3 +…+ 1/n > a Với số n tìm được hãy tính tổng vế trái.

chuong trinh c:
/*
Viết chương trình nhập số thực a từ bàn phím và tìm số tự nhiên n nhỏ nhất sao cho:
1 + 1/2 + 1/3 +…+ 1/n > a Với số n tìm được hãy tính tổng vế trái.
*/
#include<stdio.h>
#include<conio.h>
int main()
{
    float a,t;
    int n,i;
    printf("a=");
    scanf("%f",&a);
    t=0;i=0;
    while(t<=a)
    {
        i++;
        t+=float(1)/float(i);
    }
    printf("N = %d\ntong vt = %f",i,t);
    getch();
    return 0;
}

Monday, June 15, 2015

[C/C++] nhập vào họ và tên, in ra tên

viết chương trình [C/C++] nhập vào họ và tên, sau đó xử lý chuỗi và in ra tên của người đó.
#include<stdio.h>
#include<string.h>
#include<conio.h>
int main()
{
    char s[100];
    printf("ho ten:");
    fflush(stdin);
    gets(s);
    char a[100];
    char c;
    int j=0;
    for(int i=strlen(s)-1;i>=0 && s[i]!=' ';i--) a[j++]=s[i];
    a[j]='\0';
    for(int i=0;i<strlen(a)/2;i++)
    {
        c=a[i];
        a[i]=a[strlen(a)-1-i];
        a[strlen(a)-1-i]=c;
    }
    printf("ten: %s",a);
    getch();
    return 0;
}

Wednesday, June 10, 2015

[C/C++] chương trình quản lý sách

Viết chương trình quản lí sách. Mỗi cuốn sách gồm tên sách, tên nhà xuất bản, năm xuất bản, giá tiền, số lượng:
a. Đưa ra danh sách các cuốn sách của nhà xuất bản Giáo dục.
b. Tính tổng số tiền sách.
c. Sắp xếp danh sách giảm theo năm xuất bản và in kết quả ra màn hình.
d. In ra màn hình các cuốn sách có giá tiền<=10.000đ và xuất bản sau năm 2006.

#include<iostream>
#include<string>
using namespace std;
struct sach
{
    string ten,nxb;
    int nam,soluong;
    long long gia;
};
void nhap(sach *l,int n)
{
    for(int i=0;i<n;i++)
    {
        cout<<"\nnhap sach thu "<<i+1<<endl;
        cout<<"ten sach:";fflush(stdin);getline(cin,l[i].ten);
        cout<<"ten nha xuat ban :";fflush(stdin);getline(cin,l[i].nxb);
        cout<<"nam :";cin>>l[i].nam;
        cout<<"so luong:";cin>>l[i].soluong;
        cout<<"gia:";cin>>l[i].gia;
    }
}
void xuatnxbgiaoduc(sach *l,int n)
{
    for(int i=0;i<n;i++)
        if(l[i].nxb=="giao duc") cout<<l[i].ten<<endl;
}
long long tongtien(sach *l,int n)
{
    long long tong=0;
    for(int i=0;i<n;i++) tong+=l[i].gia;
    return tong;
}
void sapxep(sach *l,int n)
{
    for(int i=0;i<n-1;i++)
        for(int j=i+1;j<n;j++)
            if(l[i].nam < l[j].nam) swap(l[i],l[j]);
    for(int i=0;i<n;i++) cout<<l[i].ten<<endl;
}
void xuattien10(sach *l,int n)
{
    for(int i=0;i<n;i++)
        if(l[i].nam >= 2006 && l[i].gia<=10000) cout<<l[i].ten<<endl;
}
void main()
{
    sach l[100];
    int n;
    cout<<"nhap so loai sach:";cin>>n;
    nhap(l,n);
    cout<<"\ncac loai sach nha xuat ban giao duc\n";
    xuatnxbgiaoduc(l,n);
    cout<<"\ntong so tien sach = "<<tongtien(l,n);
    cout<<"\ndanh sach giam theo nam xuat ban\n";
    sapxep(l,n);
    cout<<"\ncac sach sau 2006 va tien <=10.000\n";
    xuattien10(l,n);
    system("pause");
}

[C/C++] quản lý điểm của lớp học

Viết chương trình quản lý điểm của một lớp học gồm có các chức năng sau:
a. Nhập hồ sơ của một sinh viên gồm có: Họ và tên, năm sinh, điểm trung bình học kỳ 1 và điểm trung bình học kỳ 2.
b. In danh sách các học sinh của lớp có điểm trung bình cả năm từ 5 điểm trở lên và theo thứ tự giảm dần của điểm trung bình cả năm.
c. In danh sách các học sinh phải thi lại (điểm trung bình dưới 5).
#include<iostream>
#include<string>
using namespace std;
struct sinhvien
{
    string ten;
    int nam;
    float dtb1,dtb2;
};
void main()
{
    sinhvien list[100];
    int n;
    cout<<"\nnhap so luong sinh vien N=";cin>>n;
    for(int i=0;i<n;i++)
    {
        cout<<"\nNhap sinh vien thu "<<i+1<<endl;
        cout<<"\nho ten:";fflush(stdin);getline(cin,list[i].ten);
        cout<<"nam sinh:";cin>>list[i].nam;
        cout<<"diem trung binh hk1:";cin>>list[i].dtb1;
        cout<<"diem trung binh hk2:";cin>>list[i].dtb2;
    }
    ///sap xep giam dan
    for(int i=0;i<n-1;i++)
        for(int j=i+1;j<n;j++)
            if((list[i].dtb1+list[i].dtb2)/2 < (list[j].dtb1+list[j].dtb2)/2) swap(list[i],list[j]);
    //xuat
    cout<<"danh sach >=5\n";
    for(int i=0;i<n;i++)
        if((list[i].dtb1+list[i].dtb2)/2 >=5) cout<<list[i].ten<<endl;
    cout<<"danh sach thi lai\n";
    for(int i=0;i<n;i++)
        if((list[i].dtb1+list[i].dtb2)/2 <5) cout<<list[i].ten<<endl;
    system("pause");
}

Sunday, May 31, 2015

[C/C++] lập trình giải mã mật thư Cesar

Cho một đoạn mật thư đã được mã hóa thành những chuỗi kí tự 0,1 với mỗi 5 kí tự số sẽ tương ứng với một kí tự trong bảng chữ cái alphabel. Thứ tự bảng mã sẽ giống với bảng chữ cái alphabel (Ví dụ a=00001 thì z=11010,a=01001 thì z=00001). Độ dịch của bảng sẽ là một số ngẫu nhiên từ 1 đến 100, bạn phải tìm ra để có được bảng mã đúng
Ví dụ: với a=00001
01111011001100101101100000100100001 0100110100 sẽ được giải mã là “olympia it”

000110000110101 011000000100011 0001001111 000111000010100sẽ được giải mã là “cau lac bo cpt”
Input: file1.inp
Đoạn mật thư tối đa 100000 kí tự
Output: file1.out

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
char dich(string s,int i)
{
    if(s=="00000") return 97-i;
    if(s=="00001") return 98-i;
    if(s=="00010") return 99-i;
    if(s=="00011") return 100-i;
    if(s=="00100") return 101-i;
    if(s=="00101") return 102-i;
    if(s=="00110") return 103-i;
    if(s=="00111") return 104-i;
    if(s=="01000") return 105-i;
    if(s=="01001") return 106-i;
    if(s=="01010") return 107-i;
    if(s=="01011") return 108-i;
    if(s=="01100") return 109-i;
    if(s=="01101") return 110-i;
    if(s=="01110") return 111-i;
    if(s=="01111") return 112-i;
    if(s=="10000") return 113-i;
    if(s=="10001") return 114-i;
    if(s=="10010") return 115-i;
    if(s=="10011") return 116-i;
    if(s=="10100") return 117-i;
    if(s=="10101") return 118-i;
    if(s=="10110") return 119-i;
    if(s=="10111") return 120-i;
    if(s=="11000") return 121-i;
    if(s=="11001") return 122-i;
    if(s=="11010") return 123-i;
    if(s=="11011") return 124-i;
    if(s=="11100") return 125-i;
    if(s=="11101") return 126-i;
    if(s=="11110") return 127-i;
    if(s=="11111") return 128-i;
    return 48;
}
void main()
{
    fstream t("file1.inp",ios::in);
    fstream f("file1.out",ios::out);
    string s,c;
    char a;
    int i,j;
    for(int k=1;k<100;k++)
    {
        while(!t.eof())
        {
            getline(t,s);
            i=0;
            while(i<s.size())
            {
                c=s.substr(i,5);
                i+=5;
                a=dich(c,k);
                f<<a;
                if(s[i]==' ')
                {
                    i++;
                    f<<" ";
                }
            }
            f<<endl;
        }
        f<<endl;
        t.clear();
        t.seekg(0,ios::beg);
    }
    t.close();
    system("pause");
}

Tuesday, May 12, 2015

lập trình c++ tính giá trị biểu thức toán học

viết chương trình tính giá trị của 1 biểu thức toán học thông thường với số thực, số nguyên đều được và các phép toán cộng + trừ - nhân * chia / và dấu ngoặc. thuật toán này được thiết kế code c++ bởi Trần Khánh Toàn, cái hay của bài này là tính được cả số thực, các biểu thức nếu máy tính fx-500ms tính được thì nó tính được, riêng phần báo lỗi thì nó không có, nhập biểu thức sai cú pháp thì nó chạy sai hoặc hệ thống báo không chạy được chương trình này, không gì là hoàn hảo cả nên t sẽ cố gắng cải tiến và update lên đây để mọi người học hỏi kinh nghiệm.
#include<iostream>
#include<string>
using namespace std;
bool check(string s)
{
 for(int i=0;i<s.size();i++)
  if(s[i]=='('||s[i]==')')
   return true;
 return false;
}
string itoa(float x)
{
 string s;
 int d=0,dem=0,a;
 if(x==0) s.insert(0,"0");
 if(x<0)
 {
  d=1;
  x=-x;
 }
 while(float(x)-long(x)!=0)
 {
  dem++;
  x*=10;
 }
 long z=long(x);
 for(int i=0;i<dem;i++)
 {
  a=z%10;
  z/=10;
  switch(a)
  {
  case 0:s.insert(0,"0");break;
  case 1:s.insert(0,"1");break;
  case 2:s.insert(0,"2");break;
  case 3:s.insert(0,"3");break;
  case 4:s.insert(0,"4");break;
  case 5:s.insert(0,"5");break;
  case 6:s.insert(0,"6");break;
  case 7:s.insert(0,"7");break;
  case 8:s.insert(0,"8");break;
  case 9:s.insert(0,"9");break;
  }
 }
 if(dem>0)s.insert(0,".");
 if(z==0) s.insert(0,"0");
 while(z>0)
 {
  a=z%10;
  z/=10;
  switch(a)
  {
  case 0:s.insert(0,"0");break;
  case 1:s.insert(0,"1");break;
  case 2:s.insert(0,"2");break;
  case 3:s.insert(0,"3");break;
  case 4:s.insert(0,"4");break;
  case 5:s.insert(0,"5");break;
  case 6:s.insert(0,"6");break;
  case 7:s.insert(0,"7");break;
  case 8:s.insert(0,"8");break;
  case 9:s.insert(0,"9");break;
  }
 }
 if(d==1) s.insert(0,"-");
 else s.insert(0,"+");
 return s;
}
float lay1(string s)
{
 long d=1;
 float x=0;
 for(int i=s.size()-1;i>=0;i--)
 {
  if(s[i]=='-' || s[i]=='+' || s[i]=='*' || s[i]=='/' || s[i]=='(' || s[i]==')')
  {
   if(s[i]=='-') x=-x;
   break;
  }
  else if(s[i]=='.')
  {
   x/=d;
   d=1;
  }
  else
  {
   switch(s[i])
   {
   case '0':break;
   case '1':x+=d;break;
   case '2':x+=2*d;break;
   case '3':x+=3*d;break;
   case '4':x+=4*d;break;
   case '5':x+=5*d;break;
   case '6':x+=6*d;break;
   case '7':x+=7*d;break;
   case '8':x+=8*d;break;
   case '9':x+=9*d;break;
   }
   d*=10;
  }
 }
 return x;
}
float lay2(string s)
{
 long j=0,k=0,i;
 float d;
 float x=0;
 if(s[0]=='+' || s[0]=='-') j=1;
 for(i=j;i<s.size();i++)
 {
  if(s[i]>='0' && s[i]<='9')
  {
   switch(s[i])
   {
   case '0':x=x*10+0;break;
   case '1':x=x*10+1;break;
   case '2':x=x*10+2;break;
   case '3':x=x*10+3;break;
   case '4':x=x*10+4;break;
   case '5':x=x*10+5;break;
   case '6':x=x*10+6;break;
   case '7':x=x*10+7;break;
   case '8':x=x*10+8;break;
   case '9':x=x*10+9;break;
   }
  }
  else break;
 }
 if(i<s.size() && s[i]=='.')
 {
  d=10;
  for(j=i+1;j<s.size();j++)
  {
   if(s[j]>='0' && s[j]<='9')
   {
    switch(s[j])
    {
    case '0':x+=0/d;break;
    case '1':x+=1/d;break;
    case '2':x+=2/d;break;
    case '3':x+=3/d;break;
    case '4':x+=4/d;break;
    case '5':x+=5/d;break;
    case '6':x+=6/d;break;
    case '7':x+=7/d;break;
    case '8':x+=8/d;break;
    case '9':x+=9/d;break;
    }
    d*=10;
   }
   else break;
  }
 }
 if(s[0]=='-') x=-x;
 return x;
}
void xuly(string &s)
{
 if(s[s.size()-1]=='+'||s[s.size()-1]=='-')
 {
  s.push_back('0');
 }
 if(s[s.size()-1]=='*'||s[s.size()-1]=='/')
 {
  bool p=false;
  for(int i=s.size()-2;i>=0;i--)
   if(s[i]=='+'||s[i]=='-')
   {
    p=true;
    i++;
    s.replace(i,s.size()-i,"0");
   }
  if(p==false)
  {
   s.erase(0,s.size());
   s.insert(0,"0");
  }
 }
 for(int i=0;i<s.size()-1;i++)
  if(s[i]=='+' && s[i+1]=='+')
  {
   s.erase(i,1);
  }
  else if(s[i]=='+' && s[i+1]=='-')
  {
   s.erase(i,1);
  }
  else if(s[i]=='-' && s[i+1]=='+')
  {
   s.erase(i+1,1);
  }
  else if(s[i]=='-' && s[i+1]=='-')
  {
   s.erase(i,2);
   s.insert(i,"+");
  }
}
float tinh(string s)
{
 xuly(s);
 int p1,p2;
 string a,c;
 float x,y,t=0,p;
 while(check(s))
 {
  p2=s.find(")");
  if(p2>=0)
  {
   xuly(s);
   p1=s.rfind("(",p2);
   a=s.substr(p1+1,p2-p1-1);
   p=tinh(a);
   c=itoa(p);
   s.replace(p1,p2-p1+1,c);
   xuly(s);
  }
 }
loop:;
 for(p=0;p<s.size();p++)
  if(s[p]=='*' || s[p]=='/') break;
 if(p!=s.size())
 {
  xuly(s);
  a=s.substr(0,p);
  c=s.substr(p+1,s.size()-p-1);
  x=lay1(a);
  y=lay2(c);
  if(s[p]=='*') t=x*y;
  else t=x/y;
  for(p1=p-1;p1>=0;p1--)
   if(s[p1]=='+' || s[p1]=='-'|| s[p1]=='*'|| s[p1]=='/'|| s[p1]=='('|| s[p1]==')') break;
  if(p1==-1) p1++;
  else if(s[p1]=='*' || s[p1]=='/') p1++;
  for(p2=p+2;p2<s.size();p2++)
   if(s[p2]=='+' || s[p2]=='-'|| s[p2]=='*'|| s[p2]=='/'|| s[p2]=='('|| s[p2]==')') break;
  p2--;
  a=itoa(t);
  s.replace(p1,p2-p1+1,a);
  xuly(s);
  goto loop;
 }
 //dau +-
 else
 {
  int k;
  do{
   k=0;
   for(p=1;p<s.size();p++)
    if(s[p]=='+' || s[p]=='-') break;
   if(p<s.size())
   {
    xuly(s);
    a=s.substr(0,p);
    c=s.substr(p+1,s.size()-p-1);
    x=lay1(a);
    y=lay2(c);
    if(s[p]=='+') t=x+y;
    else t=x-y;
    a=itoa(t);
    for(p2=p+1;p2<s.size();p2++)
     if(s[p2]=='+' || s[p2]=='-') break;
    p2--;
    s.replace(0,p2+1,a);
    xuly(s);
    k=1;
   }
  }while(k);
 }
 t=lay1(s);
 return t;
}
void main()
{
 string s;
 getline(cin,s);
 cout<<s<<" = ";
 cout<<tinh(s)<<endl;
 system("pause");
}

Thursday, April 30, 2015

code c++ phần mềm split and join file part,001,002

code c++ phần mềm split and join file part,001,002

Friday, April 24, 2015

tính giá trị biểu thức toán học bất kỳ, giống máy tính casio

lập trình c/c++ tính giá trị của 1 biểu thức bất kỳ, giông máy tính casio

#include<iostream>
#include<time.h>
using namespace std;
long tinh(char *s)
{
 char a[100],dau[100],b[100],e[100];
 int i,d=0;
 for(i=0;i<strlen(s);i++) if(s[i]=='+' || s[i]=='-' || s[i]=='*' || s[i]=='/' || s[i]=='(' || s[i]==')') dau[d++]=s[i];
 if(d==0) return atol(s);
 for(i=0;i<d;i++) 
 {
  if(dau[i]!='*' && dau[i]!='/') 
  {
   int m,j;
   char c;
   for(m=0;m<strlen(s);m++)
   {
    if(s[m]=='+' || s[m]=='-' || s[m]=='('){c=s[m]; break;}
    a[m]=s[m];
   }
   a[m]='\0';
   if(c=='+' || c=='-')
   {
    int dd=0;
    for(j=m+1;j<strlen(s);j++) b[dd++]=s[j];
    b[dd]='\0';
    if(c=='+') return tinh(a)+tinh(b);
    else
    {//doi dau chuoi b
     j=0;
     while(j<strlen(b))
     {
      while(b[j]!='(' && j<strlen(b))
      {
       if(b[j]=='+') b[j]='-';
       else if(b[j]=='-') b[j]='+';
       j++;
      }
      j++;dd=1;
      while(j<strlen(b))
      {
       if(b[j]=='(') dd++;
       if(b[j]==')') dd--;
       if(dd==0) break;
       j++;
      }
      j++;
     }
     return tinh(a)-tinh(b);
    }
   }
   else if(c=='(')
   {
    char c1,c2,c3,a1[100],a2[100],a3[100],a4[100];
    int p1,p2,p3,p4,dem=1;
    p1=m;p2=p1+1;
    while(p2<strlen(s))
    {
     if(s[p2]=='(') dem++;
     else if(s[p2]==')') dem--;
     if(dem==0) break;
     p2++;
    }
    p4=0;
    for(p3=p1+1;p3<p2;p3++) a2[p4++]=s[p3];
    a2[p4]='\0';

    p1--;
    c1=s[p1];
    for(p3=0;p3<p1;p3++) a1[p3]=s[p3];
    a1[p3]='\0';

    c2=s[p2+1];
    if(c2=='*' || c2=='/')
    {
     p2+=2;
     p4=0;
     loop:;
     while(p2<strlen(s) && s[p2]!='-' && s[p2]!='+' && s[p2]!='(') a3[p4++]=s[p2++];
     if(s[p2]=='(')
     {
      p3=p2+1;
      dem=1;
      while(p3<strlen(s))
      {
       if(s[p3]=='(') dem++;
       else if(s[p3]==')') dem--;
       if(dem==0) break;
       p3++;
      }
      for(p1=p2;p1<=p3;p1++) a3[p4++]=s[p1];
      p2=p3+1;
      goto loop;
     }
     a3[p4]='\0';
     c3=s[p2];
     p2++;p4=0;
     while(p2<strlen(s)) a4[p4++]=s[p2++];
     a4[p4]='\0';
    }
    else
    {
     c3=c2;
     a3[0]='\0';
     p4=0;p2+=2;
     while(p2<strlen(s)) a4[p4++]=s[p2++];
     a4[p4]='\0';
    }
    if(c3=='-')
    {
     p4=0;
     while(p4<strlen(a4))
     {
      while(a4[p4]!='(' && p4<strlen(a4))
      {
       if(a4[p4]=='+') a4[p4]='-';
       else if(a4[p4]=='-') a4[p4]='+';
       p4++;
      }
      p4++;dem=1;
      while(p4<strlen(a4))
      {
       if(a4[p4]=='(') dem++;
       if(a4[p4]==')') dem--;
       if(dem==0) break;
       p4++;
      }
      p4++;
     }
    }
    long k=tinh(a2);
    if(strlen(a1)>0)
    {
     if(c1=='*') k=tinh(a1)*k;
     else if(c1=='/') k=tinh(a1)/k;
    }
    if(strlen(a3)>0)
    {
     if(c2=='*') k=k*tinh(a3);
     else if(c2=='/') k=k/tinh(a3);
    }
    if(strlen(a4)>0)
    {
     if(c3=='+') k=k+tinh(a4);
     else if(c3=='-') k=k-tinh(a4);
    }
    return k;
   }
  }
 }
 char c;
 for(i=0;i<strlen(s);i++)
 {
  if(s[i]=='*' || s[i]=='/') break;
  a[i]=s[i];
 }
 a[i]='\0';
 long kq=atol(a);
 c=s[i];
 i++;
 while(i<strlen(s))
 {
  d=0;
  while(s[i]!='*' && s[i]!='/' && i<strlen(s)) a[d++]=s[i++];
  a[d]='\0';
  if(c=='*') kq*=atol(a);
  else kq/=atol(a);
  c=s[i];
  i++;
 }
 return kq;
}
void xuly(char *s,int x)
{
 char a[100],b[100];
 int i,j,m;
 ltoa(x,a,10);
 if(s[0]=='x')
 {
  for(i=0;i<strlen(a);i++) b[i]=a[i];
  for(j=1;j<strlen(s);j++) b[i++]=s[j];
  b[i]='\0';
  for(i=0;i<strlen(b);i++) s[i]=b[i];
  s[i]='\0';
 }
 for(i=1;i<strlen(s);i++)
 {
  if(s[i]=='x')
  {
   if(s[i-1]>='0' && s[i-1]<='9')
   {
    for(j=0;j<i;j++) b[j]=s[j];
    b[j++]='*';
    for(m=0;m<strlen(a);m++) b[j++]=a[m];
    for(m=i+1;m<strlen(s);m++) b[j++]=s[m];
    b[j]='\0';
    for(j=0;j<strlen(b);j++) s[j]=b[j];
    s[j]='\0';
   }
   else
   {
    for(j=0;j<i;j++) b[j]=s[j];
    for(m=0;m<strlen(a);m++) b[j++]=a[m];
    for(m=i+1;m<strlen(s);m++) b[j++]=s[m];
    b[j]='\0';
    for(j=0;j<strlen(b);j++) s[j]=b[j];
    s[j]='\0';
   }
  }
 }
}
void bang(char *a,char *b)
{
 int i;
 for(i=0;i<strlen(b);i++) a[i]=b[i];
 a[i]='\0';
}
void main()
{
 FILE *t1=fopen("bai1.inp","r");
 FILE *t2=fopen("bai1.out","w");
 if(t1==NULL || t2==NULL) exit(0);
 char s[1000],a[1000];
 long n,x,gt;
 fgets(s,100,t1);
 fscanf(t1,"%ld",&n);
 for(int i=1;i<=n;i++)
 {
  bang(a,s);
  fscanf(t1,"%ld",&x);
  xuly(a,x);
  gt=tinh(a);
  fprintf(t2,"%ld ",gt);
 }
 fcloseall();
}

Sunday, April 19, 2015

[C++] điều khiển robot trong bản đồ Oxy U-D-L-R-T-B


Robot đang đứng ở vị trí 0 0 trong bản đồ. Robot có thể nhận các lệnh L: về phía bên trái, R: về bên phải, U: tiến về phía trước, D: lùi ra sau, B: quay lại vị trí trước đó (lưu ý, nếu robot đã thực hiện lênh U, R, sau đó nhận lệnh B, B thì robot sẽ thực hiện lệnh L, D, còn nếu robot chưa thực hiện lệnh nào thì lệnh B sẽ không có tác dụng) và lệnh T (turn around, lệnh này sẽ đọc thêm lệnh tiếp theo và khiến robot quay 180 độ về phía sau nếu lệnh tiếp theo là D, quay 90 độ theo kim đồng hồ nếu lệnh tiếp theo là R, quay 90 độ ngược kim đồng hồ nếu lệnh tiếp theo là L, khiến robot đứng yên không di chuyển nếu lệnh tiếp theo là B hay U.)
Ban đầu robot đang quay lên trên
Hãy tìm tọa độ của robot sau khi thực hiện xong n chuỗi lệnh. (robot sẽ vẫn giữ nguyên vị trí và hướng quay sau khi thực hiện xong 1 chuỗi lệnh)
Input
N (N<100)
N dòng, mỗi dòng là 1 chuỗi lệnh cho robot (mỗi dòng <255 kí tự)
(40% test sẽ không có lệnh T)
Output
N dòng, mỗi dòng là tọa độ robot sau khi thực hiện chuỗi lệnh của dòng tương ứng
Ví Dụ:
Input:
4
UDLRTBBBBTUTRTLTDU
UUUU
TLUUUU
BBBB
Output:
0 0
0 -4
4 -4
0 -4

#include<iostream>
using namespace std;
struct diem{int x,y,z;};
void tinh(char *s,diem &x,char *a,int &j)
{
int i=0;
while(i<strlen(s))
{
if(s[i]=='U')
{
if(x.z==0)
{
x.y++;
a[j++]=s[i++];
}
else if(x.z==1)
{
x.x++;
a[j++]=s[i++];
}
else if(x.z==2)
{
x.y--;
a[j++]=s[i++];
}
else if(x.z==3)
{
x.x--;
a[j++]=s[i++];
}
}
else if(s[i]=='D')
{
if(x.z==0)
{
x.y--;
a[j++]=s[i++];
}
else if(x.z==1)
{
x.x--;
a[j++]=s[i++];
}
else if(x.z==2)
{
x.y++;
a[j++]=s[i++];
}
else if(x.z==3)
{
x.x++;
a[j++]=s[i++];
}
}
else if(s[i]=='L')
{
if(x.z==0)
{
x.x--;
a[j++]=s[i++];
}
else if(x.z==1)
{
x.y++;
a[j++]=s[i++];
}
else if(x.z==2)
{
x.x++;
a[j++]=s[i++];
}
else if(x.z==3)
{
x.y--;
a[j++]=s[i++];
}
}
else if(s[i]=='R')
{
if(x.z==0)
{
x.x++;
a[j++]=s[i++];
}
else if(x.z==1)
{
x.y--;
a[j++]=s[i++];
}
else if(x.z==2)
{
x.x--;
a[j++]=s[i++];
}
else if(x.z==3)
{
x.y++;
a[j++]=s[i++];
}
}
else if(s[i]=='T')
{
if(s[i+1]=='B' || s[i+1]=='U') i=i+2;
else
{
i++;
if(s[i]=='L')
{
x.z--;
if(x.z==-1) x.z=3;
}
else if(s[i]=='R')
{
x.z++;
if(x.z==4) x.z=0;
}
else if(s[i]=='D') x.z=(x.z+2)%4;
i++;
}
}
else if(s[i]=='B')
{
if(j==0) i++;
else if(j>0)
{
j--;
if(a[j]=='U')
{
if(x.z==0)
{
x.y--;
i++;

}
else if(x.z==1)
{
x.x--;
i++;

}
else if(x.z==2)
{
x.y++;
i++;

}
else if(x.z==3)
{
x.x++;
i++;

}
}
else if(a[j]=='D')
{
if(x.z==0)
{
x.y++;
i++;

}
else if(x.z==1)
{
x.x++;
i++;

}
else if(x.z==2)
{
x.y--;
i++;

}
else if(x.z==3)
{
x.x--;
i++;

}
}
else if(a[j]=='L')
{
if(x.z==0)
{
x.x++;
i++;

}
else if(x.z==1)
{
x.y--;
i++;

}
else if(x.z==2)
{
x.x--;
i++;

}
else if(x.z==3)
{
x.y++;
i++;

}
}
else if(a[j]=='R')
{
if(x.z==0)
{
x.x--;
i++;

}
else if(x.z==1)
{
x.y++;
i++;

}
else if(x.z==2)
{
x.x++;
i++;

}
else if(x.z==3)
{
x.y--;
i++;
}
}
}
}
else i++;
}
}
void main()
{
FILE *t1=fopen("bai2.inp","r");
FILE *t2=fopen("bai2.out","w");
if(t1==NULL || t2==NULL) exit(0);
char s[300],a[300];
int i,n,j=0;
fgets(s,4,t1);
n=atoi(s);
diem x;
x.x=x.y=x.z=0;
for(i=0;i<n;i++)
{
fgets(s,300,t1);
tinh(s,x,a,j);
fprintf(t2,"%d %d\n",x.x,x.y);
}
fcloseall();

}

Saturday, April 4, 2015

[đệ quy c/c++] kiểm tra các phần tử của mảng

8. Sử dụng đệ quy, viết hàm kiểm tra mảng có toàn các số nguyên chia hết cho 7 hay không.


#include<iostream>
using namespace std;
int kiemtra(int a[],int n)
{
if(n==0) return 1;
if(a[n-1]%7!=0) return 0;
n--;
return kiemtra(a,n);
}
void main()
{
int a[10]={7,14,21,28,35,42,49,56,63,70},n=10;
if(kiemtra(a,n)) cout<<"ok.tat ca chia het cho 7";
else cout<<"no.khong phai tat ca chia het cho 7";
system("pause");
}

[đệ quy c/c++] đếm số phần tử phân biệt trong mảng

[đệ quy c/c++] đếm số phần tử phân biệt trong mảng

7. Sử dụng đệ quy, viết hàm đếm các giá trị phân biệt trong mảng các số nguyên. (các  giá trị trùng nhau chỉ đếm một lần).


#include<iostream>
using namespace std;
int dem(int a[],int left,int right)
{
if(left>right) return 0;
for(int i=left+1;i<=right;i++)
if(a[left]==a[i]) return dem(a,left+1,right);
return 1+dem(a,left+1,right);
}
void main()
{
int a[10]={17,14,21,28,17,42,49,56,63,17},n=10;
cout<<dem(a,0,n-1);
system("pause");
}

Friday, April 3, 2015

[đệ quy c/c++] tìm UCLN tất cả các phần tử trong mảng

[đệ quy c/c++] tìm UCLN tất cả phần tử trong mảng

Sử dụng đệ quy, viết hàm tìm UCLN của tất cả các phần tử của mảng., tìm ước chung lớn nhất của nhiều số bằng đệ quy.


#include<iostream>
using namespace std;
int UCLN(int a[],int left,int right)
{
if(left==right-1)
{
int x=a[left],y=a[right];
while(x!=y)
if(x>y)x-=y;
else y-=x;
return x;
}
int x=a[left],y=UCLN(a,left+1,right);
while(x!=y)
if(x>y)x-=y;
else y-=x;
return x;
}
void main()
{
int a[10]={6,12,18,24,30,36,42,48,54,60},n=10;
cout<<"UCLN="<<UCLN(a,0,n-1);
system("pause");
}

[Đệ Quy C++] viết hàm xuất các số nguyên tố có trong mảng

[Đệ Quy C++] viết hàm xuất các số nguyên tố có trong mảng

sử dụng đệ quy , viết hàm xuất tất cả các số nguyên tố có trong mảng ra màn hình

#include<iostream>
using namespace std;
int songuyento(int n)
{
if(n<2) return 0;
if(n==2) return 1;
for(int i=2;i<n;i++)
if(n%i==0) return 0;
return 1;
}
void xuat(int a[],int n)
{
if(n==0) return;
if(songuyento(a[n])) cout<<a[n]<<" ";
n--;
xuat(a,n);
}
void main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10},n=10;
xuat(a,n);
system("pause");
}

[Đệ Quy C/C++] tìm min và max các phần tử của mảng.

[Đệ Quy C/C++] tìm min và max các phần tử của mảng.

Sử dụng đệ quy, viết hai hàm để tìm phần tử lớn nhất và nhỏ nhất của mảng. 

#include<iostream>
using namespace std;
int min(int a[],int left,int right)
{
if(left==right) return a[left];
int m=min(a,left+1,right);
return (a[left]<m)?a[left]:m;
}
int max(int a[],int left,int right)
{
if(left==right) return a[left];
int m=max(a,left+1,right);
return (a[left]<m)?m:a[left];
}
void main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10},n=10;
int mi=min(a,0,n-1);
int ma=max(a,0,n-1);
cout<<"min="<<mi<<"\nmax="<<ma;
system("pause");
}

Tuesday, March 31, 2015

[đệ quy] viết hàm để duyệt mảng, xuất các phần tử của mảng

[đệ quy] viết hàm để duyệt mảng, xuất các phần tử của mảng ra màn hình theo thứ tự nhập.

//bai 2
#include <iostream>
using namespace std;
void xuat(int a[],int left,int right)
{
if(left>right) return;
cout<<a[left++]<<" ";// a[left++] == a[left]; va sau do left++;(viet gon)
xuat(a,left,right);// cout<<a[left++]<<" "; == printf("%d ",a[left]);left++;
}
void main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10},n=10;
xuat(a,0,n-1);
system("pause");
}

theo thứ tự ngược lại so với lúc nhập

//bai 3
#include <iostream>
using namespace std;
void xuat(int a[],int n)
{
if(n==0) return;
cout<<a[n-1]<<" ";
n--;
xuat(a,n);
}
void main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10},n=10;
xuat(a,n);
system("pause");
}

Monday, March 30, 2015

đề thi lập trình olympia IT tuần 2


TRƯỜNG ĐH CÔNG NGHỆ THÔNG TIN
CÂU LẠC BỘ LẬP TRÌNH CPT
CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập – Tự do – Hạnh phúc



TPHCM, ngày  28 tháng 03 năm 2015

Cuộc Thi Lập Trình Olympia IT
Đề Chính Thức Tuần 2
Câu 1. (6đ)
Xâu biểu thức.
Cho biểu thức có các phần tử x, các số nguyên, các dấu +, -, *, / (chia lấy phần nguyên), và (), Hãy tính giá trị của biểu thức đã cho với từng giá trị của x cho trước.
Các số trong biểu thức cũng như giá trị của x luôn < 106
Input : biểu thức và các giá trị của x (40%test sẽ không có dấu ())
Output: các giá trị của biểu thức tương ứng với x
Ví Dụ:
Input:
5x+2      // biểu thức (<255 kí tự)
3            // số giá trị của x (<100)
1 2 3      // các giá trị của x (x<1000000)
Output:
7 12 17  // các giá trị của biểu thức tương ứng với các giá trị của x
Câu 2. (7đ)
Robot đang đứng ở vị trí 0 0 trong bản đồ. Robot có thể nhận các lệnh L: về phía bên trái, R: về bên phải, U: tiến về phía trước, D: lùi ra sau, B: quay lại vị trí trước đó (lưu ý, nếu robot đã thực hiện lênh U, R, sau đó nhận lệnh B, B thì robot sẽ thực hiện lệnh L, D, còn nếu robot chưa thực hiện lệnh nào thì lệnh B sẽ không có tác dụng) và lệnh T (turn around, lệnh này sẽ đọc thêm lệnh tiếp theo và khiến robot quay 180 độ về phía sau nếu lệnh tiếp theo là D, quay 90 độ theo kim đồng hồ nếu lệnh tiếp theo là R, quay 90 độ ngược kim đồng hồ nếu lệnh tiếp theo là L, khiến robot đứng yên không di chuyển nếu lệnh tiếp theo là B hay U.)
Ban đầu robot đang quay lên trên
Hãy tìm tọa độ của robot sau khi thực hiện xong n chuỗi lệnh. (robot sẽ vẫn giữ nguyên vị trí và hướng quay sau khi thực hiện xong 1 chuỗi lệnh)
Input
N (N<100)
N dòng, mỗi dòng là 1 chuỗi lệnh cho robot (mỗi dòng <255 kí tự)
(40% test sẽ không có lệnh T)
Output
N dòng, mỗi dòng là tọa độ robot sau khi thực hiện chuỗi lệnh của dòng tương ứng
Ví Dụ:
Input:
4
UDLRTBBBBTUTRTLTDU
UUUU
TLUUUU
BBBB
Output:
0 0
0 -4
4 -4
0 -4


Câu 3.(7đ)
Một con robot đang ở trong một ma trận. bản đồ được vẽ bởi các kí tự 0, 1, 2, 3 trong đó, 0 là đường mà robot có thể đi được, 1 là tường, robot không thể vượt qua, 2 là vị trí của robot còn 3 là đích. Ngoài ra trong ma trận còn có thể có các cổng dịch chuyển được đánh số từ 4 đến 9, với cổng thứ i, robot sẽ tốn i đơn vị thời gian để dịch chuyển đến cổng tương tự, robot tốn 1 đơn vị thời gian để di chuyển từ ô hiện tại sang ô bên cạnh. Hãy tính thời gian nhanh nhất robot có thể đến được đích
Input: (40% test sẽ không có cổng dịch chuyển)
M, N : số hàng và số cột của ma trận (M,N < 250)
M dòng, mỗi dòng là 1 chuỗi biểu thị ma trận đó
Output:
Thời gian cần thiết để robot đến được đích
Ví Dụ:
Input:
10 10
1110000001
0002011101
0111010001
0400010111
0111110011
1400111011
1110000011
1110111001
1113111101
1111111101
Output:
15

Lưu ý: Tất cả các bài đều nhập xuất từ file. Các file nhập xuất đặt tên theo định dạng sau: bai1.inp, bai1.out; bai2.inp, bai2.out; bai3.inp,bai3.out.